我正在尝试在QTextEdit控件中实现自定义滚动行为。它似乎正在工作,但我在使用PageDown / PageUp按键时出现问题:我正在通过actionTriggered信号控制滚动行为,因为文档声明:
发出信号时,调整了sliderPosition 根据行动,但价值尚未传播 (意思是valueChanged()信号尚未发出),而且 视觉显示尚未更新。在连接到此信号的插槽中 你可以通过调用setSliderPosition()安全地调整任何动作 你自己,基于动作和滑块的值。
并使用sliderPosition
启动QTimer,我需要从那里开始(例如,我每次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()
调用。
任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
好的,所以只需使用
disconnect(receiver, SLOT(setValue...), unwanted_sender, SIGNAL(...))
打破特定的不需要的连接。
答案 1 :(得分:0)
经过一天的研究后,我找到了解决方案,感谢 PapierKorb :
我在QTimer
属性
value
处理
我为父控件安装了一个键事件过滤器,以便捕获PageDown / PageUp事件(installEventFilter)并让ScrollBar处理所有滚动行为。在动画结束时,我手动将光标移动到新位置而不发送任何setValue
信号