Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;QT创建者为QTextEdit::verticalSlideBar创建插槽函数?_C++_Qt - Fatal编程技术网

C++ C++;QT创建者为QTextEdit::verticalSlideBar创建插槽函数?

C++ C++;QT创建者为QTextEdit::verticalSlideBar创建插槽函数?,c++,qt,C++,Qt,我正在使用QtCreator创建一个简单的应用程序,每个应用程序旁边都有两个文本编辑字段。我希望两个字段在滚动时都被链接,这样当一个字段向上或向下滚动时,另一个字段也会自动滚动,反之亦然。为此,我需要一个回调函数,该函数在用户移动其中一个字段的滑块时触发。不幸的是,当我右键单击文本编辑字段并按“转到插槽”时,我找不到滑块移动的事件 我怎样才能做到这一点 QTextEdit中的滑块栏没有更改的信号,因为它不是滚动条。但是QScrollBar具有滑块移动(int值)信号,该信号在滑块移动时发出QSc

我正在使用QtCreator创建一个简单的应用程序,每个应用程序旁边都有两个文本编辑字段。我希望两个字段在滚动时都被链接,这样当一个字段向上或向下滚动时,另一个字段也会自动滚动,反之亦然。为此,我需要一个回调函数,该函数在用户移动其中一个字段的滑块时触发。不幸的是,当我右键单击文本编辑字段并按“转到插槽”时,我找不到滑块移动的事件


我怎样才能做到这一点

QTextEdit
中的滑块栏没有更改的信号,因为它不是滚动条。但是
QScrollBar
具有滑块移动(int值)信号,该信号在滑块移动时发出
QScrollBar
还可以通过插槽设置其滚动值(使用
setValue(int-value)

因此,我们可以很容易地使用信号和插槽将两个滚动条连接在一起

例如:

。。。
//获取指向滚动条的简单指针
QScrollBar*textbx_滑块_1=ui->textbx1->verticalScrollBar();
QScrollBar*textbx_滑块_2=ui->textbx2->verticalScrollBar();
//把它们也连接起来
连接(textbx_滑块_1,&QScrollBar::sliderMoved,textbx_滑块_2,&QScrollBar::setValue);//将第一个滚动条连接到第二个滚动条
连接(textbx_slider_2,&QScrollBar::sliderMoved,textbx_slider_1,&QScrollBar::setValue);//将第二个滚动条连接到第一个滚动条
...
(这假设您的
QTextEdit
小部件的ID为
textbx1
textbx2


编辑:

值得一提的是,当使用文本框上的滚轮时,
sliderMoved
将不会发出的声音。要检测这些输入,必须使用类似于
QScrollBar::valueChanged
的方法。但是,您必须注意这一点,因为
setValue
会发出
valueChanged
,这意味着您只需修改上述代码,就会得到无限的反馈循环

为了防止这种情况,您可以使用lambda,如下所示:

。。。
int old\u pos=textbx\u滑块\u 1->value()
std::函数f=[old_pos](int-new_pos,QScrollBar*滑块){
如果(新位置!=旧位置){
//仅当值已更改时触发
滑块->设置值(新位置);
旧位置=新位置;
};
connect(textbx_slider_1,&QScrollBar::sliderMoved,std::bind(f,std::占位符::_1,textbx_slider_2));//将第一个滚动条连接到第二个滚动条
connect(textbx_slider_2,&QScrollBar::sliderMoved,std::bind(f,std::占位符::_1,textbx_slider_1));//将第二个滚动条连接到第一个滚动条
...

(std::bind()的奇怪之处在于我们不会重复几乎相同的lambda两次)

啊,是的,这很有效。不过我对您的代码做了一些修改,将&QScrollBar::valueChanged连接到&QScrollBar::sliderMoved,而不是&QScrollBar::sliderMoved,因为这样,当使用鼠标滚轮而不是滑块时,两个文本编辑也会同步。非常感谢!很抱歉,我应该在回答中提到这一点,您必须小心然而,使用该方法,您可以得到一个无限循环