【问题标题】:How to move from a QTableWidget to the next widget using the tab-key如何使用 tab 键从 QTableWidget 移动到下一个小部件
【发布时间】:2018-03-06 01:36:00
【问题描述】:

我想知道当我在 PyQt 中按 Tab 键时如何从一个表格小部件移动到下一个小部件。

当前小部件序列由 line-edit > combo-box > table-widget > push-button 组成。在 line-edit 中,当您在开始时按 tab 键时,combo-box > table 小部件会依次移动到。但是,在表格小部件中,反复移动到末尾,它再次移动到表格小部件的0,0 行和列,而不是下一个小部件(按钮)。

我该如何解决这个问题?

【问题讨论】:

  • 如果我的回答解决了您的问题,请将其标记为已接受(即单击对勾符号)。如果没有,请说明还需要什么。

标签: python keyboard pyqt5 qtablewidget tab-ordering


【解决方案1】:

有两种主要方法可以解决此问题。

第一种也是最简单的方法是使用setTabKeyNavigation 完全禁止使用制表键在单元格之间移动。然后必须使用箭头键在表格中的单元格之间导航。

第二种方法是修改对表格的按键事件处理,使最后一个单元格中的TabShift中的Tab第一个单元格将焦点移动到下一个/上一个小部件。

下面的演示脚本演示了这两种方法:

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_())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多