编辑单元格时如何在 QTableView 中使用 Enter 键导航

How to navigate with Enter key in QTableView when cell is being edited

我的 pyqt 布局包含几个小部件,包括 qtableviewqlineeditqpushbutton 等。我可以使用 Tab 键浏览小部件,但是我正在尝试使用 Enter 键(Return) 浏览 'qtableview'.

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QStandardItemModel, QStandardItem
from PyQt5.QtWidgets import QShortcut
from PyQt5.QtGui import QKeySequence

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
     
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        # label name
        self.label_name = QtWidgets.QLabel(self.centralwidget)
        self.label_name.setText( "Name")
        self.verticalLayout.addWidget(self.label_name)
        # line edit
        self.lineEdit_name = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_name.setObjectName("lineEdit_name")
        self.verticalLayout.addWidget(self.lineEdit_name)
       
        #tableview
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        # create tablemodel
        self.table_model = QStandardItemModel()
        self.table_model.setHorizontalHeaderLabels( ["Item", "Unit", "unitPrice", "Unit*unitPrice"])
        self.table_model.insertRow(0)
        self.tableView.setModel(self.table_model)
        # keyboard shortcut activation
        self.shortcut = QShortcut(QKeySequence("Return"), MainWindow)
        self.shortcut.activated.connect(self.on_enter)

        
        self.verticalLayout.addWidget(self.tableView)
        MainWindow.setCentralWidget(self.centralwidget)

    def on_enter(self):
        print('hasFocus '+ str(self.tableView.hasFocus()))
        if(self.tableView.hasFocus()):
            self.tableView.focusNextChild()

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
使用

tableview.hasFocus(),以检查焦点是否在 tableview 上。我在这里面临的问题是,当我单击任何单元格 self.tableView.hasFocus() return False 时,它不会激活 self.tableView.focusNextChild() 并且我无法使用 Enter 键进一步导航。如果我不使用 if(self.tableView.hasFocus()):,它可能会导致通过 qlineedit 等其他小部件进行导航。如何使用 Enter 键在我的 table 单元格中导航?

测试 1:lineEdit 上的光标,按键盘上的 Enter => 打印:hasFocus False

测试 2:选择了 table 单元格。按 Enter 键 => 打印:hasFocus True

测试 3:单击单元格(光标可见),按 Enter 键 => 打印:hasFocus False

这里我对测试一和测试二很满意。但是,在测试 3 中 hasFocus() 显示 False,因此当我按 Enter 键时,courser 不会从编辑模式中退出 table。然后我需要使用Tab键退出编辑模式,是否可以通过按回车键退出编辑模式

编辑单元格时,会显示一个单独的编辑小部件,它会获取键盘焦点。您的示例可以通过测试此小部件是否打开来修复:

def on_enter(self):
    if (self.tableView.hasFocus() or
        self.tableView.isPersistentEditorOpen(self.tableView.currentIndex())):
        self.tableView.focusNextChild()

(注意:isPersistentEditorOpen 要求 Qt >= 5.10)