Qt 如何在自定义小部件插件上使用qss
我遵循Qt文档的指南,完成了一个自定义小部件插件。现在它可以在QtDesigner中成功运行。 这就是我提到的例子: 这是一个有三只指针的时钟部件 我想通过qss改变手的颜色,就像这样:Qt 如何在自定义小部件插件上使用qss,qt,Qt,我遵循Qt文档的指南,完成了一个自定义小部件插件。现在它可以在QtDesigner中成功运行。 这就是我提到的例子: 这是一个有三只指针的时钟部件 我想通过qss改变手的颜色,就像这样: 时钟{ 时针:333333; 分针:F7F7; 二手:中交; } 我阅读了关于QStyle的文档、关于QStyleOption的文档和关于QStylePlugin的文档。但是我还没有很好地理解它们之间的关系,我也不知道应该使用什么类来解决我的问题。Qt样式表专用于绘制预定义的小部件,因为它的实现是Qt私有
时钟{
时针:333333;
分针:F7F7;
二手:中交;
}
我阅读了关于QStyle的文档、关于QStyleOption的文档和关于QStylePlugin的文档。但是我还没有很好地理解它们之间的关系,我也不知道应该使用什么类来解决我的问题。Qt样式表专用于绘制预定义的小部件,因为它的实现是Qt私有API的QStyle,因此无法预定义新的属性。但在Qt样式表属性中,有一个qproperty foo可用于这种情况,例如设置时针的颜色,为此,必须创建qproperty: 模拟时钟.h
#ifndef ANALOGCLOCK_H
#define ANALOGCLOCK_H
#include <QWidget>
#include <QtUiPlugin/QDesignerExportWidget>
class QDESIGNER_WIDGET_EXPORT AnalogClock : public QWidget
{
Q_OBJECT
Q_PROPERTY(QColor hourColor READ hourColor WRITE setHourColor)
public:
explicit AnalogClock(QWidget *parent = nullptr);
QColor hourColor() const;
void setHourColor(QColor hourColor);
protected:
void paintEvent(QPaintEvent *event) override;
private:
QColor m_hourColor;
};
#endif
注意:默认情况下,QProperty的可设计性为true,因此您也可以从属性编辑器中修改hourColor属性:
#include "analogclock.h"
#include <QMouseEvent>
#include <QPainter>
#include <QTime>
#include <QTimer>
AnalogClock::AnalogClock(QWidget *parent)
: QWidget(parent), m_hourColor(QColor(127, 0, 127))
{
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, QOverload::of(&QWidget::update));
timer->start(1000);
setWindowTitle(tr("Analog Clock"));
resize(200, 200);
}
QColor AnalogClock::hourColor() const
{
return m_hourColor;
}
void AnalogClock::setHourColor(QColor hourColor)
{
if (m_hourColor == hourColor)
return;
m_hourColor = hourColor;
update();
}
void AnalogClock::paintEvent(QPaintEvent *)
{
static const QPoint hourHand[3] = {
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -40)
};
static const QPoint minuteHand[3] = {
QPoint(7, 8),
QPoint(-7, 8),
QPoint(0, -70)
};
QColor minuteColor(0, 127, 127, 191);
int side = qMin(width(), height());
QTime time = QTime::currentTime();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.translate(width() / 2, height() / 2);
painter.scale(side / 200.0, side / 200.0);
painter.setPen(Qt::NoPen);
painter.setBrush(m_hourColor);
painter.save();
painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));
painter.drawConvexPolygon(hourHand, 3);
painter.restore();
painter.setPen(m_hourColor);
for (int i = 0; i < 12; ++i) {
painter.drawLine(88, 0, 96, 0);
painter.rotate(30.0);
}
painter.setPen(Qt::NoPen);
painter.setBrush(minuteColor);
painter.save();
painter.rotate(6.0 * (time.minute() + time.second() / 60.0));
painter.drawConvexPolygon(minuteHand, 3);
painter.restore();
painter.setPen(minuteColor);
for (int j = 0; j < 60; ++j) {
if ((j % 5) != 0)
painter.drawLine(92, 0, 96, 0);
painter.rotate(6.0);
}
}