当我在 PyQt 中按下 tab 键时,我想知道如何从一个表格小部件移动到下一个小部件。
当前的小部件序列由 line-edit > combo-box > table-widget > push-button 组成。在行编辑中,当您在开始时按 Tab 键时,组合框 > 表格小部件会依次移动到。但是,在表格小部件中,反复移动到末尾,它再次移动到表格小部件的0,0
行和列,而不是下一个小部件(按钮)。
我该如何解决?
当我在 PyQt 中按下 tab 键时,我想知道如何从一个表格小部件移动到下一个小部件。
当前的小部件序列由 line-edit > combo-box > table-widget > push-button 组成。在行编辑中,当您在开始时按 Tab 键时,组合框 > 表格小部件会依次移动到。但是,在表格小部件中,反复移动到末尾,它再次移动到表格小部件的0,0
行和列,而不是下一个小部件(按钮)。
我该如何解决?
有两种主要方法可以解决此问题。
第一种也是最简单的方法是使用setTabKeyNavigation完全禁用使用 tab 键在单元格之间移动。然后必须使用箭头键在表格中的单元格之间导航。
第二种方法是修改表格的按键事件处理,以便Tab在最后一个单元格和ShiftTab第一个单元格中将焦点移动到下一个/上一个小部件。
下面的演示脚本演示了这两种方法:
import sys
from PyQt5 import QtCore, QtWidgets
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
self.edit = QtWidgets.QLineEdit()
self.combo = QtWidgets.QComboBox()
self.table = QtWidgets.QTableWidget(3, 3)
self.button = QtWidgets.QPushButton('Disable Table Tabbing', self)
self.button.clicked.connect(self.handleButton)
layout = QtWidgets.QGridLayout(self)
layout.addWidget(self.edit, 0, 0)
layout.addWidget(self.combo, 0, 1)
layout.addWidget(self.table, 1, 0, 1, 2)
layout.addWidget(self.button, 2, 0, 1, 2)
self.table.installEventFilter(self)
self.edit.setFocus()
def handleButton(self):
if self.table.tabKeyNavigation():
self.button.setText('Enable Table Tabbing')
self.table.setTabKeyNavigation(False)
else:
self.button.setText('Disable Table Tabbing')
self.table.setTabKeyNavigation(True)
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.KeyPress and
source is self.table and source.isEnabled() and
source.tabKeyNavigation()):
index = self.table.currentIndex()
if event.key() == QtCore.Qt.Key_Backtab:
if index.row() == index.column() == 0:
QtWidgets.QAbstractScrollArea.focusNextPrevChild(
self.table, False)
return True
elif event.key() == QtCore.Qt.Key_Tab:
model = self.table.model()
if (index.row() == model.rowCount() - 1 and
index.column() == model.columnCount() - 1):
QtWidgets.QAbstractScrollArea.focusNextPrevChild(
self.table, True)
return True
return super(Window, self).eventFilter(source, event)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(600, 100, 400, 250)
window.show()
sys.exit(app.exec_())