Синхронизация прокрутки - PullRequest
0 голосов
/ 05 октября 2018

У меня есть два виджета, их прокрутки контролируются отдельно.ScrollBarPolicy для каждого виджета - ScrollBarAsNeeded.

Также есть флажок, который должен синхронизировать прокрутку (горизонтальную) обоих виджетов.Я хотел бы прокрутить один из них, а второй - тоже.Как это реализовать?

Также я хотел бы реализовать случай, когда я прокручиваю первый виджет, второй прокручивается тоже, но не должно быть возможности прокручивать второй виджет напрямую.

Two widgets — diagrams

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

В конструкторе второго объекта реализованы два метода с сигналами готовности и слотами 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)));
0 голосов
/ 05 октября 2018

Для случая 1:
Предполагая, что ваши виджеты являются пользовательскими виджетами, если не извлекают их, создайте пользовательский виджет и добавьте пользовательский сигнал для widget1, такой как ScrollEvent, и подключите сигнал к пользовательскому слоту, например ScrollUpdate.в виджете2.Установите eventfiter для вашего widget1, и в eventfilter следите за QScrollEvent, когда событие происходит, подайте ваш пользовательский сигнал.В слоте widget2 выделите положение widget1.

Для случая 2:
Реализовать то же самое, что и в случае1.В дополнение к этому используйте следующий код

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

Это заставляет полосу прокрутки исчезать, поэтому пользователь не может прокручивать напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...