Qt: различать перетаскивание из того же или другого окна

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

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

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

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

Это возможно?

3

Решение

Предположим, что экземпляр 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() Вы можете узнать, куда он идет и откуда он пришел.

1

Другие решения

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

0

По вопросам рекламы [email protected]