您可以通过在任何小部件上安装事件过滤器来实现此目的,该过滤器会将鼠标滚轮事件转发到 QTextEdit:
不幸的是,我只能给你 C++ 代码,但它应该给你一个总体思路。
另外,我正在使用 Qt 4.6.1。我在 Qt 4.8 及更高版本中检测到新的“滚动”事件类型,您在使用它时可能需要更改代码。
[Edit:]
对于 TextEdit 滚动,事件处理由于某种原因与标准方式不同:
将滚轮事件发送到文本编辑器不会对其进行处理。
相反,某种私有事件过滤器调用wheelEvent
通过QAbstractScrollArea::viewportEvent
不幸的是它受到保护。
长话短说,我们可以通过子类化 QTextEdit 来伪造 Wheel 事件:
#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
WheelEventForwarder.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 http://qt-project.org/doc/qt-5.1/qtcore/qobject.html#installEventFilter欲了解更多信息。