C ++ QT Creator создать функцию слота для QTextEdit :: verticalSlideBar? - PullRequest
0 голосов
/ 15 апреля 2020

Я использую QT Creator для создания простого приложения, у которого есть два поля textEdit рядом с каждым другим. Я хочу, чтобы оба поля были связаны, когда дело доходит до прокрутки, так что, когда одно поле прокручивается вверх или вниз, другое будет автоматически, и наоборот. Для этого мне нужна функция обратного вызова, которая запускается всякий раз, когда пользователь перемещает ползунок одного из полей. К сожалению, когда я щелкаю правой кнопкой мыши по полям textEdit и нажимаю «Go to slots», я не могу найти событие для перемещения ползунка.

Как мне этого добиться?

1 Ответ

1 голос
/ 15 апреля 2020

QTextEdit не имеет сигнала, когда ползунок в нем изменяется, поскольку он не является полосой прокрутки. Однако QScrollBar имеет сигнал sliderMoved(int value), который излучается при перемещении ползунка. QScrollBar также имеет способ установить значение прокрутки через слоты (с помощью setValue(int value))

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

Например:

... 
// Get easy pointers to the scrollbars
QScrollBar* textbx_slider_1 = ui->textbx1->verticalScrollBar();
QScrollBar* textbx_slider_2 = ui->textbx2->verticalScrollBar();

// Connect them too each other
connect(textbx_slider_1, &QScrollBar::sliderMoved, textbx_slider_2, &QScrollBar::setValue); // Connect the first scrollbar to the second

connect(textbx_slider_2, &QScrollBar::sliderMoved, textbx_slider_1, &QScrollBar::setValue); // Connect the second scrollbar to the first
...

(Предполагается, что ваши QTextEdit виджеты имеют идентификаторы textbx1 и textbx2)


Редактировать:

Стоит отметить, что sliderMoved будет не при использовании колеса прокрутки в текстовом поле. Для обнаружения этих входов вы должны использовать что-то вроде QScrollBar::valueChanged. Однако вы должны быть осторожны с этим, поскольку setValue испускает valueChanged, что означает, что вы получите бесконечный отклик l oop, если вы просто измените вышеуказанный код.

Чтобы предотвратить это, вы можете использовать лямбду, что-то вроде этого:

...
int old_pos = textbx_slider_1->value()
std::function<void(int, QScrollBar*)> f = [old_pos](int new_pos, QScrollBar* slider){
    if (new_pos != old_pos) {
        // Only trigger if the value has changed
        slider->setValue(new_pos);
        old_pos = new_pos;
    };
connect(textbx_slider_1, &QScrollBar::sliderMoved, std::bind(f, std::placeholders::_1, textbx_slider_2)); // Connect the first scrollbar to the second

connect(textbx_slider_2, &QScrollBar::sliderMoved, std::bind(f, std::placeholders::_1, textbx_slider_1)); // Connect the second scrollbar to the first
...

(странность с std::bind() просто в том, что мы не повторяем практически одну и ту же лямбду дважды)

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