正确使用QValidator

时间:2017-12-30 14:55:22

标签: python pyqt arguments qvalidator

我使用验证器来过滤用户输入。通常,我的验证器的工作方式如下:

my_reg_ex = QRegExp("[1-9]\d{0,5}")
my_validator = QRegExpValidator(my_reg_ex, self.ui.lineEdit_test)
self.ui.lineEdit_test.setValidator(my_validator)

我在网上看了一些例子后写了这个。但我刚注意到,如果我删除第二行的最后一部分:

, self.ui.lineEdit_test

代码的工作方式完全相同。我周围有几个验证器。我想知道如果没有我提到的那部分就可以使用它。例如:

my_reg_ex = QRegExp("[1-9]\d{0,5}")
my_validator = QRegExpValidator(my_reg_ex)
self.ui.lineEdit_test.setValidator(my_validator)

这些之间有什么区别吗?如果有请解释并告诉我哪一个是更好的方式。

1 个答案:

答案 0 :(得分:1)

QRegExpValidator类继承QObject,因此其构造函数有一个带父QObject的参数。设置父级的一个通用原因是确保对象在超出范围时不会被垃圾收集。如果你没有保留对象的任何其他引用,这很容易发生,并且是SO上新手问题中出现的许多问题的常见原因。

但是,在您的具体示例中,这实际上是问题。这是因为当您将验证器传递给setValidator()时,行编辑将获得验证器的所有权,因此您无需自己明确地保留对它的引用。就你问题中的代码而言,无论你是否设置了父母,这都没有区别。

话虽如此,至少有一种情况是设置父母可能是有利的。如果您需要在运行时定期重置验证器,则可能会出现这种情况。如果您为每个新验证程序指定了父程序,则在调用setValidator()时不会删除旧验证程序(因为父程序仍将保留对它的引用)。因此,为了简化对象清理, not 在这种情况下设置父级可能是首选。