Qt 如何在自定义小部件插件上使用qss

Qt 如何在自定义小部件插件上使用qss,qt,Qt,我遵循Qt文档的指南,完成了一个自定义小部件插件。现在它可以在QtDesigner中成功运行。 这就是我提到的例子: 这是一个有三只指针的时钟部件 我想通过qss改变手的颜色,就像这样: 时钟{ 时针:333333; 分针:F7F7; 二手:中交; } 我阅读了关于QStyle的文档、关于QStyleOption的文档和关于QStylePlugin的文档。但是我还没有很好地理解它们之间的关系,我也不知道应该使用什么类来解决我的问题。Qt样式表专用于绘制预定义的小部件,因为它的实现是Qt私有

我遵循Qt文档的指南,完成了一个自定义小部件插件。现在它可以在QtDesigner中成功运行。 这就是我提到的例子:

这是一个有三只指针的时钟部件

我想通过qss改变手的颜色,就像这样:

时钟{
时针: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);
    }
}