我的 pyqt 布局包含多个小部件,包括 qtableview
、qlineedit
、qpushbutton
等。我可以使用 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
测试 2:选择表格单元格。按 Enter 键 => 打印:hasFocus True
测试 3:单击单元格(光标可见),按 Enter 键=> print: hasFocus False
这里我对测试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/