将行编辑传递给上下文管理器以设置验证器
Passing line-edits to a contextmanager to set validators
我正在尝试将小部件列表传递到 ca ontextmanager 中,我试图在其中使用 QDoubleValidators 设置它们。
我的初始代码如下:
validator = QtGui.QDoubleValidator()
validator.setDecimals(2)
self.ui.retailPriceLineEdit.setValidator(validator)
self.ui.discountPriceLineEdit.setValidator(validator)
self.ui.onlinePriceLineEdit.setValidator(validator)
...
基本上我有很多 QLineEdits,我在其中设置了 2 位小数的输入限制。
我不太确定 contextmanager 在这种情况下是否有帮助,但我正在尝试如下操作:
class TestValidator:
def __init__(self, widgets_list=None):
self.validator = QtGui.QDoubleValidator()
self.validator.setDecimals(2)
self.widgets_list = widgets_list
print widgets_list
def __enter__(self):
for w in self.widgets_list:
w.setValidator(self.validator)
def __exit__(self):
pass
当我尝试 运行 时,它是:
self.test_validator = utils.TestValidator()
my_widgets = [self.ui.retailPriceLineEdit, self.ui.discountPriceLineEdit, self.ui.onlinePriceLineEdit]
with self.test_validator(my_widgets):
pass
我遇到了一些错误,例如:AttributeError: TestValidator instance has no __call__ method #
即便如此,将小部件传递到上下文管理器中是否是一个明智的想法?
(仅供参考,我的小部件/ui 是从 qt 设计器创建的)
上下文管理器不是这项工作的正确工具。获得行编辑列表后,您需要做的就是使用 for 循环遍历它们。生成列表的一种有效方法是使用 findChildren with a regexp。然后可以将其包装在这样的本地函数中:
def __init__(self, ...):
...
def set_validators(pattern):
widgets = self.findChidren(QtGui.QLineEdit, QtCore.QRegExp(pattern))
for widget in widgets:
validator = QtGui.QDoubleValidator()
validator.setDecimals(2)
widget.setValidator(validator)
set_validators('.*PriceLineEdit$')
set_validators('.*OtherLineEdit$')
...
或者如果您不能使用模式,您可以只传入一个小部件列表:
def set_validators(widgets):
for widget in widgets:
validator = QtGui.QDoubleValidator()
validator.setDecimals(2)
widget.setValidator(validator)
my_widgets = [self.ui.retailPriceLineEdit, self.ui.discountPriceLineEdit sellf.ui.onlinePriceLineEdit]
set_validators(my_widgets)
set_validators(other_widgets)
...
我正在尝试将小部件列表传递到 ca ontextmanager 中,我试图在其中使用 QDoubleValidators 设置它们。
我的初始代码如下:
validator = QtGui.QDoubleValidator()
validator.setDecimals(2)
self.ui.retailPriceLineEdit.setValidator(validator)
self.ui.discountPriceLineEdit.setValidator(validator)
self.ui.onlinePriceLineEdit.setValidator(validator)
...
基本上我有很多 QLineEdits,我在其中设置了 2 位小数的输入限制。
我不太确定 contextmanager 在这种情况下是否有帮助,但我正在尝试如下操作:
class TestValidator:
def __init__(self, widgets_list=None):
self.validator = QtGui.QDoubleValidator()
self.validator.setDecimals(2)
self.widgets_list = widgets_list
print widgets_list
def __enter__(self):
for w in self.widgets_list:
w.setValidator(self.validator)
def __exit__(self):
pass
当我尝试 运行 时,它是:
self.test_validator = utils.TestValidator()
my_widgets = [self.ui.retailPriceLineEdit, self.ui.discountPriceLineEdit, self.ui.onlinePriceLineEdit]
with self.test_validator(my_widgets):
pass
我遇到了一些错误,例如:AttributeError: TestValidator instance has no __call__ method #
即便如此,将小部件传递到上下文管理器中是否是一个明智的想法?
(仅供参考,我的小部件/ui 是从 qt 设计器创建的)
上下文管理器不是这项工作的正确工具。获得行编辑列表后,您需要做的就是使用 for 循环遍历它们。生成列表的一种有效方法是使用 findChildren with a regexp。然后可以将其包装在这样的本地函数中:
def __init__(self, ...):
...
def set_validators(pattern):
widgets = self.findChidren(QtGui.QLineEdit, QtCore.QRegExp(pattern))
for widget in widgets:
validator = QtGui.QDoubleValidator()
validator.setDecimals(2)
widget.setValidator(validator)
set_validators('.*PriceLineEdit$')
set_validators('.*OtherLineEdit$')
...
或者如果您不能使用模式,您可以只传入一个小部件列表:
def set_validators(widgets):
for widget in widgets:
validator = QtGui.QDoubleValidator()
validator.setDecimals(2)
widget.setValidator(validator)
my_widgets = [self.ui.retailPriceLineEdit, self.ui.discountPriceLineEdit sellf.ui.onlinePriceLineEdit]
set_validators(my_widgets)
set_validators(other_widgets)
...