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()
просто в том, что мы не повторяем практически одну и ту же лямбду дважды)