我在我的一个项目中有一个QwtPlot,我想以和谐的方式配置它的颜色 - 例如,如果背景颜色是白色,轴应该是黑色等等。现在我可以这样做以"硬编码方式":每次更改背景颜色(参考)时,我会查看先前为轴定义的颜色数组,并在该数组中为该轴设置给定颜色。但这已经过时了#34;我想要一种更自动化的方式。
寻求帮助here,Uwe告诉我使用QwtPlot::setPalette(color)
,它本身很好用 。问题是QwtPlot是一系列基于QWidget的小部件的子代,其颜色应该在全局样式表文件中配置,我注意到当配置其中一个小部件的样式表时,它会使QwtPlot无效。拨打setPalette
。就好像我应该在它们之间做出选择:如果我要在给定的小部件中至少使用一次setPalette
的调用,那么它的父节点都不会直到主小部件(在我的情况下是QMainWindow) )应配置样式表系统。这似乎是关于setPalette
的文档的这一部分所说的:
警告:不要将此功能与Qt样式表结合使用。(source)
,但只有在使用setPalette
的全局调用时才会出现这种情况。
所以我的问题是:有没有办法以和谐的方式解决这个问题?或者我是否需要放弃该部分软件的样式表系统而只使用调色板?我尝试将样式表配置设置为更多本地化的#34;方式 - 这是试图对系统说"此样式表配置仅对此小部件有效;不要将它永久保存到它的子小部件中,但没有成功。如果这是真的可能(因此我可能选择了错误的语法),我想知道。
答案 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 colors,How do I invert a colour / color?