PyQT5使用箭头键在列表框之间移动焦点

时间:2017-10-07 17:38:02

标签: python focus pyqt5 keypress

我有一个QT小部件,它有两个列在QFrames中的列表框以及一个标签并放在QWidget上并排放置。我可以使用tab键在它们之间移动,但我想使用左右箭头键在它们之间移动。这样做的最佳方式是什么?

我的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()

1 个答案:

答案 0 :(得分:0)

您可以在list-widgets上安装事件过滤器,然后使用其父窗口小部件的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)