Qt StyleSheet系统使QPalette无效;如何让它们一起工作?

时间:2015-01-06 17:07:37

标签: qt stylesheet palette

我在我的一个项目中有一个QwtPlot,我想以和谐的方式配置它的颜色 - 例如,如果背景颜色是白色,轴应该是黑色等等。现在我可以这样做以"硬编码方式":每次更改背景颜色(参考)时,我会查看先前为轴定义的颜色数组,并在该数组中为该轴设置给定颜色。但这已经过时了#34;我想要一种更自动化的方式。

寻求帮助here,Uwe告诉我使用QwtPlot::setPalette(color),它本身很好用 。问题是QwtPlot是一系列基于QWidget的小部件的子代,其颜色应该在全局样式表文件中配置,我注意到当配置其中一个小部件的样式表时,它会使QwtPlot无效。拨打setPalette。就好像我应该在它们之间做出选择:如果我要在给定的小部件中至少使用一次setPalette的调用,那么它的父节点都不会直到主小部件(在我的情况下是QMainWindow) )应配置样式表系统。这似乎是关于setPalette的文档的这一部分所说的:

  

警告:不要将此功能与Qt样式表结合使用。(source

,但只有在使用setPalette的全局调用时才会出现这种情况。

所以我的问题是:有没有办法以和谐的方式解决这个问题?或者我是否需要放弃该部分软件的样式表系统而只使用调色板?我尝试将样式表配置设置为更多本地化的#34;方式 - 这是试图对系统说"此样式表配置仅对此小部件有效;不要将它永久保存到它的子小部件中,但没有成功。如果这是真的可能(因此我可能选择了错误的语法),我想知道。

1 个答案:

答案 0 :(得分:1)

在样式表中,对于不希望子类继承的样式,请使用.QWidget {...}而不是QWidget {...}。如果应用于所有QwtPlot父母,则可以再次使用setPalette

如果您尝试为同一个小部件混合样式表和调色板,那么没有什么可以保存您,样式表将始终取代它,所以要小心!

编辑:

另一个选项是子类QwtPlot并使用画布的可设计属性,允许您使用样式表来设置属性,但也可以以编程方式访问该值。

#include <QWidget>
#include <QBrush>    
#include <qwt_plot.h>

class QPlot : public QwtPlot
{
    Q_OBJECT

    Q_PROPERTY(QBrush canvasBackground READ canvasBackground 
        WRITE setCanvasBackground DESIGNABLE true)

public:

    QPlot(const QwtText &title, QWidget* parent = nullptr) : QwtPlot(title, parent);

    void setCanvasBackground(const QBrush &brush) 
    { 
        QwtPlot::setCanvasBackground(brush); 
        // set the axes color as well, maybe YIQ method?
    };
    QBrush canvasBackground() const
    {
         return QwtPlot::canvasBackground;
    }
};

然后,您可以在样式表中使用

设置画布背景
qproperty-canvasBackground: #000000;

我认为对比色算法有点超出了这个答案的范围,但这些问题可能有所帮助:Programmatically choose high-contrast colorsHow do I invert a colour / color?