如何将QLineEdit的只读灰显效果与无条件样式表指令结合?
如何将QLineEdit的只读灰显效果与无条件样式表指令结合?
嘿,我来帮你搞定这个问题!你遇到的核心问题是:当给QLineEdit设置自定义样式(比如边框)时,Qt会覆盖掉它默认的禁用/只读状态的灰显样式。不过别担心,只要把样式规则正确组合,就能同时保留边框效果和灰显状态。
首先得澄清一个小误区:你代码里用的是[readOnly="true"]属性选择器,但注释里提到的是setEnabled(False)(禁用状态),这两个是完全不同的状态哦!如果要针对禁用状态实现灰显,应该用:disabled伪状态选择器;如果是针对只读状态做灰显,才用[readOnly="true"]属性选择器。
接下来给你两种对应场景的解决方案:
场景1:保留边框 + 禁用状态灰显
把通用边框样式和禁用状态的样式放在同一段样式表中,Qt会自动合并这些规则:
qle.setStyleSheet(''' #qle { border:4px solid yellow; } #qle:disabled { color: #808080; background-color: #F0F0F0; } ''')
这样不管QLineEdit是启用还是禁用,黄色边框都会存在;当它被禁用时,就会自动切换成灰显效果。
场景2:保留边框 + 只读状态灰显
如果你确实是要针对只读状态做灰显,只要调整选择器即可:
qle.setStyleSheet(''' #qle { border:4px solid yellow; } #qle[readOnly="true"] { color: #808080; background-color: #F0F0F0; } ''')
记得要调用qle.setReadOnly(True)来触发这个状态,而不是setEnabled(False)哦。
完整可运行的修正代码
给你整理好的测试代码,直接运行就能看到效果:
import sys from PyQt5 import QtWidgets class Window(QtWidgets.QWidget): def __init__(self): super().__init__() self.setWindowTitle("QLE stylesheet question") self.setMinimumSize(400, 30) layout = QtWidgets.QVBoxLayout() qle = QtWidgets.QLineEdit() qle.setObjectName('qle') # 这里用禁用状态的样式规则,同时保留边框 qle.setStyleSheet(''' #qle { border:4px solid yellow; } #qle:disabled { color: #808080; background-color: #F0F0F0; } ''') qle.setEnabled(False) # 现在禁用后会正常灰显啦 layout.addWidget(qle) self.setLayout(layout) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
你之前的写法没生效,本质是混淆了readOnly和disabled两种状态——样式表针对的是只读状态,但你调用的是禁用方法,自然看不到预期效果啦!只要把选择器和对应的状态方法匹配起来,就能正常工作。
备注:内容来源于stack exchange,提问作者mike rodent
相关产品推荐
相关产品推荐

