QTextEdit и пользовательская прокрутка — PageDown / PageUp

Я пытаюсь реализовать пользовательское поведение прокрутки в QTextEdit контроль. Кажется, это работает, но у меня проблемы с нажатием клавиши PageDown / PageUp: я управляю прокруткой через actionTriggered сигнал, поскольку в документации указано:

Когда сигнал испускается, положение слайдера было настроено
согласно действию, но значение еще не распространено
(имеется в виду, что сигнал valueChanged () еще не был передан), а
визуальный дисплей не обновлялся. В слотах, подключенных к этому сигналу
таким образом, вы можете безопасно настроить любое действие, вызвав setSliderPosition ()
себя, основываясь как на действии, так и на стоимости слайдера.

и запуск QTimer с sliderPosition Мне нужно достичь оттуда (например, я увеличиваю каждый раз 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() вызов, когда каретка перемещена из-за нажатия клавиши PageUp / PageDown.

Любая помощь будет высоко оценен.

1

Решение

Хорошо, так что просто используйте

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

разорвать конкретное нежелательное соединение.

1

Другие решения

После дня исследований я нашел решение благодаря PapierKorb:

  • я использовал QPropertyAnimation вместо ручной работы QTimer обработка на value имущество

  • Я установил фильтр ключевых событий для родительского элемента управления, чтобы перехватывать события PageDown / PageUp (installEventFilter) и имел ScrollBar обрабатывать все поведение прокрутки. В конце анимации я вручную переместил курсор на новую позицию, не отправляя setValue сигналы

0

По вопросам рекламы [email protected]