2017-09-25 193 views
0

我想知道如何在PyQt中按Tab鍵時從表格小部件移動到下一個小部件。如何使用Tab鍵從QTableWidget移動到下一個小部件

當前控件序列由行編輯>組合框> table-widget>按鈕組成。在行編輯中,當您在開頭按Tab鍵時,組合框>表格窗口小部件將依次移動。然而,在table-widget中,重複移動到最後,它會再次移動到表格widget的0,0行和列,而不是移動到下一個widget(按鈕)。

我該如何解決這個問題?

+0

如果我的回答解決了你的問題,請標記爲接受的(即點擊打勾符號)。如果沒有,請解釋還需要什麼。 – ekhumoro

回答

0

有兩種主要的方法可以解決這個問題。

第一種也是最簡單的方法是使用setTabKeyNavigation來完全禁止使用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_()) 
相關問題