我的代碼,你可以通過安裝任何插件的事件過濾器,將鼠標滾輪事件轉發到的QTextEdit做到這一點大概的概念。 另外,我正在使用Qt 4.6.1。我在Qt 4.8和更高版本中發現了一個新的「滾動」事件類型,在使用時可能需要更改代碼。
[編輯:]
對於文本編輯滾動,事件處理從出於某些原因,標準的方式有所不同: 發送滾輪事件到文本編輯不處理它。 相反,某種私人活動過濾器調用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
Wheel 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來說。看到我更新的答案(最好從頭再讀一遍,我不得不改變) –