【问题标题】:PyQt5 repeat code for a number of widget of same typePyQt5 为多个相同类型的小部件重复代码
【发布时间】:2020-04-21 10:14:56
【问题描述】:

对于编程、python 和 OOP 来说真的很陌生。

在 Python3 和 PyQt5 中,我有许多对象: QLineEdit(s) 在 Designer 中定义并加载 使用 uicload,我用来获取输入,我找到了一种验证它们的方法,我的列表如下所示:

        self.validatorint = QtGui.QIntValidator()
        self.inputguiwin.annualsalaryinput.setValidator(self.validatorint)
        self.inputguiwin.annualsalaryinput.textChanged.connect(self.check_state)
        self.inputguiwin.annualsalaryinput.textChanged.emit(self.inputguiwin.annualsalaryinput.text())        
        self.inputguiwin.annualsalaryinput.textChanged.connect(self.disablepushButtonOK)

        self.validatordouble = QtGui.QDoubleValidator(0.100, 1.00, 2)
        self.inputguiwin.tosaveinput.setValidator(self.validatordouble)
        self.inputguiwin.tosaveinput.textChanged.connect(self.check_state)
        self.inputguiwin.tosaveinput.textChanged.emit(self.inputguiwin.houseinput.text())        
        self.inputguiwin.tosaveinput.textChanged.connect(self.disablepushButtonOK)

        self.validatorint = QtGui.QIntValidator()
        self.inputguiwin.houseinput.setValidator(self.validatorint)
        self.inputguiwin.houseinput.textChanged.connect(self.check_state)
        self.inputguiwin.houseinput.textChanged.emit(self.inputguiwin.houseinput.text())   
        self.inputguiwin.houseinput.textChanged.connect(self.disablepushButtonOK)

        self.inputguiwin.pushButtonOK.setEnabled(False)

self.inputguiwin.annualsalaryinput 是可能主 GUI inputguiwin 中的 QLineEdit Widget, 然后我有tosaveinput和houseinput。上面的行将输入连接到一个函数 这会在验证并重新启用我的 OK PushButton 时更改我的输入的背景颜色

考虑扩展输入的数量我想知道一种迭代 我所有 QLinesEdit 小部件的四行代码。

现在,我不太了解 Python、类、对象等。哪个是迭代我的小部件“列表”的最佳方法或方法?我的意思是有没有办法在 Python 中有一个对象列表, 在我的示例中迭代小部件的最佳方法是什么?至少那些将共享相同的 QtGui.QIntValidator() 类型?

【问题讨论】:

    标签: python-3.x loops widget pyqt5


    【解决方案1】:

    如果您想减少代码并使其更具可读性,那么您将不得不使用列表并对其进行迭代:

    for lineedit, validator in (
        (self.inputguiwin.annualsalaryinput, QtGui.QIntValidator(),),
        (self.inputguiwin.tosaveinput, QtGui.QDoubleValidator(0.100, 1.00, 2),),
        (self.inputguiwin.houseinput, QtGui.QIntValidator(),),
    ):
        lineedit.setValidator(validator)
        lineedit.textChanged.connect(self.check_state)
        lineedit.textChanged.emit(lineedit.text())
        lineedit.textChanged.connect(self.disablepushButtonOK)
    

    【讨论】:

      【解决方案2】:

      再次感谢我最终得到:

      input_list_int=[self.inputguiwin.annualsalaryinput, self.inputguiwin.houseinput]
              for i in input_list_int:
                  i_inputguiwin=i
                  self.validatorint = QtGui.QIntValidator()
                  i_inputguiwin.setValidator(self.validatorint)
                  i_inputguiwin.textChanged.connect(self.check_state)
                  i_inputguiwin.textChanged.emit(i_inputguiwin.text()) 
                  i_inputguiwin.textChanged.connect(self.disablepushButtonOK)
      
      input_list_double=[self.inputguiwin.tosaveinput]
              for i in input_list_double:
                  i_inputguiwin=i
                  self.validatordouble = QtGui.QDoubleValidator(0.100, 1.00, 2)
                  i_inputguiwin.setValidator(self.validatordouble)
                  i_inputguiwin.textChanged.connect(self.check_state)
                  i_inputguiwin.textChanged.emit(i_inputguiwin.text())  
                  i_inputguiwin.textChanged.connect(self.disablepushButtonOK)
      

      显然你的方法更好,我会尝试更多地挖掘列表

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多