QPalette.ColorRole.ButtonText在按钮hover/checked状态下不更新的问题
当你通过样式表设置QPushButton的hover、checked等状态颜色时,直接调用self.palette().color()只能拿到控件的基础调色板颜色,无法获取样式表中定义的状态色——这是因为样式表的渲染规则独立于QPalette,只有未被样式表覆盖的状态(比如你测试的禁用态,若没在样式表中修改)才会使用调色板的颜色。
要正确获取当前状态下的文本颜色,需要借助QStyleOptionButton同步控件的实时状态,再从这个选项对象中提取颜色,代码修改如下:
import sys from PyQt5 import QtWidgets, QtGui class Button(QtWidgets.QPushButton): def __init__(self): super().__init__() self.setCheckable(True) # 开启选中状态 self.setStyleSheet(''' QPushButton:hover{color: red;} QPushButton:checked{color: blue;} QPushButton:disabled{color: gray;} ''') def paintEvent(self, event): super().paintEvent(event) # 初始化样式选项,同步按钮当前状态 opt = QtWidgets.QStyleOptionButton() self.initStyleOption(opt) # 获取当前状态对应的文本颜色 text_color = opt.palette.color(QtGui.QPalette.ButtonText) print(f"当前文本颜色: {text_color.name()}") if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) btn = Button() btn.setText("测试按钮") btn.show() sys.exit(app.exec_())
关键说明
initStyleOption(opt)会把按钮的实时状态(hover、checked、disabled等)全部同步到QStyleOptionButton对象中,此时opt.palette已经应用了样式表中对应状态的颜色配置。- 通过
opt.palette.color()获取的颜色,就是当前控件显示的实际文本颜色,覆盖所有状态场景。
内容的提问来源于stack exchange,提问作者user17463321
相关产品推荐
相关产品推荐

