2013-07-19 28 views
2

當鼠標滾輪不在QTextEdit上時,鼠標滾輪上的滾動條不會移動,但我仍然希望通過鼠標滾輪移動滾動條,那麼我該如何實現這個功能呢? 我知道像Microsoft Word這樣的軟件有這個功能。如何將QWidget的車輪事件重定向到QTextEdit

我像下面這樣實現了這個特性,但是當你通過鼠標滾輪將滾動條移動到頂部或底部時,會出現錯誤:調用Python對象時超出最大遞歸深度。 任何人都可以幫忙?

我可以遺憾的是隻給你的C++代碼,但它應該給你一個: 這裏http://codepad.org/1rq06qTk

回答

1

我的代碼,你可以通過安裝任何插件的事件過濾器,將鼠標滾輪事件轉發到的QTextEdit做到這一點大概的概念。 另外,我正在使用Qt 4.6.1。我在Qt 4.8和更高版本中發現了一個新的「滾動」事件類型,在使用時可能需要更改代碼。


[編輯:]

對於文本編輯滾動,事件處理從出於某些原因,標準的方式有所不同: 發送滾輪事件到文本編輯不處理它。 相反,某種私人活動過濾器調用wheelEventQAbstractScrollArea::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文檔瞭解更多信息。

+0

你試過了你的代碼嗎?它似乎並沒有工作 – iMath

+0

我已經能夠現在嘗試它並修復了一些編譯錯誤,使得這個類更加可重用。然而事件轉發似乎沒有按照我預期的方式工作,我現在正在研究這一點。 –

+0

我已經使它工作了,至少對於Qt 4.6.1來說。看到我更新的答案(最好從頭再讀一遍,我不得不改變) –

0

你也可以去使用這種方法:

呼叫QTextEdit.scroll(INT,INT)功能,在需要的時候滾動的QTextEdit。 意思是你可以從你的widget的mouseScrollEvent調用這個函數

+0

但沒有名爲「mouseScrollEvent」的函數 – iMath

+0

它用wheelEvent()命名。您可以使用此事件來執行您的任務 –

相關問題