Вы можете сделать это, установив фильтр событий на любой виджет, который будет перенаправлять события колесика мыши в 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 для получения дополнительной информации об этом.
вы пробовали свой код? он, похоже, не работает – iMath
Я смог попробовать сейчас и исправил некоторые ошибки компиляции + сделал класс более многоразовым. Однако переадресация событий не работает так, как я ожидал, я сейчас изучаю это. –
Я заработал, по крайней мере, для Qt 4.6.1.См. Мой обновленный ответ (Лучше всего было бы прочитать его с самого начала, мне пришлось многое изменить) –