我想对自定义的 QTableWidget 执行输入验证,该 QTableWidget 的 setItemDelegate 是 QStyledItemDelegate 的子类。输入验证有效,我的错误消息正确弹出,但焦点移动到下一个单元格选择(即:如果我按 TAB 它将执行我的输入验证,如果输入错误则打印一条消息,然后将焦点移动到相邻单元格)。我希望焦点保持在第一个单元格上,直到输入正确为止。
也许如果我可以编辑 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
有没有人有任何建议来实现输入验证?我在这里发现了一个类似的问题,但我无法实现它以使其正常工作。