2013-12-11 6 views
3

Я использую QTableView, на котором я установил свою собственную пользовательскую модель, наследующую от QAbstractTableModel, используя вызов QTableView :: setModel().Qt: различать перетаскивание из того же или другого окна

Вид таблицы поддерживает перетаскивание: мой класс модели reimplements mimeData() и dropMimeData(). Элементы можно перетаскивать и удалять даже между двумя экземплярами приложения.

То, что я хотел бы получить, это: dropMimeData() должен определить, произошел ли отбрасываемый элемент из того же окна или из другого окна другой запущенной копии приложения. И в каждом случае это должно вести себя по-разному.

Использование аргумента Действия Qt :: DropAction dropMimeData() казались наиболее естественными, но это не работает: это всегда Qt :: CopyAction или Qt :: MoveAction, независимо от исходного окна, и зависит только от на defaultDropAction QTableView.

Возможно ли это?

+1

Что делать, если вы кодируете эту информацию в данные mime и декодируете ее при удалении элемента? – vahancho

+0

Для этого потребуется общесистемный уникальный идентификатор исходного окна. Есть ли такая вещь? – user377486

+0

Я бы подумал проще - просто придумайте свой идентификатор (ы) и запишите их в данные mime как байтовый массив или такой. – vahancho

ответ

0

Я в конечном итоге подклассов QTableView, что может быть сделано в QT Designer, щелкнув правой кнопкой мыши на столе в форме и выборе Содействие в ... - В подклассе я последовал за предложение adlag и использовали dropEvent->source() для обнаружения ли источником был тот же самый виджет или другой.

1

Пусть QMainWindow экземпляр MainWindow имеет два экземпляра QTableView как childeren:
ui->tableView1 и ui->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. Анализируя указатели target и event->source(), вы можете узнать, куда он идет и откуда.