2012-09-12 34 views
1

我有一個listwidget和一個treewidget。 我希望listwidgetitems能夠通過拖放在listwidget中移動,並且我還希望listwidget接受來自treewidget的拖動項目的拖放,但在此之前,我想對數據進行一些處理。如何在拖放中設置事件中的自定義數據?

我現在可以做所有這些事情,但我無法找到如何將自定義數據設置爲從treewidget開始的拖動事件。

例如,我在我的treewidget中有一個topLevelItem,它帶有文本「Add DrawEffect」並帶有一個QIcon,當我拖放listwidget時,我想向listwidget添加一個新項目,他說:

DrawEffect 0x0x0x0 effect-here 

,而不是

Add DrawEffect (showing its QIcon as well) 

時,我應該設置此數據?

這是我迄今爲止的代碼,在listwidget中拖放listwidgetitems時工作得很好,它可以在listwidget中拖放qtreewidgetitems,但它可以複製它們,但我想先做進一步處理以增加他們:

在我treewidget的構造:

this->setDragDropMode(QAbstractItemView::DragOnly); 
this->setDefaultDropAction(Qt::CopyAction); 

在我listwidget的構造:

this->setAcceptDrops(true); 
this->setDragDropMode(QAbstractItemView::DragDrop); 
this->setDefaultDropAction(Qt::MoveAction); 

重新實施listwidget的dropEvent:

if(event->source()->inherits("QTreeWidget")) 
    qDebug() << "The dragged item comes from the TreeWidget."; 
else 
    qDebug() << "The dragged item comes from the ListWidget itself."; 
QListWidget::dropEvent(event); 

正如你看到的,我可以在treewidget和listwidget項目區分,但我不知道在這之後該怎麼辦...

我猜的東西像這將是確定:

if(event->source()->inherits("QTreeWidget")){ 
    //treewidget item, it needs further processing 
} 
else 
    QListWidget::dropEvent(event); //listwidget item, no further processing needed 

感謝:/

回答

3

回答,正如cmannett85所說,當進入拖動時,自動將啞劇數據添加到拖動事件中。您可以通過覆蓋QTableWidget :: mimeData()來覆蓋添加的mimedata。在這種方法中,您可以在該位置爲該項設置一些標識符(例如:行號,列號,索引到某個數據結構中)

然後,覆蓋列表小部件中的dropMimedata方法以讀取此數據你並執行插入操作

請參閱,When dragging a row in a QTableWidget, how can I find out what row index it was dragged FROM and TO?更多詳細信息

+0

非常感謝這個答案:)這正是我要找爲:))我沒有得到100%是我是否應該重新實現mimeData()或設置自定義數據,而DragEnter事件發生。請澄清 ! :) – hakermania

+0

更明智重新實現mimeData.Have看看https://qt-project.org/doc/qt-4.8/model-view-programming.html#using-model-view-classes 重寫拖動輸入事件將是更痛苦的,而不是正確的方式去通過 – shubh

+0

謝謝謝謝,謝謝:) – hakermania

1

AFAIK拖拉操作並不「包含」的項目,其中只包含描述它的數據。因此,您需要從event->mimeData()對象的文本,圖標等數據中創建一個新項目,並手動將其插入到您的窗口小部件event->pos()中。

+0

非常感謝這個答案。我只對該物品的文字感興趣。但是,正如我所說,何時(何時)我應該設置描述我的對象的數據?當我拖放一個樹窗口小部件的項目到listwidget所有的事件 - > mimeData->有Text()/ Image()/ Html()等返回false,但該項目包含所有這些。我不知道:( – hakermania

+0

這是奇怪的,我一直以爲它沒有包含數據。嗯,我很抱歉的話,我幫不了你。 – cmannett85

相關問題