我有一个自定义窗口小部件,其父级是另一个自定义窗口小部件。我可以使用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
虚拟函数。
我浏览了以下链接:How to Change the Background Color of QWidget,并进行了类似给定的更改,但我无法将颜色设置为childCustomWidget
。
使用上述方法的我的自定义小部件如下:
橙色是我可以设置的父母的BG颜色。灰色似乎是子窗口小部件的默认颜色。
答案 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);
}
};
在撰写本文时,此示例将产生以下结果:
答案 1 :(得分:0)
有关调色板的Qt文档:警告:请勿将此功能与Qt样式表一起使用。使用样式表时,可以使用“颜色”,“背景颜色”,“选择颜色”,“选择背景颜色”和“替代背景颜色”来自定义窗口小部件的调色板。
http://doc.qt.io/qt-5/qwidget.html#palette-prop
有关autoFillBackground的Qt文档:警告:请谨慎使用此属性和Qt样式表。当小部件的样式表带有有效的背景或边框图像时,此属性将自动禁用。