2012-05-16 92 views
2

我有一個附有QStandardItemModel的QTreeView。我試圖啓用拖放從外部來源。我已經完成了文檔中提到的所有提及拖放和拖放項目視圖,但事情並不正確。當我嘗試將文件拖到樹視圖上時,該圖標上始終有一個X,表示該放置不可用。 (我使用OS X,我不知道這個圖標看起來像是什麼窗口)。我希望能夠放棄某些項目,但直到我瞭解基礎知識,我無法編寫該功能。拖放到QTreeView中的QStandardItemModel不起作用

這裏是我的子類的樹視圖源代碼:

MyTreeView::MyTreeView(QWidget *parent) : 
    QTreeView(parent) 
{ 
    setContextMenuPolicy(Qt::CustomContextMenu); 
    setAcceptDrops(true); 
    setDropIndicatorShown(true); 
} 

void MyTreeView::dragEnterEvent(QDragEnterEvent *event) 
{ 
    event->acceptProposedAction(); 
} 

void MyTreeView::dropEvent(QDropEvent *event) 
{ 
    qDebug("I am here"); 
    event->acceptProposedAction(); 
} 

這裏是子類的標準產品型號來源:

MyStandardItemModel::MyStandardItemModel(QObject *parent) : 
    QStandardItemModel(parent) 
{ 
} 

Qt::DropActions MyStandardItemModel::supportedDropActions() const 
{ 
    return Qt::CopyAction; 
} 

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex &index) const 
{ 
    Qt::ItemFlags defaultFlags = QStandardItemModel::flags(index); 

    if (index.isValid()) 
     return Qt::ItemIsDropEnabled | defaultFlags; 
    else 
     return defaultFlags; 
} 

bool MyStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) 
{ 
    qDebug("I am in the model"); 
} 

正如我所說的,圖標是告訴我,下降不可用,但如果我放棄它,則會從樹視圖中打印出「我在這裏」文本。但是模型視圖中的文字「我在模型中」從來不會被打印出來。我不確定我需要做什麼才能讓模型識別可用的下拉列表並更改圖標,或者讓dropMimeData函數調用。任何幫助表示讚賞,因爲我一遍又一遍地閱讀了文檔,而且我明顯錯過了一些東西。

+0

你必須在你的MyTreeView :: dropEvent()實現中調用'QTreeView :: dropEvent()'。 –

回答

1

我想這是因爲你還需要重新實現dragMoveEvent(QDragMoveEvent*)方法。否則,每個項目將獨立宣佈他們不能接受放置。