QTextEdit和自定义滚动 - PageDown / PageUp

时间:2014-09-21 14:06:17

标签: c++ qt user-interface qtextedit qabstractslider

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

  

发出信号时,调整了sliderPosition   根据行动,但价值尚未传播   (意思是valueChanged()信号尚未发出),而且   视觉显示尚未更新。在连接到此信号的插槽中   你可以通过调用setSliderPosition()安全地调整任何动作   你自己,基于动作和滑块的值。

并使用sliderPosition启动QT​​imer,我需要从那里开始(例如,我每次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*)
...

我不知道如果由于PageUp / PageDown按键移动插入符号时,如何阻止插入符号发出QAbstractSlider::SetValue()调用。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

好的,所以只需使用

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

打破特定的不需要的连接。

答案 1 :(得分:0)

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

  • 我在QTimer属性

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