编辑单元格时如何在 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 布局包含几个小部件,包括 qtableview
、qlineedit
、qpushbutton
等。我可以使用 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 键前进时如何避免编辑模式?
PySide QTableView setData 用于多个单元格