2017-10-07 21 views
1

QWidget에 레이블과 함께 QFrames로 래핑되고 두 개의 목록 상자가있는 QT 위젯이 있습니다. 탭 키를 사용하여이 둘 사이를 이동할 수 있지만 왼쪽 및 오른쪽 화살표 키를 사용하여이 둘 사이를 이동하려고합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?PyQT5 화살표 키를 사용하여 목록 상자간에 포커스 이동

내는 QWidget과 ListWidgets는 다음과 같다 당신은 목록 - 위젯에 이벤트 필터를 설치하여 초점 이동 부모 위젯의 focusNextPrevChild 방법을 사용할 수 있습니다

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

다음 :

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)