2013-12-11 65 views
3

我正在使用QTableView,我使用調用QTableView :: setModel()來設置我自己的自定義模型,繼承自QAbstractTableModel。Qt:區分從相同或其他窗口拖動

表視圖支持拖放:我的模型類重新實現mimeData()和dropMimeData()。項目可以被拖放,甚至在應用程序的兩個實例之間。

我想實現的是:dropMimeData()應該檢測被刪除的元素是來自同一個窗口,還是來自另一個運行的應用程序副本的另一個窗口。它在每種情況下都應該有不同的表現。

使用dropMimeData()參數的Qt :: DropAction動作似乎是最自然的事情,但這並不起作用:它始終是Qt :: CopyAction或Qt :: MoveAction,與源窗口無關,僅取決於在QTableView的defaultDropAction上。

這可能嗎?

+1

如果您將該信息編碼到啞劇數據中,並在放下該項目時將其解碼,該怎麼辦? – vahancho

+0

這將需要始發窗口的系統範圍唯一標識符。有這樣的事嗎? – user377486

+0

我會認爲更簡單 - 只需發明您的標識符並將它們作爲字節數組或類似的方式寫入MIME數據。 – vahancho

回答

0

我結束了繼承QTableView,它可以在Qt Designer中右擊形式來完成對錶和選擇推進到... - 在我跟着adlag的建議的子類,用於dropEvent->source()檢測是否來源是相同的小部件或另一個。

1

假設一個的QMainWindow實例主窗口有兩個QTableView中實例作爲childeren:
ui->tableView1ui->tableView2

如果功能尚未宣佈,添加以下mainwindow.h:

protected: 
bool eventFilter(QObject *target, QEvent *event); 

添加遵循執行文件中的構造函數

ui->tableView1->viewport()->installEventFilter(this); 
ui->tableView2->viewport()->installEventFilter(this); 

添加以下功能在實現文件mainwindow.cpp
(如果該功能已經存在,如果塊添加額外的)

bool MainWindow::eventFilter(QObject * target, QEvent *event) 
{ 
    if (event->type() == QEvent::Drop) { 
     QDropEvent *dropEvent = (QDropEvent*) event; 
     // pointer target is the target and 
     // pointer dropEvent->source() is the source 
     if (target == ui->tableView1->viewport()) { 
      // .... 
     } 
     if (target == ui->tableView2->viewport()) { 
      // ... 
     } 
    } 
    return false; //leave further processing to widget 
} 

您也可以攔截QDragMoveEvent。通過分析指針targetevent->source(),您可以找出它的來源及其來源。