在QAbstractItemDelegate / Custom QLineEdit中执行输入验证

时间:2013-07-11 09:08:55

标签: qt pyqt pyside qtablewidget qlineedit

我想在定制的QTableWidget上执行输入验证,该QTableWidget的setItemDelegate是QStyledItemDelegate的子类。输入验证工作正常,我的错误信息正确弹出,但焦点转移到下一个单元格选择(即:如果我按下TAB它将执行我的输入验证,如果输入错误则打印一个msg,然后将焦点移动到相邻的细胞)。我希望焦点保持在第一个单元格上,直到输入正确。

也许如果我可以编辑TAB遍历以便我手动控制表中的遍历(即:检查输入是否有效然后用TAB遍历)我可以实现输入验证;但是,我不知道修改表的(QTableWidget)默认TAB遍历的方法(在超类QAbstractItemView的详细描述中描述)。

以下是相关代码:

class TheEditor(QLineEdit):
    # a signal to tell the delegate when we have finished editing
    editingFinished = Signal()

    def __init__(self, parent=None):
            # Initialize the editor object
            super(TheEditor, self).__init__(parent)
            self.setAutoFillBackground(True)
            self.setValidator(QIntValidator(0,999999999, self))

    def focusOutEvent(self, event):
            # Once focus is lost, tell the delegate we're done editing
            self.editingFinished.emit()

class EditDelegate(QStyledItemDelegate):
    def __init__(self, parent=None):
            super(EditDelegate, self).__init__(parent)

    def createEditor(self, parent, option, index):
            # Creates and returns the custom editor object we will use to edit the cell
            result = index.column()
            if result==0:
                    editor = TheEditor(parent)
                    editor.editingFinished.connect(self.checkInput)
                    return editor
            else:
                    return QStyledItemDelegate.createEditor(self, parent, option, index)

    def errorMessage(self, error_message):
            newQWidget = QWidget()
            QtGui.QMessageBox.critical(newQWidget, "Invalid Entry", error_message, QtGui.QMessageBox.Retry)

    def checkInput(self):
            # ... some code here that does validation
            if result == expected: # good input!
                    self.commitData.emit(editor)
                    self.closeEditor.emit(editor, QAbstractItemDelegate.EditNextItem)
                    return True
            else: # bad input!
                    self.errorMessage("Invalid!")
                    self.closeEditor.emit(editor, QAbstractItemDelegate.NoHint)
                    return True

有没有人有任何建议来实现输入验证?我发现了一个类似的问题here,但我无法实现它以便它起作用。

1 个答案:

答案 0 :(得分:0)

如果输入错误,checkInput可能会返回False。然后使用此信息使用setCurrentIndex(index)定义模型的当前索引。