Я использую QTableView, на котором я устанавливаю свою собственную пользовательскую модель, унаследованную от QAbstractTableModel, используя вызов QTableView :: setModel ().
Табличное представление поддерживает перетаскивание: мой класс модели переопределяет mimeData () и dropMimeData (). Элементы можно перетаскивать даже между двумя экземплярами приложения.
Чего я хотел бы добиться, так это: dropMimeData () должен определять, происходит ли удаление элемента из того же окна или из другого окна другой запущенной копии приложения. И это должно вести себя по-разному в каждом случае.
Использование аргумента Qt :: DropAction для dropMimeData () казалось наиболее естественным, но это не работает: это всегда Qt :: CopyAction или Qt :: MoveAction, независимо от исходного окна и только в зависимости от defaultDropAction QTableView.
Это возможно?
Предположим, что экземпляр QMainWindow MainWindow имеет два экземпляра QTableView в качестве детей:
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
(если функция уже существует, добавьте дополнительные блоки if)
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()
Вы можете узнать, куда он идет и откуда он пришел.
Я закончил подкласс QTableView
, что можно сделать в QT Designer, щелкнув правой кнопкой мыши по таблице в форме и выбрав Повышать до …— В подклассе я последовал предложению Adlag и использовал dropEvent->source()
чтобы определить, был ли источник тем же виджетом или другим.