簡體   English   中英

如何使用Tab鍵從QTableWidget移至下一個小部件

[英]How to move from a QTableWidget to the next widget using the tab-key

我想知道當我在PyQt中按下Tab鍵時如何從表格小工具移至下一個小部件。

當前的窗口小部件序列由行編輯>組合框>表小部件>按鈕組成。 在行編輯中,當您一開始按Tab鍵時,組合框>表格窗口小部件將依次移動到。 但是,在表小部件中,反復移動到末尾,它將再次移動到表小部件的0,0行和列,而不是下一個窗口小部件(按鈕)。

我該如何解決?

有兩種主要方法可以解決此問題。

第一種也是最簡單的方法是使用setTabKeyNavigation完全禁止使用Tab鍵在單元格之間移動。 然后必須使用箭頭鍵在表中的單元格之間導航。

第二種方法是修改表的keypress事件處理,以便最后一個單元格中的Tab和第一個單元格中的Shift 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_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM