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 为多个相同类型的小部件重复代码的主要内容,如果未能解决你的问题,请参考以下文章