QTextEdit和自定义滚动-PageDown/PageUp

QTextEdit and custom scrolling - PageDown/PageUp

本文关键字:PageUp -PageDown 滚动 自定义 QTextEdit      更新时间:2023-10-16

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

发出信号时,滑块位置已调整根据操作,但该值尚未传播(表示尚未发出valueChanged()信号),并且视觉显示尚未更新。在连接到此信号的插槽中因此,可以通过调用setSliderPosition()来安全地调整任何操作您自己,基于动作和滑块的值。

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

调用堆栈显示:

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()调用。

如有任何帮助,我们将不胜感激。

OK,所以只需使用

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

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

经过一天的研究,我找到了解决方案,这要归功于PapierKorb:

  • 我在value属性上使用了QPropertyAnimation,而不是手工制作的QTimer处理

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