正确使用 QValidator
Proper usage of 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)
这些有什么区别吗?如果有请解释并告诉我哪一个是更好的方法。
QRegExpValidator
class 继承了 QObject
,所以它的构造函数有一个参数接受父 QObject
。 一般 设置父对象的一个原因是确保对象在超出范围时不会被垃圾回收。如果您不保留对该对象的任何其他引用,这很容易发生,并且是在 SO 上的新手问题中看到的许多问题的一个非常常见的原因。
但是,这实际上不是您的具体示例中的问题。这是因为当您将验证器传递给 setValidator()
时,行编辑会取得验证器的所有权,因此您不需要自己明确保留对它的引用。就您问题中的代码而言,是否设置父级确实没有区别。
话虽如此,至少在一种情况下,不 设置父项可能是有利的。如果您需要在运行时定期重置验证器,则可能会出现这种情况。如果你给每个新的验证器一个父验证器,当 setValidator()
被调用时旧的验证器不会被删除(因为父验证器仍然持有对它的引用)。因此,为了简化对象清理,不在这种情况下设置父对象可能更可取。
我使用验证器来过滤用户输入。通常我的验证器是这样工作的:
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)
这些有什么区别吗?如果有请解释并告诉我哪一个是更好的方法。
QRegExpValidator
class 继承了 QObject
,所以它的构造函数有一个参数接受父 QObject
。 一般 设置父对象的一个原因是确保对象在超出范围时不会被垃圾回收。如果您不保留对该对象的任何其他引用,这很容易发生,并且是在 SO 上的新手问题中看到的许多问题的一个非常常见的原因。
但是,这实际上不是您的具体示例中的问题。这是因为当您将验证器传递给 setValidator()
时,行编辑会取得验证器的所有权,因此您不需要自己明确保留对它的引用。就您问题中的代码而言,是否设置父级确实没有区别。
话虽如此,至少在一种情况下,不 设置父项可能是有利的。如果您需要在运行时定期重置验证器,则可能会出现这种情况。如果你给每个新的验证器一个父验证器,当 setValidator()
被调用时旧的验证器不会被删除(因为父验证器仍然持有对它的引用)。因此,为了简化对象清理,不在这种情况下设置父对象可能更可取。