Я пытаюсь реализовать пользовательское поведение прокрутки в 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.
Любая помощь будет высоко оценен.
Хорошо, так что просто используйте
disconnect(receiver, SLOT(setValue...), unwanted_sender, SIGNAL(...))
разорвать конкретное нежелательное соединение.
После дня исследований я нашел решение благодаря PapierKorb:
я использовал QPropertyAnimation вместо ручной работы QTimer
обработка на value
имущество
Я установил фильтр ключевых событий для родительского элемента управления, чтобы перехватывать события PageDown / PageUp (installEventFilter) и имел ScrollBar обрабатывать все поведение прокрутки. В конце анимации я вручную переместил курсор на новую позицию, не отправляя setValue
сигналы