PyQt5 为多个相同类型的小部件重复代码

Posted

技术标签:

【中文标题】PyQt5 为多个相同类型的小部件重复代码【英文标题】:PyQt5 repeat code for a number of widget of same type 【发布时间】: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() 类型?

【问题讨论】:

【参考方案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)

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

【讨论】:

以上是关于PyQt5 为多个相同类型的小部件重复代码的主要内容,如果未能解决你的问题,请参考以下文章

从不同类添加的小部件内的 PyQt5 停止计时器

尽管更新了小部件,但 Pyqt5 更新的小部件未添加到布局中

如何在pyqt5中为一个小部件制作一个清晰的板子功能

如何在pyqt5 ui小部件代码中使用python脚本

PyQt5 不能在单独的 ui 文件中使用预定义的小部件

tkinter多次使用相同的小部件