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

C++ 如何设置自定义小部件';背景颜色和边框宽度?,c++,qt,background-color,qwidget,qtstylesheets,C++,Qt,Background Color,Qwidget,Qtstylesheets,我有一个自定义小部件,其父部件是另一个自定义小部件。我可以使用qpalete设置父自定义小部件的背景色,效果很好。但是我无法使用qpalete和样式表设置子自定义小部件的边框颜色 以下是我如何设置父自定义小部件的背景颜色: QPalette pal = parentCustomWidget->palette(); QColor color = {226, 208, 208}; pal.setColor (QPalette::Background, color); parentCustomW

我有一个自定义小部件,其父部件是另一个自定义小部件。我可以使用
qpalete
设置父自定义小部件的背景色,效果很好。但是我无法使用
qpalete
样式表设置子自定义小部件的边框颜色

以下是我如何设置父自定义小部件的背景颜色:

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

我已经浏览了这个链接:并加入了一些更改,比如give,但我无法将颜色设置为
childCustomWidget

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


这里橙色是家长的背景颜色,我可以设置。灰色似乎是子窗口小部件的默认颜色。

Qt文档关于调色板:警告:不要将此功能与Qt样式表一起使用。使用样式表时,可以使用“颜色”、“背景色”、“选择色”、“选择背景色”和“备用背景色”自定义小部件的调色板

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

解决方案 为了使Approach 2起作用,即为了使自定义小部件尊重样式表,应该将属性设置为
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上测试过它。是否添加了includes?@adi当qmake/make在编译期间不生成moc文件时,Q_对象上可能会出现这种vtable错误。这通常发生在使用MSVC时。在这种情况下,手动重新运行
qmake
runqmake
,在Qt Creator的上下文菜单中)可以解决这个问题。@BenjaminT,我也会先清理项目。以防万一。谢谢@scopchanov的回答。我重新安装了qt并尝试了你的例子。它很有效!!你能告诉我是否有办法使用Qpalete本身而不是样式表来设置小部件的边框颜色吗?