python - 将行编辑传递给上下文管理器以设置验证器

标签 python pyqt pyqt4 qlineedit qvalidator

我正在尝试将小部件列表传递到 ca ontextmanager,在其中我尝试使用 QDoubleValidators 设置它们。

我的初始代码如下:

validator = QtGui.QDoubleValidator()
validator.setDecimals(2)
self.ui.retailPriceLineEdit.setValidator(validator)
self.ui.discountPriceLineEdit.setValidator(validator)
self.ui.onlinePriceLineEdit.setValidator(validator)
...

基本上,我有大量的 QLineEdit,其中我设置了 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 实例没有 __call__ 方法#

即便如此,将小部件传递到上下文管理器中是否是一个明智的想法?

(仅供引用,我的小部件/ui 是由 qt 设计器创建的)

最佳答案

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

关于python - 将行编辑传递给上下文管理器以设置验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57532706/

相关文章:

python - python3.4中的QWebPage和pymongo在哪里可以找到?

python - 未在 Tornado 中设置 Content-Type header

Python:将 3 周添加到任何日期

python - Pandas - 如何获取连续负值和正值的计数

python - 使用 Opencv 检测图像中矩形的中心和角度

python - 如何以编程方式在 pyqt/matplotlib 导航中选择平移/缩放

python - 如何在 QtDesigner 中加载 QMovie?

python - PySide 中 Qt.escape 的替代品?

python - PyQt4:停止窗口获取焦点

python - 为什么 SLOT ('insertColumn()' ) 在 PyQt 绑定(bind)中失败?