如何同步滚动两个QListWidgets?

时间:2018-03-17 13:56:17

标签: c++ qt qt5 qlistwidget

有两个QListWidget具有相同数量的项目。如何同步他们的滚动?

我的意思是当我滚动其中一个时,另一个应该滚动相同。

2 个答案:

答案 0 :(得分:2)

您必须使用来自valueChanged() verticalScrollBar()的{​​{1}}信号,因为连接是双向的,它会导致使用QListWidget执行不必要的任务:

在下一节中,我展示了一个例子:

blockSignals()

答案 1 :(得分:2)

假设您QListWidget中有两个listWidget_1元素listWidget_2UI,那么您可以使用valueChanged / setValue信号/广告位用于连接两个listwidgets的垂直滑块,实际上,我没有发现任何信号在这种“双向”连接中重新弹跳的问题,因为最终两个值都是相同的,我认为不再发出信号,因此你可以设置足够的连接:

    connect(this->ui->listWidget_1->verticalScrollBar(), &QScrollBar::valueChanged,
this->ui->listWidget_2->verticalScrollBar(), &QScrollBar::setValue);
    connect(this->ui->listWidget_2->verticalScrollBar(), &QScrollBar::valueChanged,
this->ui->listWidget_1->verticalScrollBar(), &QScrollBar::setValue);
// test lists:
    QList<QString> lw11, lw22;
    for (int x=0; x <200; x++){
        lw11.append("ListWidget1_" + QVariant(x).toString());
        lw22.append("The Other lw is at: " + QVariant(x).toString());
    }
    this->ui->listWidget_1->addItems(lw11);
    this->ui->listWidget_2->addItems(lw22);

如果应该阻止信号反弹,那么可以通过添加单个slot来调整模型以处理两个小部件的滚动并将两者连接到该插槽:

    connect(this->ui->listWidget_1->verticalScrollBar(),&QScrollBar::valueChanged
 , this, &MainWindow::handleScroll);
    connect(this->ui->listWidget_2->verticalScrollBar(),&QScrollBar::valueChanged
 , this, &MainWindow::handleScroll);

并且插槽逻辑可以是:

void MainWindow::handleScroll(int value)
{
    // Logic for detecting sender() can be used ... but I don't see it's important
    // fast way to check which listWidget emitted the signal ...
    if (this->ui->listWidget_1->verticalScrollBar()->value() == value){
        qDebug() << "lw1 is in charge ...............";
        disconnect(this->ui->listWidget_2->verticalScrollBar(), &QScrollBar::valueChanged,this, &MainWindow::handleScroll); // prevent signal rebounce from the other lw
        this->ui->listWidget_2->verticalScrollBar()->setValue(value); 
        connect(this->ui->listWidget_2->verticalScrollBar(), &QScrollBar::valueChanged,this, &MainWindow::handleScroll);

    }else{
        qDebug() << "lw2 is in charge ...............";
        disconnect(this->ui->listWidget_1->verticalScrollBar(), &QScrollBar::valueChanged,this, &MainWindow::handleScroll);
        this->ui->listWidget_1->verticalScrollBar()->setValue(value);
        connect(this->ui->listWidget_1->verticalScrollBar(), &QScrollBar::valueChanged,this, &MainWindow::handleScroll);
    }
}