[英]C++ QT Creator create slot function for QTextEdit::verticalSlideBar?
我正在使用 QT Creator 创建一个简单的应用程序,每个应用程序旁边都有两个 textEdit 字段。 我希望在滚动时将两个字段链接起来,这样当一个字段向上或向下滚动时,另一个字段也会自动滚动,反之亦然。 为此,我需要一个回调 function,只要用户移动其中一个字段的滑动条就会触发该回调。 不幸的是,当我右键单击 textEdit 字段并按“转到插槽”时,我找不到滑动条移动的事件。
我怎样才能做到这一点?
QTextEdit
没有关于其中的滑块何时更改的信号,因为它不是滚动条。 但是QScrollBar
具有在 slider 移动时发出的sliderMoved(int value)
信号。 QScrollBar
还可以通过槽设置其滚动值(使用setValue(int value)
)
因此,我们可以很容易地使用信号和插槽将两个滚动条绑定在一起。
例如:
...
// 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
小部件的 ID 为textbx1
和textbx2
)
编辑:
值得一提的是,在文本框上使用滚轮时不会发出sliderMoved
。 要检测这些输入,您必须使用QScrollBar::valueChanged
类的东西。 但是,您必须小心这一点,因为setValue
会发出valueChanged
,这意味着如果您简单地修改上述代码,您将获得无限的反馈循环。
为了防止这种情况,您可以使用 lambda,如下所示:
...
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()
的奇怪之处在于我们不会重复几乎相同的 lambda 两次)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.