简体   繁体   English

如何在PyQt4中的QListWidget中创建同步滚动条

[英]How to make synchronized Scroll bar in QListWidget in PyQt4

I Have two List Widget and I want to make scroll bar of two list synchronized . 我有两个List Widget,我想让两个列表的滚动条同步。 I am new to PyQt4 so i don't know how to do that. 我是PyQt4的新手,所以我不知道该怎么做。

My code is given below 我的代码如下

Code: 码:

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

OUTPUT: OUTPUT: 在此输入图像描述

Expected Output 预期产出

I want to make these two scroll bar synchronized 我想让这两个滚动条同步

The solution is to connect the valueChanged signal of the verticalScrollBar() to a slot where the other verticalScrollBar() moves, but this could generate an infinite loop so to avoid it you must use blockSignals() as shown below: 解决方案是将verticalScrollBar()valueChanged信号连接到另一个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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM