2014-09-21 21 views
1

我试图在QTextEdit控件中实现自定义滚动行为。这似乎是工作,但我有与PageDown键/ PageUp键按键问题:我控制,因为文档国通过actionTriggered信号滚动行为:QTextEdit和自定义滚动 - PageDown/PageUp

当信号发出时,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*) 
... 

我不知道该怎样防止插入符号从发行想法QAbstractSlider::SetValue()呼叫时插入符号由于移动到上一页/下一页按键。

任何帮助将不胜感激。

+0

您是否试过'QObject :: disconnect'的SetValue信号? – Thomas 2014-09-21 14:19:37

+0

它不能工作托马斯,因为我依靠'setValue()'方法我自己 – 2014-09-21 18:28:44

+0

也许我误解了,但我不是故意要断开'setValue()'完全,只是特定的连接'断开(接收器,SLOT( setValue ...),unwanted_sender,SIGNAL(...))',这应该让所有选项都使用setValue - 可能是通过您安装的新连接。尽管如此,因为它现在工作...;) – Thomas 2014-09-21 20:59:22

回答

1

好了,所以只使用

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

打破特定不必要的连接。

0

研究了一天后,我找到了解决办法感谢PapierKorb

  • 我用的QPropertyAnimation代替手工制作QTimer处理上

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