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

标签 python pyqt pyqt5 keyboard-shortcuts qtableview

我的 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() 时,都会返回 False,这不会激活 self.tableView。 focusNextChild() 并且我无法使用 Enter 键进一步导航。如果我不使用 if(self.tableView.hasFocus()): 它可能会导致通过其他小部件(如 qlineedit)进行导航。如何使用 Enter 键浏览表格单元格?

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

enter image description here

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

测试 3:单击单元格(光标可见),按 Enter 键=> print: hasFocus False enter image description here

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

最佳答案

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

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

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

关于python - 编辑单元格时如何在 QTableView 中使用 Enter 键导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68671137/

相关文章:

python - 如何在Spyder IDE的变量资源管理器中保存变量

python - pyQT Combobox 更改后打印输出

python - 如何在PyQt5中制作多页面应用程序?

Python PyQt5 打印多色到纯文本编辑

python - 如何将位串转换为 utf-8 字符串?

python - 将列表添加到 numpy 数组

python - 如何在 FastAPI Swagger API 中按方法类型对方法进行排序?

python - 如何更改 PyQtGraph 上下文菜单字体大小?

python - 在pyqt中使用sceneEventFilter捕获悬停事件

python - 如何在另一个线程中设置 qasync 事件循环?