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

Posted

技术标签:

【中文标题】编辑单元格时如何在 QTableView 中使用 Enter 键导航【英文标题】:How to navigate with Enter key in QTableView when cell is being edited 【发布时间】:2021-10-10 17:33:27 【问题描述】:

我的 pyqt 布局包含几个小部件,包括 qtableviewqlineeditqpushbutton 等。我可以使用 Tab 键浏览小部件,但是我正在尝试使用 Enter 键(返回)来浏览“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() 返回False 时,它不会激活self.tableView.focusNextChild(),并且我无法使用 Enter 键进一步导航。如果我不使用if(self.tableView.hasFocus()):,它可能会导致通过其他小部件(如qlineedit)进行导航。如何使用 Enter 键在表格单元格中导航?

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

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

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

这里我对测试 1 和测试 2 很满意。但是,在测试 3 中,hasFocus() 显示False,因此当我按 Enter 键时,课程不会从编辑模式中脱离表格。然后我需要使用tab键退出编辑模式,是否可以通过按Enter键退出编辑模式

【问题讨论】:

@eyllanesc,感谢您的评论,我很难解释这个问题。基本上我需要使用Enter 键来浏览表格视图 【参考方案1】:

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

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

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

【讨论】:

谢谢,现在我可以使用 Enter 键导航了

以上是关于编辑单元格时如何在 QTableView 中使用 Enter 键导航的主要内容,如果未能解决你的问题,请参考以下文章

在 QTableView 中编辑单元格后使用 TAB 键前进时如何避免编辑模式?

编辑 QTableView 单元格时设置初始文本

QTableView 并双击一个单元格

PySide QTableView setData 用于多个单元格

如何从 QTest 单元测试中编辑 QTableView 单元格?

QTableView:如何在开始/结束编辑时做些啥?