pyqt5:未启用小部件时如何隐藏占位符?

问题描述

简单的解决方案可能是:

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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...