【问题标题】:pyqt5: How to hide placeholder when widget is not enabled?pyqt5:未启用小部件时如何隐藏占位符?
【发布时间】:2021-02-12 23:20:52
【问题描述】:

简单的解决办法可能是:

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 小部件,所以我正在寻找解决所有情况的解决方案。

【问题讨论】:

    标签: python pyqt5 placeholder qwidget


    【解决方案1】:

    一个简单的解决方案是循环遍历所有 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-07
      • 2015-08-11
      • 2013-06-05
      • 2018-02-16
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多