Как сделать синхронизированную полосу прокрутки в QListWidget в PyQt4 - PullRequest
0 голосов
/ 11 июня 2018

У меня есть два виджета списка, и я хочу синхронизировать полосу прокрутки двух списков.Я новичок в PyQt4, поэтому я не знаю, как это сделать.

Мой код указан ниже

Код:

from PyQt4 import QtGui,QtCore
import sys


def window():
    app = QtGui.QApplication(sys.argv)
    win = QtGui.QWidget()
    main_horizontal = QtGui.QHBoxLayout()
    verti_1 = QtGui.QVBoxLayout()
    verti_2 = QtGui.QVBoxLayout()
    list1 = QtGui.QListWidget()
    for i in range(20):
        list1.addItem(str(i))

    list2 = QtGui.QListWidget()
    for i in range(20):
        list2.addItem("name" + str(i))

    verti_1.addWidget(list1)
    verti_2.addWidget(list2)

    main_horizontal.addLayout(verti_1)
    main_horizontal.addLayout(verti_2)
    win.setLayout(main_horizontal)
    win.resize(400,200)
    win.show()
    sys.exit(app.exec_())



if __name__ == "__main__":
    window()

ВЫХОД: enter image description here

Ожидаемый вывод

Я хочу синхронизировать эти две полосы прокрутки

1 Ответ

0 голосов
/ 11 июня 2018

Решение состоит в том, чтобы подключить сигнал valueChanged verticalScrollBar() к слоту, в котором перемещается другой verticalScrollBar(), но это может создать бесконечный цикл, поэтому во избежание этого вы должны использовать blockSignals(), как показано ниже:

import sys

from functools import partial

from PyQt4 import QtGui,QtCore


def move_scrollbar(vs, value):
    vs.blockSignals(True)
    vs.setValue(value)
    vs.blockSignals(False)

def window():
    app = QtGui.QApplication(sys.argv)
    win = QtGui.QWidget()
    main_horizontal = QtGui.QHBoxLayout()
    verti_1 = QtGui.QVBoxLayout()
    verti_2 = QtGui.QVBoxLayout()
    list1 = QtGui.QListWidget()
    for i in range(20):
        list1.addItem(str(i))

    list2 = QtGui.QListWidget()
    for i in range(20):
        list2.addItem("name" + str(i))

    verti_1.addWidget(list1)
    verti_2.addWidget(list2)

    vs1 = list1.verticalScrollBar()
    vs2 = list2.verticalScrollBar()

    vs1.valueChanged.connect(partial(move_scrollbar, vs2))
    vs2.valueChanged.connect(partial(move_scrollbar, vs1))

    main_horizontal.addLayout(verti_1)
    main_horizontal.addLayout(verti_2)
    win.setLayout(main_horizontal)
    win.resize(400,200)
    win.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    window()
...