Qt StyleSheet系统正在使QPalette失效;如何让它们共同工作?

6
在我的一个项目中,我使用了一个QwtPlot,在其中我想以和谐的方式配置它的颜色 - 即,例如,如果背景颜色是白色,则轴应该是黑色等。现在,我可以通过“硬编码”的方法来实现这一点:每次更改背景颜色(参考值)时,我查看之前定义的轴颜色数组,并为该轴设置数组中给定的颜色。但这种方法已经过时了,我希望有更自动化的方式。
这里寻求帮助时,Uwe告诉我要使用QwtPlot::setPalette(color),它本身效果很好。但问题是,QwtPlot是一系列基于QWidget的小部件的子级,这些小部件的颜色应在全局样式表文件中配置,我注意到当为这些小部件中的一个配置样式表时,它会使QwtPlot的setPalette调用无效。就好像我应该在它们之间进行选择:如果我要在给定的小部件中使用至少一个setPalette调用,则直到主窗口小部件(在我的情况下是QMainWindow)都不应该使用样式表系统进行配置。这似乎是有关setPalette的文档的这部分所说的:

警告:不要将此函数与Qt样式表一起使用。(source)

但似乎这只是当使用全局调用setPalette时才应该出现的情况。
因此,我的问题是:是否有一种和谐的方式来解决这个问题?还是我需要放弃样式表系统的那部分软件,改为只使用调色板?我试图以更“本地化”的方式进行样式表配置 - 即尝试告诉系统“此样式表配置仅对此小部件有效;请不要将其延续到其子小部件”,但没有成功。如果这确实是可能的(因此我很可能选择了错误的语法),我想知道。
1个回答

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;
    }
};

在您的样式表中,您可以使用以下方式设置画布背景:
qproperty-canvasBackground: #000000;

这里的对比度颜色算法可能有些超出了本回答的范围,但以下问题可能会有所帮助:编程方式选择高对比度颜色, 如何反转颜色?

似乎它不起作用,Nicolas =T 我刚刚发现,如果我在全局样式表中放置任何东西 - 即使与我的 QwtPlot 的父部件无关 - 那么对于 QwtPlot 或其任何父部件的 setPalette 的任何使用都将失效。例如,我在全局样式表文件中放置了一个 QLabels 的样式表配置,甚至在我的 QwtPlot 父部件中调用了 setStyleSheet("");,即使如此,对 setPalette 的调用也被失效了 =T 有什么建议吗? - Momergil
1
@Momergil 我的真诚建议是不要使用调色板。该功能支持不够好。如果你必须在调色板和样式表之间选择,我个人总是会选择样式表。过去,我曾子类化QwtPlot并将DESIGNABLE true标志设置为canvasBackground属性,这允许您从样式表中设置它,但也可以通过编程方式读取和写入它。然后,我会重写setCanvasBackground setter函数,根据画布刷子的rgb或hsv选择高对比度颜色来选择轴。 - Nicolas Holthaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接