轉載請註明出處,謝謝!
由於需要用到一個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均正常進入,看來問題就出在了重載方法後消息的傳遞上。
總結:
對於有消息傳遞的方法的重載,如果該消息還有後續操作需要實現,在重載方法的最後,應該明確調用基類的方法進行消息的傳遞。
純個人總結,可能有錯誤之處,還請網友發現後給予指正,謝謝!