PyQt5在macOS Big Sur下设置QPushButton按钮背景颜色不生效问题
问题原因
macOS 系统下 Qt 默认采用 MacStyle 原生控件渲染策略,该策略会优先调用系统原生UI组件的绘制逻辑,忽略 QPalette 中针对 QPalette.Button 等控件背景属性的设置,所以修改的调色板背景色不生效;而 Ubuntu 默认的 Qt 样式没有原生控件覆盖限制,所以调色板设置可以正常生效。
解决方案
方案1:使用 Qt 样式表(QSS)直接设置(最推荐,跨平台一致性最好)
QSS 的样式优先级高于系统原生样式和调色板设置,直接写样式即可覆盖 macOS 原生按钮的外观,代码示例:
from PyQt5 import QtWidgets as qtw from PyQt5 import QtGui as qtg app = qtw.QApplication([]) button = qtw.QPushButton('Pushbutton') # 直接用QSS设置背景和文字颜色,还可以按需加圆角、边框等样式 button.setStyleSheet(""" QPushButton { background-color: green; color: red; padding: 4px 8px; border-radius: 4px; } /* 还可以加 hover、pressed 状态的样式适配交互 */ QPushButton:pressed { background-color: darkgreen; } """) button.show() app.exec()
方案2:修改应用全局样式为跨平台统一的 Fusion 样式
如果你不想用 QSS,坚持要通过 QPalette 调色板设置样式,可以把全局应用样式改成 Fusion,该样式是 Qt 自带的跨平台统一渲染样式,不受系统原生控件逻辑限制:
from PyQt5 import QtWidgets as qtw from PyQt5 import QtGui as qtg app = qtw.QApplication([]) # 全局设置Fusion样式 app.setStyle("Fusion") button = qtw.QPushButton('Pushbutton') palette = button.palette() palette.setColor(qtg.QPalette.Button, qtg.QColor('green')) palette.setColor(qtg.QPalette.ButtonText, qtg.QColor('red')) button.setPalette(palette) button.show() app.exec()
方案3:单独关闭按钮的原生绘制属性
如果只需要改这一个按钮的样式,不想修改全局样式,也不想写全量QSS,可以单独给按钮设置属性强制关闭原生绘制,再配合调色板使用:
from PyQt5 import QtWidgets as qtw from PyQt5 import QtGui as qtg app = qtw.QApplication([]) button = qtw.QPushButton('Pushbutton') # 关闭原生绘制 button.setAttribute(qtg.Qt.WA_StyledBackground, True) palette = button.palette() palette.setColor(qtg.QPalette.Button, qtg.QColor('green')) palette.setColor(qtg.QPalette.ButtonText, qtg.QColor('red')) button.setPalette(palette) button.show() app.exec()
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

