如何设置自定义小部件的背景颜色和边框宽度?
How to set a custom widget's background color and border width?
我有一个自定义小部件,其父级是另一个自定义小部件。我可以使用 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 posts/answers 来设置自定义小部件的背景颜色,但我无法设置它。这就是我设置 childCustomWidget
颜色的方式:
方法一:
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
虚函数
我已经经历了这个 link:How to Change the Background Color of QWidget 并进行了类似给定的更改,但我无法将颜色设置为 childCustomWidget
。
我使用上述方法的自定义小部件如下所示:
这里的橙色是我可以设置的父背景颜色。灰色似乎是子部件的默认颜色。
关于调色板的 Qt 文档:警告:不要将此函数与 Qt 样式表一起使用。使用样式 sheet 时,可以使用 "color"、"background-color"、"selection-color"、"selection-background-color" 和 "alternate-background-color" 自定义小部件的调色板。
http://doc.qt.io/qt-5/qwidget.html#palette-prop
关于 autoFillBackground 的 Qt 文档:警告:将此 属性 与 Qt 样式表结合使用时要谨慎。当小部件具有带有有效背景或边框图像的样式 sheet 时,此 属性 将自动禁用。
解决方案
要让 Approach2 正常工作,即让您的自定义小部件遵循样式表,Qt::WA_StyledBackground 属性应设置为 true
,因为它:
Indicates the widget should be drawn using a styled background.
例子
这是我为您准备的一个最小示例,用于演示建议解决方案的可能实施方式:
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);
}
};
结果
如所写,此示例产生以下结果:
我有一个自定义小部件,其父级是另一个自定义小部件。我可以使用 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 posts/answers 来设置自定义小部件的背景颜色,但我无法设置它。这就是我设置 childCustomWidget
颜色的方式:
方法一:
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
虚函数
我已经经历了这个 link:How to Change the Background Color of QWidget 并进行了类似给定的更改,但我无法将颜色设置为 childCustomWidget
。
我使用上述方法的自定义小部件如下所示:
这里的橙色是我可以设置的父背景颜色。灰色似乎是子部件的默认颜色。
关于调色板的 Qt 文档:警告:不要将此函数与 Qt 样式表一起使用。使用样式 sheet 时,可以使用 "color"、"background-color"、"selection-color"、"selection-background-color" 和 "alternate-background-color" 自定义小部件的调色板。
http://doc.qt.io/qt-5/qwidget.html#palette-prop
关于 autoFillBackground 的 Qt 文档:警告:将此 属性 与 Qt 样式表结合使用时要谨慎。当小部件具有带有有效背景或边框图像的样式 sheet 时,此 属性 将自动禁用。
解决方案
要让 Approach2 正常工作,即让您的自定义小部件遵循样式表,Qt::WA_StyledBackground 属性应设置为 true
,因为它:
Indicates the widget should be drawn using a styled background.
例子
这是我为您准备的一个最小示例,用于演示建议解决方案的可能实施方式:
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);
}
};
结果
如所写,此示例产生以下结果: