【问题标题】:Passing line-edits to a contextmanager to set validators将行编辑传递给上下文管理器以设置验证器
【发布时间】:2019-08-17 01:42:30
【问题描述】:

我正在尝试将小部件列表传递给 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 设计器创建的)

【问题讨论】:

  • self.test_validator 已经是utils.TestValidator 的一个实例。请改用with utils.TestValidator(my_widgets):。此外,在退出上下文时,您可能希望恢复行编辑的原始验证器。否则,使用上下文管理器有什么意义。
  • @Heike 您能否详细说明您提到的“恢复原始验证器”?

标签: python pyqt pyqt4 qlineedit qvalidator


【解决方案1】:

上下文管理器不是这项工作的正确工具。获得行编辑列表后,您需要做的就是使用 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)
    ...

【讨论】:

  • 感谢您的回复。问题是我还有其他一些用于字符串输入的 QLineEdits,例如。目录路径。
  • @TehKi 我添加了一个不同的解决方案,应该适合你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多