问题描述
简单的解决方案可能是:
self.placeholder_text = "......."
...
...
#trigger the following code when enabled state of self.widget_name is changed
if(self.widget_name.isEnabled()):
self.widget_name.setPlaceholderText(self.placeholder_text)
else:
self.widget_name.setPlaceholderText("")
但是我有很多QLineEdit窗口小部件,因此我正在寻找一种解决方案来解决所有情况。
解决方法
一个简单的解决方案是遍历所有QLineEdit子级:
for lineEdit in self.findChildren(QtWidgets.QLineEdit):
if lineEdit.isEnabled():
lineEdit.setPlaceholderText(self.placeholder_text)
else:
lineEdit.setPlaceholderText("")
但这可能不是一个好方法,因为您必须不断检查所有 小部件,并且可能有些行编辑不希望这种行为。
更好的解决方案是将线编辑子类化并覆盖其changeEvent()
:
class MyLineEdit(QtWidgets.QLineEdit):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self._placeholderText = self.placeholderText()
def setPlaceholderText(self,text):
self._placeholderText = text
if self.isEnabled():
super().setPlaceholderText(text)
def changeEvent(self,event):
if event.type() == QtCore.QEvent.EnabledChange:
super().setPlaceholderText(
self._placeholderText if self.isEnabled() else '')
return super().changeEvent(event)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout(w)
checkBox = QtWidgets.QCheckBox('Toggle enabled')
layout.addWidget(checkBox)
checkBox.setChecked(True)
lineEdit = MyLineEdit(placeholderText='placeholder')
layout.addWidget(lineEdit)
checkBox.toggled.connect(lineEdit.setEnabled)
w.show()
sys.exit(app.exec_())
以上代码既适用于在添加了placeholderText
的情况下创建的行编辑(如示例中所示),也适用于Designer中使用的提升的小部件。
或者,您可以为要启用此功能的所有行编辑添加事件过滤器。
self.widget_name.installEventFilter(self)
self.some_other_widget.installEventFilter(self)
# ...
def eventFilter(self,source,event):
if (isinstance(source,QtWidgets.QLineEdit) and
event.type() == QtCore.QEvent.EnabledChange):
source.setPlaceholderText(
self.placeholder_text if source.isEnabled() else '')
return super().eventFilter(source,event)