滚动同步

时间:2018-10-05 12:04:41

标签: c++ qt

我有两个小部件,它们的滚动分别控制。每个小部件的ScrollBarPolicy — ScrollBarAsNeeded。

还有一个复选框,该复选框应同步两个小部件的滚动(水平)。我想滚动其中一个,第二个也应该滚动。如何实现?

我也想实现一种情况,当我滚动第一个小部件时,第二个也将滚动,但是直接滚动第二个小部件应该是不可能的。

Two widgets — diagrams

2 个答案:

答案 0 :(得分:0)

对于情况1:
假设您的窗口小部件是自定义窗口小部件,如果不派生它们,则制作自定义窗口小部件,并为窗口小部件1添加一个自定义信号,例如ScrollEvent,并将该信号连接到窗口小部件2中的自定义插槽,例如ScrollUpdate。为widget1安装eventfiter,然后在eventfilter中注意QScrollEvent,当事件发生时发出您的自定义信号。在widget2的插槽中,滚动到widget1的位置。

对于情况2:
实现与case1相同的操作。除此之外,请使用以下代码

ui->your_widget2->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);  

这使滚动条消失,因此用户无法直接滚动。

答案 1 :(得分:0)

在第二个对象的构造函数中,实现了两种具有就绪信号和QScrollArea槽的方法:

connect(parentScrollArea->horizontalScrollBar(),
        SIGNAL(valueChanged(int)),
        relatedDiagram->parentScrollArea->horizontalScrollBar(),
        SLOT(setValue(int)));
connect(relatedDiagram->parentScrollArea->horizontalScrollBar(),
        SIGNAL(valueChanged(int)),
        parentScrollArea->horizontalScrollBar(),
        SLOT(setValue(int)));

我决定不禁用第二个对象的直接滚动。

在同步方式中,我添加了同步方式:

connect(commonArea->horizontalScrollBar(),
        SIGNAL(valueChanged(int)),
        resultsArea->horizontalScrollBar(),
        SLOT(setValue(int)));
connect(resultsArea->horizontalScrollBar(),
        SIGNAL(valueChanged(int)),
        commonArea->horizontalScrollBar(),
        SLOT(setValue(int)));

和不同步:

 disconnect(commonArea->horizontalScrollBar(),
               SIGNAL(valueChanged(int)),
               resultsArea->horizontalScrollBar(),
               SLOT(setValue(int)));
 disconnect(resultsArea->horizontalScrollBar(),
               SIGNAL(valueChanged(int)),
               commonArea->horizontalScrollBar(),
               SLOT(setValue(int)));