2013-07-19 2 views
2

, когда вы поворачиваете колесико мыши, когда мышь не находится на QTextEdit, полосы прокрутки в этом случае не будут перемещаться, но я все же хочу переместить полосы прокрутки колесиком мыши, так как я могу реализовать эту функцию? Я знаю, что у некоторых программ, таких как Microsoft Word, есть эта функция.Как перенаправить события колеса QWidget на QTextEdit

Я реализую эту функцию следующим образом, но когда вы перемещаете полосы прокрутки в верхнюю или нижнюю часть колеса мыши, возникает ошибка: максимальная глубина рекурсии превышается при вызове объекта Python. Кто-нибудь может помочь? мой код здесь http://codepad.org/1rq06qTk

ответ

1

Вы можете сделать это, установив фильтр событий на любой виджет, который будет перенаправлять события колесика мыши в QTextEdit:

Я могу, к сожалению, только дать вам C++ код, но это должно дать вам Главная идея. Кроме того, я использую Qt 4.6.1. Я обнаружил новый тип события «Прокрутка» в Qt 4.8 и более поздних версиях, возможно, вам придется изменить код при его использовании.


[Edit:]

Для TextEdit прокрутки, обработка событий отличается от стандартного пути по какой-либо причине: Отправка события колеса для редактирования текста не обрабатывает его. Вместо этого какой-то частный фильтр событий вызывает wheelEvent через QAbstractScrollArea::viewportEvent, который, к сожалению, защищен.

Короче говоря, мы можем поддельные колеса События по подклассов QTextEdit:

#include "MyTextEdit.h" 

MyTextEdit::MyTextEdit(QWidget* parent) : 
    QTextEdit(parent) 
{ 
} 

void MyTextEdit::forwardViewportEvent(QEvent* event) 
{ 
    viewportEvent(event); 
} 

При использовании этого вместо QTextEdits по умолчанию, вы можете создать Экспедитора событие, как это:


#ifndef WHEELEVENTFORWARDER_H 
#define WHEELEVENTFORWARDER_H 

#include <QtCore/QObject> 

class MyTextEdit; 

class WheelEventForwarder : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit WheelEventForwarder(MyTextEdit* target); 
    ~WheelEventForwarder(); 

    bool eventFilter(QObject* obj, QEvent* event); 

private: 
    MyTextEdit* _target; 
}; 

#endif // WHEELEVENTFORWARDER_H 

Колесо EventForwarder.cpp

#include "WheelEventForwarder.h" 
#include "MyTextEdit.h" 
#include <QtCore/QEvent> 
#include <QtGui/QApplication> 

WheelEventForwarder::WheelEventForwarder(MyTextEdit* target) : 
    QObject(), 
    _target(target) 
{ 
} 

WheelEventForwarder::~WheelEventForwarder() 
{ 
    _target = NULL; 
} 

bool WheelEventForwarder::eventFilter(QObject* obj, QEvent* event) 
{ 
    Q_UNUSED(obj); 

    static bool recursionProtection = false; 

    if(recursionProtection) return false; 

    if(!_target) return false; 

    if(event->type() == QEvent::Wheel) 
    { 
     recursionProtection = true; 
     _target->forwardViewportEvent(event); 
     recursionProtection = false; 
    } 

    // do not filter the event 
    return false; 
} 

Затем вы можете установить фильтр событий, как это:

mainwindow.cpp (или любой более подходящее место):

_wheelEventForwarder = new WheelEventForwarder(ui->textEdit); 

ui->centralwidget->installEventFilter(_wheelEventForwarder); 

Смотрите документацию для QObject::installEventFilter для получения дополнительной информации об этом.

+0

вы пробовали свой код? он, похоже, не работает – iMath

+0

Я смог попробовать сейчас и исправил некоторые ошибки компиляции + сделал класс более многоразовым. Однако переадресация событий не работает так, как я ожидал, я сейчас изучаю это. –

+0

Я заработал, по крайней мере, для Qt 4.6.1.См. Мой обновленный ответ (Лучше всего было бы прочитать его с самого начала, мне пришлось многое изменить) –

0

Вы также можете пойти с этим подходом:

Вызов QTextEdit.scroll (целое, целое) функция для прокрутки QTextEdit всякий раз, когда требуется. Среднее вы можете отбросить эту функцию от mouseScrollEvent вашего виджета

+0

, но нет функции с именем «mouseScrollEvent» – iMath

+0

Он называется с wheelEvent(). Вы можете использовать это событие для выполнения своей задачи –

Смежные вопросы