QTableView派生類重載dropEvent方法無效的解決方法

轉載請註明出處,謝謝!

由於需要用到一個QTableView進行數據內容的顯示,同時希望view能支持Drag和Drop的操作,而Drag的數據源可能來自其他view也可能是自身的,需要做一些轉換處理,所以,通過QTableView派生自定義類的方式來 重載dropEvent方法,在該方法中進行一些處理。


直接看代碼:

class MyTabelView : public QTableView
{
public:
    MyTabelView(QWidget *parent=0);

    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);
    void dragMoveEvent(QDragMoveEvent *event);
};


剛開始即使用了google搜索,搜索到此類問題的解決辦法,找到的內容中強調dragEnterEvent、dropEvent、dragMoveEvent 三個方法均需要重載,同時,在派生類的構造函數中setAcceptDrops(true);

於是實現:

MyTabelView::MyTabelView(QWidget *parent) : QTableView(parent)
{
    setAcceptDrops(true);
    setDragDropMode(QAbstractItemView::DragDrop);
    setDragEnabled(true);
    setDropIndicatorShown(true);
}

void MyTabelView::dropEvent(QDropEvent *event)
{
    qDebug() << "drag droped";
}

void MyTabelView::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug() << "drag entered";
}

void MyTabelView::dragMoveEvent(QDragMoveEvent *event)
{
    qDebug() << "drag moved";
}

編譯通過後,試了一下,只有dragentered消息進入,move及drop均沒有進入,實在想不明白是何道理,該實現的方式均實現了。當然遇到這種問題,最快捷的方式,還是搜索,但找到的信息寥寥,大多數都止於重載這三個方法即可。 但其中有一篇文章中提到,這類ViewWidget大部分都集成了基類的三種方法,或者都進行了重載。

從這其中我想到一個問題,既然QTableView基類已經實現了此三種方法,那麼在派生類中中MyTabelView::dragEnterEvent 實現方式是否應該將接收到的消息傳遞繼續下去?如果不傳遞下去會是什麼樣?於是:

void MyTabelView::dragEnterEvent(QDragEnterEvent *event)
{
    qDebug() << "drag entered";
    QTableView::dragEnterEvent(event);
}

經過測試,drop及move均正常進入,看來問題就出在了重載方法後消息的傳遞上。


總結:

對於有消息傳遞的方法的重載,如果該消息還有後續操作需要實現,在重載方法的最後,應該明確調用基類的方法進行消息的傳遞。

純個人總結,可能有錯誤之處,還請網友發現後給予指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章