2015-01-06 54 views
3

我在我的项目中有一个QwtPlot,我想以一种和谐的方式配置它的颜色 - 也就是说,例如,如果背景颜色是白色,轴应该是黑色的等等。现在我可以在一种“硬编码方式”:每次改变背景颜色(参考)时,我都会查看一组以前为该轴定义的颜色,并为该轴设置阵列中给定的颜色。但是这很“过时”,我想要一个更自动的方式。Qt StyleSheet系统无效QPalette;如何让他们一起工作?

寻求帮助here,Uwe告诉我使用QwtPlot::setPalette(color),它的效果很好本身。问题是QwtPlot是一系列基于QWidget的小部件的子元素,它们的颜色应该在全局样式表文件中配置,并且我注意到当这些小部件中的一个小部件的样式表被配置时,它将QwtPlot的调用作废为setPalette 。这就好像我应该在它们之间做出选择:如果我要在给定的窗口小部件中至少使用一次调用setPalette,那么它的父窗口都不应该配置为主窗口部件(本例中为QMainWindow)样式表系统。这似乎什么setPalette文档的这一部分是说:

警告:不要在使用Qt样式表一起使用这个功能(source

,但它似乎应该仅在使用setPalette的全局呼叫时才是这种情况。

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

回答

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?

+0

它似乎并不在于它的工作原理,萨科= TI刚刚发现,如果我把什么 - 甚至事不与我QwtPlot的母公司部件 - 在全球样式表,那么任何对QwtPlot调用SetPalette的使用或任何其家长小部件是无效。例如,我在全局样式表文件中放置了QLabel的样式表配置,我甚至在我的QwtPlot父Widget中调用了'setStyleSheet(“”);'即使对'setPalette'的调用失效= T有什么建议? – Momergil

+1

@Momergil我诚实的建议是不要使用调色板。该功能没有得到很好的支持。如果您必须在调色板和样式表之间进行选择,我个人总是选择样式表。在过去,我已经将'QwtPlot'子类化并在canvasBackground属性上设置了DESIGNABLE true标志,它允许您从样式表中设置它,但是也可以通过编程方式进行读写。然后,我会覆盖setCanvasBackground setter函数,根据画布笔刷的rgb或hsv为轴选择高对比度颜色。 –

相关问题