我在我的一个项目中有一个QwtPlot,我想以一种和谐的方式配置其颜色-例如,如果背景颜色为白色,则轴应为黑色,等等。现在,我可以在“硬编码方式”:每次更改背景色(引用值)时,我都会查看该轴先前定义的颜色的数组,并在该轴上为数组设置给定的颜色。但这是“过时的”,我想采用一种更自动化的方式。
寻求帮助here,Uwe告诉我使用QwtPlot::setPalette(color)
,它本身可以很好地工作。问题是QwtPlot是一系列基于QWidget的小部件的子级,其颜色应在全局样式表文件中配置,我注意到当配置了其中一个小部件的样式表时,它会使QwtPlot对setPalette
的调用无效。好像我应该在它们之间进行选择:如果我要在给定的小部件中至少使用一次对setPalette
的调用,则直到主小部件(在我的情况下为QMainWindow)之前,其父级都不应该配置为样式表系统。这似乎是关于setPalette
的文档的这一部分所说的:
,但似乎只有在对setPalette
进行全局调用时才应该是这种情况。
所以我的问题是:有没有办法以和谐的方式解决这个问题?还是我需要放弃该软件那部分的样式表系统,而只使用调色板?我试图以一种更加“本地化”的方式来制作样式表配置-试图对系统说“此样式表配置仅对此小部件有效;不要将其永久保留给其子小部件”,但没有成功。如果这确实可行(因此我可能选择了错误的语法),我想知道。
最佳答案
在样式表中,对于不希望子类继承的样式,请使用.QWidget {...}
而不是QWidget {...}
。如果应用于所有QwtPlot
父级,这将允许您再次使用setPalette
。
但是,如果您尝试将同一样式的样式表和调色板混合在一起,那么什么也无法挽救您,样式表将始终取代它,所以请当心!
编辑:
另一个选择是子类QwtPlot
并为 Canvas 使用可设计的属性,从而允许您使用样式表来设置属性,但还可以通过编程方式访问该值。
#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;
}
};
在样式表中,您可以设置 Canvas 背景为
qproperty-canvasBackground: #000000;
我认为对比颜色算法对此答案有点超出范围,但是这些问题可能会有所帮助:Programmatically choose high-contrast colors,How do I invert a colour / color?
关于Qt StyleSheet系统使QPalette无效;如何使他们一起工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27803626/