【问题标题】:Qt StyleSheet system is invalidating QPalette; how to make them work together?Qt StyleSheet 系统使 QPalette 无效;如何让它们一起工作?
【发布时间】:2015-03-04 09:55:00
【问题描述】:

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

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

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

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

所以我的问题是:有没有办法以和谐的方式解决这个问题?或者我是否需要放弃该部分软件的样式表系统而只使用调色板?我试图以更“本地化”的方式制作样式表配置 - 即试图对系统说“此样式表配置仅对此小部件有效;不要将其延续到其子小部件”,但没有成功。如果这真的可行(因此我可能选择了错误的语法),我想知道。

【问题讨论】:

    标签: qt stylesheet palette


    【解决方案1】:

    在您的样式表中,对于您不希望子类继承的样式,请使用.QWidget {...} 而不是QWidget {...}。如果应用于所有QwtPlotparents,这将允许您再次使用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?

    【讨论】:

    • 它似乎不起作用,Nicolas =TI 刚刚发现,如果我在全局样式表中放置任何东西——即使是与我的 QwtPlot 的父小部件无关的东西,那么任何使用 setPalette 的 QwtPlot或其任何父小部件无效。例如,我将 QLabels 的样式表配置放在全局样式表文件中,我什至在 QwtPlot 父窗口小部件中调用了 setStyleSheet("");,即使如此,对 setPalette 的调用也无效 =T 有什么建议吗?
    • @Momergil 我的诚实建议是不要使用调色板。该功能没有得到很好的支持。如果您必须在调色板和样式表之间进行选择,我个人总是会选择样式表。在过去,我将QwtPlot 子类化并在canvasBackground 属性上设置了DESIGNABLE true 标志,这允许您从样式表中设置它,但也可以通过编程方式对其进行读写。然后,我将覆盖 setCanvasBackground 设置器函数,以根据画布画笔的 rgb 或 hsv 为轴选择高对比度颜色。
    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多