将lineedits传递给contextmanager以设置验证程序

2024-10-01 02:40:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个小部件列表传递到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 #

即便如此,将小部件传递到contextmanager中是否明智

(仅供参考,我的widgets/ui是从qt设计器创建的)


Tags: selfui部件defwidgetsvalidatorlistqtgui
1条回答
网友
1楼 · 发布于 2024-10-01 02:40:07

上下文管理器不是此作业的合适工具。一旦有了行编辑列表,您所需要做的就是使用for循环对它们进行迭代。生成列表的有效方法是将findChildrenregexp一起使用。然后可以将其封装在如下的本地函数中:

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)
    ...

相关问题 更多 >