Qt QMessageBox自定义按钮在Linux正常但树莓派上无颜色显示问题
问题原因
树莓派默认搭载的Qt桌面样式(通常是Raspberry Pi OS自带的自定义样式或LXQt配套样式)会覆盖QPalette对按钮背景色的设置,不同Linux发行版的Qt样式实现逻辑存在差异,因此会出现普通Linux环境运行正常、树莓派上按钮显示灰色的异常。
修复方案
优先推荐使用样式表设置按钮颜色,该方案不受系统样式影响,跨环境兼容性最好,直接替换原有修改QPalette的代码段即可:
// 替换原有palette相关代码 this->button(QMessageBox::Yes)->setStyleSheet(R"( QPushButton { background-color: #0d47a1; color: white; } )"); this->button(QMessageBox::No)->setStyleSheet(R"( QPushButton { background-color: #7f0000; color: white; } )");
如果需要保留QPalette的实现方式,需要先为按钮开启自动填充背景属性,避免样式忽略调色板配置,修改后的代码如下:
QPushButton *yesBtn = this->button(QMessageBox::Yes); QPushButton *noBtn = this->button(QMessageBox::No); // 开启自动填充背景 yesBtn->setAutoFillBackground(true); noBtn->setAutoFillBackground(true); QPalette okPalette = yesBtn->palette(); QPalette noPalette = noBtn->palette(); okPalette.setColor(QPalette::Button, QColor(13, 71, 161)); okPalette.setColor(QPalette::ButtonText, QColor(Qt::white)); noPalette.setColor(QPalette::Button, QColor(127, 0, 0)); noPalette.setColor(QPalette::ButtonText, QColor(Qt::white)); yesBtn->setPalette(okPalette); noBtn->setPalette(noPalette);
如果修改后仍然不生效,可以在程序入口main函数中强制指定Qt使用Fusion样式,该样式对QPalette的适配性最高:
// main.cpp 中添加 #include <QStyleFactory> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 强制使用Fusion样式 a.setStyle(QStyleFactory::create("Fusion")); // 其余原有代码 }
内容的提问来源于stack exchange,提问作者Iaggo Capitanio
相关产品推荐
相关产品推荐

