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

Posted

技术标签:

【中文标题】如何设置自定义小部件的背景颜色和边框宽度?【英文标题】:How to set a custom widget's background color and border width? 【发布时间】:2019-02-24 20:40:38 【问题描述】:

我有一个自定义小部件,其父级是另一个自定义小部件。我可以使用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);

方法二:

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

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

我已经浏览了这个链接:How to Change the Background Color of QWidget 并合并了给定的更改,但我无法将颜色设置为childCustomWidget

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

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

【问题讨论】:

【参考方案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);
       
;

结果

正如它所写的那样,这个例子产生了以下结果:

【讨论】:

感谢@scopchanov 的回复:当我尝试示例时:它给了我“未定义的 vtable 引用”错误..所以我注释掉了 Q_OBJECT 宏,现在它只显示父小部件颜色而不是子小部件的颜色... @adi,在我的 Windows 机器上编译得很好。我也刚刚在 Ubuntu 上对其进行了测试。你添加了包含吗? @adi 当 qmake/make 在编译期间不生成 moc 文件时,您可能会在 Q_OBJECT 上出现这种 vtable 错误。这通常在使用 MSVC 时发生。在这种情况下,手动重新运行qmake(Qt Creator 上下文菜单中的Run qmake)可以解决问题。 @BenjaminT,我也先清理项目。以防万一。 感谢@scopchanov 的回答。我重新安装了qt 并尝试了你的例子。它有效!你能告诉我是否有办法使用 QPalette 本身而不是样式表来设置小部件的边框颜色?【参考方案2】:

关于调色板的 Qt 文档:警告:不要将此功能与 Qt 样式表一起使用。使用样式表时,可以使用“color”、“background-color”、“selection-color”、“selection-background-color”和“alternate-background-color”自定义小部件的调色板。

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

关于 autoFillBackground 的 Qt 文档:警告:将此属性与 Qt 样式表结合使用时要小心。当小部件的样式表具有有效的背景或边框图像时,此属性会自动禁用。

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

【讨论】:

以上是关于如何设置自定义小部件的背景颜色和边框宽度?的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义 tkinter/ttk 小部件和框架的边框颜色?

为自定义 QWidget 设置背景颜色

如何自定义twitter小部件样式?

如何在 Flutter 的主小部件中为小部件设置背景颜色?

CSS如何怎么设置div边框颜色宽度和高度

CSS如何怎么设置div边框颜色宽度和高度?