2 回答

TA貢獻1909條經驗 獲得超7個贊
默認情況下,掃描儀發送一個結束行(“\n”),它被翻譯成 Return 或 Enter 鍵,這默認關閉編輯器,在這種情況下必須攔截該事件,移動光標并打開編輯器:
import sys
from PyQt5 import QtCore, QtWidgets
class TableWidget(QtWidgets.QTableWidget):
def keyPressEvent(self, event):
if (
event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return)
and self.state() == QtWidgets.QAbstractItemView.EditingState
):
index = self.moveCursor(
QtWidgets.QAbstractItemView.MoveNext, QtCore.Qt.NoModifier
)
self.selectionModel().setCurrentIndex(
index, QtCore.QItemSelectionModel.ClearAndSelect
)
self.edit(index)
else:
super().keyPressEvent(event)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.tableWidget = TableWidget(4, 2)
self.setCentralWidget(self.tableWidget)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
self.tableWidget.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch
)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())

TA貢獻1799條經驗 獲得超6個贊
您可以將表子類化并覆蓋closeEditor()
:hint
參數告訴視圖當編輯器關閉時應該發生什么;默認情況下,當按下Enter當前單元格數據時提交,但您可以像這樣覆蓋此行為:
from PyQt5 import QtGui, QtWidgets
class Table(QtWidgets.QTableView):
? ? # leave to False for the default behavior (the next cell is the one at the
? ? # right of the current, or the first of the next row; when set to True it
? ? # will always go to the next row, while keeping the same column
? ? useNextRow = False
? ? def closeEditor(self, editor, hint):
? ? ? ? if hint == QtWidgets.QAbstractItemDelegate.SubmitModelCache:
? ? ? ? ? ? if self.useNextRow:
? ? ? ? ? ? ? ? super().closeEditor(editor, hint)
? ? ? ? ? ? ? ? current = self.currentIndex()
? ? ? ? ? ? ? ? newIndex = current.sibling(current.row() + 1, current.column())
? ? ? ? ? ? ? ? if newIndex.isValid():
? ? ? ? ? ? ? ? ? ? self.setCurrentIndex(newIndex)
? ? ? ? ? ? ? ? ? ? self.edit(newIndex)
? ? ? ? ? ? ? ? return
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? hint = QtWidgets.QAbstractItemDelegate.EditNextItem
? ? ? ? super().closeEditor(editor, hint)
if __name__ == '__main__':
? ? import sys
? ? app = QtWidgets.QApplication(sys.argv)
? ? test = Table()
? ? test.show()
? ? model = QtGui.QStandardItemModel(10, 5)
? ? test.setModel(model)
? ? sys.exit(app.exec_())
添加回答
舉報