Qt为所有对象设置样式,但只有一个

时间:2017-06-28 18:01:18

标签: c++ css qt

我目前所有按钮都有这种风格:

this->setStyleSheet(".QPushButton { background-color: #416eb6; color: #ddd; }");

这很棒,因为它允许我为所有QPushButton保持一个恒定的样式,而不必单独设置样式。

当我需要设置代表颜色选择器的QPushButton样式时,会出现问题。该按钮应代表从颜色选择器中选择的颜色,但它只保留我设置的初始样式。

我尝试过的事情:

为该项目提供空样式表:

this->setStyleSheet(#m_colorChooserButton { });

将样式设置为初始值:

this->setStyleSheet(#m_colorChooserButton { background-color: initial});

使用类似的css选择器:not

this->setStyleSheet(".QPushButton:not(#m_colorChooserButton) { background-color: #416eb6; color: #ddd; }");

有没有办法达到这个结果?

如果可能的话,我想模仿:not选择器,因为这是最直接的,但此时,我会做任何有效的事情。

我想避免必须手动指定我希望它显示的每个按钮的样式,因为有超过100个按钮并且找到这些按钮的对象名称是非常时间消费(大型遗留代码库)。

由于

1 个答案:

答案 0 :(得分:0)

您有两个选择:将样式表应用于该按钮,并在每次更改所选颜色时使其无效/重新应用,或者只是将该按钮子类化并重新实现该痛苦事件:

class ColorButton : public QPushButton{
Q_OBJECT
Q_DISABLE_COPY(ColorButton)
public:
    ColorButton(QWidget* parent = Q_NULLPTR)
        :QPushButton(parent)
        ,m_color(Qt::red)
    {}
    const QColor& color() const {return m_color;}
    void setColor(const QColor& val){if(m_color==val) return; m_color=val; update();}
protected:
    void paintEvent(QPaintEvent *)
    {
        QStylePainter p(this);
        QStyleOptionButton option;
        initStyleOption(&option);
        option.palette.setColor(m_color,QPalette::Background);
        p.drawControl(QStyle::CE_PushButton, option);
    }
private:
    QColor m_color;
};

P.S。 KDE API已经有了这个小部件:https://api.kde.org/frameworks-api/frameworks-apidocs/frameworks/kwidgetsaddons/html/classKColorButton.html