PyQt QWizard验证和按钮覆盖

时间:2015-01-01 15:08:23

标签: python qt validation pyqt pyqt4

我有一个多页QWizard,我需要对数字输入进行一些验证。多个QLineEdit小部件可以包含任何浮点类型或字符串'无'其中'无'是sqlite中REAL列的默认空值。 QValidator可以验证浮动部分,但是当你输入它时它是有效的,它不适合评估“无”和“无”。 string(例如,用户可以输入NNNooo)。对每个QLineEdit失去焦点的验证也不合适,因为用户在移动到下一页之前可能不会选择每个QLE。我能想到的是通过覆盖/拦截下一个按钮调用来验证所有字段。在QWizard页面中,我可以断开下一个按钮(不能让新的断开连接工作):

self.disconnect(self.button(QWizard.NextButton), QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('next()'))
self.button(QWizard.NextButton).clicked.connect(self.validateOnNext)

在init里面的QWizardPages我可以连接到下一个按钮(新样式):

self.parent().button(QWizard.NextButton).clicked.connect(self.nextButtonClicked) 

但断开QWizard的下一个插槽并不起作用(2种方式):

self.parent().button(QWizard.NextButton).clicked.disconnect(self.next) 

我得到一个AttributeError:' MyWizardPage'对象没有属性' next'

self.parent().disconnect(self.parent().button(QWizard.NextButton), QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('next()'))

我没有错误,但下一个按钮仍然有效

每个QWizardPage连接到' next'的问题slot是在向导启动期间执行每个页面中的init方法 - 因此当按下next时,将执行所有向导页面nextButtonClicked()方法。也许我可以禁用QWizardPage onFocus()上的所有下一个功能,实现自己的下一个功能,并为每个页面执行相同的操作,但似乎过于复杂

什么是简单的验证问题现在是信号/插槽拦截器问题。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以轻松创建自己的验证器子类,它将接受自定义值。您需要做的就是重新实现其validate方法。

以下是使用QDoubleValidator的简单示例:

from PyQt4 import QtCore, QtGui

class Validator(QtGui.QDoubleValidator):
    def validate(self, value, pos):
        text = value.strip().title()
        for null in ('None', 'Null', 'Nothing'):
            if text == null:
                return QtGui.QValidator.Acceptable, text, pos
            if null.startswith(text):
                return QtGui.QValidator.Intermediate, text, pos
        return super(Validator, self).validate(value, pos)

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.edit = QtGui.QLineEdit(self)
        self.edit.setValidator(Validator(self.edit))
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.edit)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 200, 50)
    window.show()
    sys.exit(app.exec_())