我在我的一个项目中有一个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 colorsHow do I invert a colour / color?

关于Qt StyleSheet系统使QPalette无效;如何使他们一起工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27803626/

10-12 00:31