1

QTextEditコントロールにカスタム スクロール動作を実装しようとしています。動作しているようですが、PageDown/PageUp キーの押下に問題があります。ドキュメントに次のように記載されているため、actionTriggeredシグナルを介してスクロール動作を制御しています。

シグナルが発行されると、sliderPosition はアクションに従って調整されていますが、値はまだ伝搬されておらず (つまり、valueChanged() シグナルがまだ発行されていません)、ビジュアル表示は更新されていません。したがって、このシグナルに接続されたスロットでは、アクションとスライダーの値の両方に基づいて setSliderPosition() を自分で呼び出すことにより、任意のアクションを安全に調整できます。

sliderPositionそこから到達する必要があるQTimerを開始します(たとえばvalue()、到達するたびにインクリメントしていますsliderPosition)。残念ながら、PageUp/PageDown キーを押すたびに、スクロールバーの値をアニメーションの最後に自動的に移動するPageUp/PageDown キーによって移動されるキャレットによってトリガーされる別のsetValue () 関数呼び出しもあります。

コール スタックは次のように表示されます。

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を使用しましたQTimervalue

  • PageDown/PageUp イベント ( installEventFilter )をキャッチするために、親コントロールのキー イベント フィルターをインストールし、ScrollBar にすべてのスクロール動作を処理させました。setValueアニメーションの最後に、信号を送信せずに手動でカーソルを新しい位置に移動しました

于 2014-09-21T18:33:01.433 に答える