常见问题
使用QPalette
设置QPushButton的背景
,发现未生效。
Example
// 获取按钮的画刷
QPalette pal = ui->pushButton->palette();
// 使用颜色对话框选取颜色
QColor color = QColorDialog::getColor(color);
if (!color.isValid()) return;
// 设置画刷背景色,并将其应用到按钮上
pal.setBrush(QPalette::Background, color);
ui->pushButton->setPalette(pal);
这应该是新手最常见的错误用法
,然而结果并不能如愿。
其运行效果如图所示:
问题分析
- 对于QPushButton,不应使用
QPalette::Background
或QPalette::Window
来设置背景色,而要用QPalette::Button
; - 未设置按钮控件的属性样式,包括设置背景自动填充、样式扁平等。
解决方案
修改代码如下:
// 设置按钮的属性
ui->pushButton->setAutoFillBackground(true); // 背景色自动填充
ui->pushButton->setFlat(true); // 样式扁平
// 获取按钮的画刷
QPalette pal = ui->pushButton->palette();
// 使用颜色对话框选取颜色
QColor color = QColorDialog::getColor(color);
if (!color.isValid()) return;
// 设置画刷背景色,并将其应用到按钮上
pal.setBrush(QPalette::Window, color);
ui->pushButton->setPalette(pal);
运行程序,效果如下:
- setAutoFillBackground(true)
这句代码是为了防止父控件的背景色覆盖该QPushButton
的背景色
,可能会让人意外,但实际情况就是如此,一般用QPalette来设置颜色时都需要加上这句。
- setFlat(true)
这句是针对QPushButton
专门写的,在Qt帮助文档中有说明:
如果去掉
该行代码,那么就只有按钮边框会带有颜色,内部背景色不会生效
。效果如图所示:
- QPalette::Button
这句代码是针对QPushButton设置背景色
所用的画刷类型,用其他类型会导致背景色不生效
。
觉得本文章对你有帮助的,可以点赞或加关注哦!
有意见的也欢迎在文章下方留言~
一切皆有可能,愿世界更美好!