如何设置自定义窗口小部件的背景颜色和边框宽度?

时间:2018-09-20 13:51:20

标签: c++ qt background-color qwidget qtstylesheets

我有一个自定义窗口小部件,其父级是另一个自定义窗口小部件。我可以使用QPalette设置父级自定义窗口小部件的背景颜色,并且效果很好。但是我无法同时使用QPalettestylesheet来设置子级自定义窗口小部件的边框颜色。

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

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虚拟函数。

我浏览了以下链接:How to Change the Background Color of QWidget,并进行了类似给定的更改,但我无法将颜色设置为childCustomWidget

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

this

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

2 个答案:

答案 0 :(得分:1)

解决方案

要使 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);
       }
};

结果

在撰写本文时,此示例将产生以下结果:

Window showing a colored rectangle with a border on a colored background

答案 1 :(得分:0)

有关调色板的Qt文档:警告:请勿将此功能与Qt样式表一起使用。使用样式表时,可以使用“颜色”,“背景颜色”,“选择颜色”,“选择背景颜色”和“替代背景颜色”来自定义窗口小部件的调色板。

http://doc.qt.io/qt-5/qwidget.html#palette-prop

有关autoFillBackground的Qt文档:警告:请谨慎使用此属性和Qt样式表。当小部件的样式表带有有效的背景或边框图像时,此属性将自动禁用。

http://doc.qt.io/qt-5/qwidget.html#autoFillBackground-prop