我有一个自定义小部件,它的父部件是另一个自定义小部件。我能够使用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();
为了将背景颜色设置为自定义小部件,我引用了几个这样的帖子/答案,但我无法设置它。这就是我如何设置我的childCustomWidget
的颜色:
Approach1:
QPalette pal = childCustomWidget->palette();
QColor color = {204, 231, 47};
pal.setColor (QPalette::Background, color);
childCustomWidget->setAutoFillBackground (true);
childCustomWidget->setPalette (pal);
Approach2:
childCustomWidget->setStyleSheet ("*{border-width:" +
BorderThickness +
";border-style:solid;border-color:" +
hexColorCode + " ;color:white;}");
注意:,我已经注释掉了paintEvent
虚拟函数。
我已经通过了这个链接:如何改变QWidget的背景色,并合并了类似于给定的更改,但我无法为childCustomWidget
设置颜色。
使用上述方法的自定义小部件如下所示:
这里橙色是父母的BG颜色,我可以设置。灰色似乎是子部件的默认颜色。
发布于 2018-09-20 15:19:08
解决方案
要使Approach2工作,即为了使您的自定义小部件尊重样式表,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);
}
};
结果
在编写此示例时,将产生以下结果:
发布于 2018-09-20 07:36:50
关于调色板的Qt文档:警告:不要将此函数与Qt样式表结合使用。当使用样式表时,小部件的调色板可以使用“颜色”、“背景色”、“选择颜色”、“选择背景色”和“备用背景色”进行定制。
http://doc.qt.io/qt-5/qwidget.html#palette-prop
关于autoFillBackground:警告的Qt文档:结合Qt样式表谨慎使用此属性。当小部件具有具有有效背景或边框图像的样式表时,此属性将自动禁用。
https://stackoverflow.com/questions/52426751
复制相似问题