Отмена перетаскивания, если вне приложения

0

Я продолжаю искать по всей сети, но я не могу найти способ ограничить область моего перетаскивания только в моем приложении. Вот как я создаю QDrag:

void                    mouseMoveEvent(QMouseEvent *event)
{
    if (!(event->buttons() & Qt::LeftButton))
        return;
    if ((event->pos() - this->_dragStartPos).manhattanLength()
        < QApplication::startDragDistance())
        return;
    if (this->topLevelItemCount() < 1)
        return;

    QDrag *drag = new QDrag(this);
    QMimeData *mimeData = new QMimeData;

    QList<QTreeWidgetItem*> list = this->selectedItems();
    QList<QUrl> urlList;
    for (int i = 0; i < list.size(); i++)
    {
        QFileInfo fileToAdd(list.at(i)->data(0, CustomRole::Path).toString());

        QUrl add(QUrl::fromLocalFile(fileToAdd.absoluteFilePath()));
        urlList.append(add);
    }

    mimeData->setUrls(urlList);
    drag->setMimeData(mimeData);
    drag->setPixmap(QPixmap(":/icons/grey-folder-opened"));

    Qt::DropAction dropAction = drag->exec(Qt::CopyAction);
    qDebug() << "finish dragging" << dropAction;
    delete drag;
}

Существует сигнал targetChanged, но в отношении Qt doc о функции exec: "В Windows цикл событий Qt блокируется во время операции".

Я также установил весь мой другой виджет, чтобы отключить перетаскивание. Я пытаюсь переопределить dragLeaveEvent из QMainWindow, чтобы игнорировать все из них, но nah, ничего не изменилось...

Теги:
qt

1 ответ

0
Лучший ответ

Наконец, я решил создать свой собственный тип MIME, добавив это к предыдущему коду:

[...]
QByteArray ba;
QDataStream ds(&ba, QIODevice::WriteOnly);
ds << urlList;

mimeData->setData("application/x-fc-windows", ba);
[...]

Работайте как шарм!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню