首页 > 解决方案 > 如何设置自定义小部件的背景颜色和边框宽度?

问题描述

我有一个自定义小部件,其父级是另一个自定义小部件。我可以使用设置父自定义小部件的背景颜色,QPalette它工作正常。但我无法同时使用QPalette和设置子自定义小部件的边框颜色stylesheet

这就是我设置父自定义小部件背景颜色的方式:

QPalette pal = parentCustomWidget->palette();
QColor color = {226, 208, 208};
pal.setColor (QPalette::Background, color);
parentCustomWidget->setAutoFillBackground (true);
parentCustomWidget->setPalette (pal);
parentCustomWidget->show();

我参考了几个 SO 帖子/答案来为自定义小部件设置背景颜色,但我无法设置它。这就是我设置我childCustomWidget的颜色的方式:

方法1:

QPalette pal = childCustomWidget->palette();
QColor color = {204, 231, 47};
pal.setColor (QPalette::Background, color);
childCustomWidget->setAutoFillBackground (true);
childCustomWidget->setPalette (pal);

方法2:

childCustomWidget->setStyleSheet ("*{border-width:" +
    BorderThickness +
    ";border-style:solid;border-color:" +
    hexColorCode + " ;color:white;}");

注意:我已经注释掉了paintEvent虚函数。

我已经浏览了这个链接:如何更改 QWidget 的背景颜色并合并了给定的更改,但我无法将颜色设置为childCustomWidget.

我使用上述方法的自定义小部件如下所示:

这

这里橙色是我可以设置的父母的 BG 颜色。灰色的似乎是子小部件的默认颜色。

标签: c++qtbackground-colorqwidgetqtstylesheets

解决方案


解决方案

为了让Approach2工作,即让您的自定义小部件尊重样式表,Qt::WA_StyledBackground属性应设置为true,因为它:

指示应使用样式背景绘制小部件。

例子

这是我为您准备的一个最小示例,以演示建议的解决方案的可能实现:

class ParentWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ParentWidget(QWidget *parent = nullptr) : QWidget(parent) {}
};

class ChildWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ChildWidget(QWidget *parent = nullptr) : QWidget(parent) {}
};

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0) :
           QMainWindow(parent)
       {
           auto *pWidget = new ParentWidget(this);
           auto *l = new QVBoxLayout(pWidget);
           auto *cWidget = new ChildWidget(pWidget);
           QString BorderThickness("2");
           QString hexColorCode("#FF00FF");

           l->addWidget(cWidget);
           l->setContentsMargins(25, 25, 25, 25);

           QPalette pal(pWidget->palette());
           QColor color(226, 208, 208);
           pal.setColor (QPalette::Background, color);
           pWidget->setAutoFillBackground (true);
           pWidget->setPalette (pal);

           cWidget->setAttribute(Qt::WA_StyledBackground, true);
           cWidget->setStyleSheet("ChildWidget { border: " + BorderThickness + " solid " +
                                  hexColorCode + ";"
                                                 "background-color: rgb(204, 231, 47);"
                                                 "color: white; }");

           setCentralWidget(pWidget);
           resize (400, 400);
       }
};

结果

如其所写,此示例产生以下结果:

显示带有彩色背景边框的彩色矩形的窗口


推荐阅读