2017-10-07 148 views
1

我有一個QT小部件,它有兩個包裝在QFrame中的列表框以及一個標籤,並放在QWidget上並排放置。我可以使用Tab鍵在它們之間移動,但我想使用左右箭頭鍵在它們之間移動。做這個的最好方式是什麼?PyQT5使用箭頭鍵在列表框之間移動焦點

我的QWidget和ListWidgets如下所示

class MainWindow(QWidget): 

    def __init__(self): 
     super().__init__() 

     self.init_ui() 

    def init_ui(self): 
     hbox = QHBoxLayout() 
     hbox.addWidget(Left()) 
     hbox.addWidget(Right()) 
     self.setLayout(hbox) 
     self.show() 


class Left(QFrame): 

    def __init__(self): 
     super().__init__() 

     self.initUI() 


    def initUI(self): 
     header = QLabel() 
     header.setText('Left') 

     l = QListWidget() 
     items = ['Item %s' % (i + 1) for i in range(10)] 
     l.addItems(items) 

     vbox = QVBoxLayout() 
     vbox.addWidget(header) 
     vbox.addWidget(l) 

     self.setLayout(vbox) 



class Right(QFrame): 

    def __init__(self): 
     super().__init__() 

     self.initUI() 

    def initUI(self): 
     header = QLabel() 
     header.setText('Right') 

     l = QListWidget() 
     items = ['Item %s' % (i + 1) for i in range(10)] 
     l.addItems(items) 

     vbox = QVBoxLayout() 
     vbox.addWidget(header) 
     vbox.addWidget(l) 

     self.setLayout(vbox) 


def main(): 
    app = QApplication(sys.argv) 
    main_window = MainWindow() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 

回答

0

您可以在列表控件安裝一個事件過濾器,然後用自己的父控件的focusNextPrevChild方法將焦點:

class MainWindow(QWidget): 
    ... 
    def init_ui(self): 
     hbox = QHBoxLayout() 
     self.left = Left() 
     self.left.installEventFilter(self) 
     hbox.addWidget(self.left) 
     self.right = Right() 
     self.right.installEventFilter(self) 
     hbox.addWidget(self.right) 
     self.setLayout(hbox) 
     self.show() 

    def eventFilter(self, source, event): 
     if (event.type() == QEvent.KeyPress and 
      (event.key() == Qt.Key_Left or event.key() == Qt.Key_Right) and 
      event.modifiers() == Qt.NoModifier and 
      (source is self.left or source is self.right)): 
      self.focusNextPrevChild(event.key() == Qt.Key_Right) 
      return True 
     return super(MainWindow, self).eventFilter(source, event)