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

Mom*_*gil 5 qt stylesheet palette

我在一个项目中有一个QwtPlot,我想以一种和谐的方式配置它的颜色-例如,如果背景颜色是白色,则轴应该是黑色,等等。现在,我可以在“硬编码方式”:每次更改背景颜色(参考值)时,我都会查看该轴先前定义的颜色的数组,并在该轴上为数组设置给定的颜色。但这是“过时的”,我想采用一种更自动化的方式。

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

警告:不要在使用Qt样式表结合使用此功能(

,但似乎只有在全局调用时才应该是这种情况setPalette

所以我的问题是:有没有办法和谐地解决这个问题?还是我需要放弃该软件那部分的样式表系统,而只使用调色板?我试图以一种更加“本地化”的方式来制作样式表配置-试图对系统说“此样式表配置仅对此窗口小部件有效;不要将其永久保留给其子窗口小部件”,但没有成功。如果确实可行(因此我可能选择了错误的语法),我想知道。

Nic*_*aus 2

在样式表中,使用.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;
    }
};
Run Code Online (Sandbox Code Playgroud)

在样式表中,您可以设置画布背景

qproperty-canvasBackground: #000000;
Run Code Online (Sandbox Code Playgroud)

我认为对比色算法有点超出了这个答案的范围,但这些问题可能会有所帮助:以编程方式选择高对比度颜色如何反转颜色/颜色?