1

我正在尝试在QTextEdit控件中实现自定义滚动行为。它似乎正在工作,但我在按下 PageDown/PageUp 按键时遇到问题:我正在通过actionTriggered信号控制滚动行为,因为文档指出:

当信号发出时,sliderPosition 已经根据动作进行了调整,但是值还没有被传播(意味着 valueChanged() 信号还没有发出),视觉显示还没有更新。因此,在连接到此信号的插槽中,您可以根据动作和滑块的值自己调用 setSliderPosition() 来安全地调整任何动作。

并开始一个 QTimer ,sliderPosition我需要从那里到达(例如,我每次都在递增value()到达sliderPosition)。不幸的是,每次我按下 PageUp/PageDown 键时,还会有另一个由插入符号触发的setValue () 函数调用,该函数调用由 PageUp/PageDown 键移动,该键自动将滚动条值移动到动画的末尾。

调用堆栈显示:

QAbstractSlider::setValue(int)
??
QMetaObject::activate(QObject*, int, int, void**)   
QWidgetTextControl::visibilityRequest(QRectF const&)    
QWidgetTextControl::ensureCursorVisible()  <--
QWidgetTextControl::setTextCursor(QTextCursor const&)   <--
QTextEdit::keyPressEvent(QKeyEvent*)
QWidget::event(QEvent*)
QFrame::event(QEvent*)
QAbstractScrollArea::event(QEvent*)
QTextEdit::event(QEvent*)
QApplicationPrivate::notify_helper(QObject*, QEvent*)
QApplication::notify(QObject*, QEvent*)
QCoreApplication::notifyInternal(QObject*, QEvent*)
...

我不知道如何防止插入符号QAbstractSlider::SetValue()在由于 PageUp/PageDown 键按下而移动时发出该调用。

任何帮助将不胜感激。

4

2 回答 2

1

好的,所以只需使用

disconnect(receiver, SLOT(setValue...), unwanted_sender, SIGNAL(...))

断开特定的不需要的连接。

于 2014-09-21T22:36:24.217 回答
0

经过一天的研究,感谢PapierKorb ,我找到了解决方案:

  • 我使用QPropertyAnimation而不是对属性进行手工QTimer处理value

  • 我为父控件安装了一个键事件过滤器,以捕获 PageDown/PageUp 事件 ( installEventFilter ),并让 ScrollBar 处理所有滚动行为。在动画结束时,我手动将光标移动到新位置而不发送任何setValue信号

于 2014-09-21T18:33:01.433 回答