Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Вовастый от Январь 29, 2014, 11:48



Название: drag and drop: перетянуть файл с QListWidget в проводник
Отправлено: Вовастый от Январь 29, 2014, 11:48
Здравствуйте!
Имеется QListWidget, в котором формируется список файлов перетянутых пользователем с проводника Windows.
Пытаюсь реализовать перемещение файлов обратно в проводник, но пока безрезультатно. Вот функция, которая отвечает за перемещение:

Код:
void FileListWidget::startDrag()
{
    QListWidgetItem *item = currentItem();
    if (item) {
        QMimeData *mimeData = new QMimeData;
 
        // 1 mimeData->setUrls():
        QUrl url(item->text());
        QList<QUrl> urls;
        urls.append(url);
        mimeData->setUrls(urls);
 
        // 2 mimeData->setText():
//        mimeData->setText(item->text());
 
        // 3 mimeData->setData():
//        QFile src(item->text());
//        QByteArray a = src.readAll();
//        src.close();
//        mimeData->setData("text/uri-list", a);
 
        // 4 Clipboard:
//        QClipboard *clipboard = QApplication::clipboard();
//        clipboard->setMimeData(mimeData);
 
        QDrag *drag = new QDrag(this);
        drag->setMimeData(mimeData);
        if (drag->start(Qt::MoveAction) == Qt::MoveAction)
            delete item;
    }
}

Как видно по комментариям, попытка перетащить файл делалась несколькими способами, при каждом из них были следующие результаты:
OS Linux:
mimeData->setUrls() и mimeData->setText() создавали файл с правильным именем файла, но неправильными содержимым (просто строка с путем к файлу) и расширением (*.txt)
setData() и Clipboard у меня не сработали вообще, правда курсор менялся на "готов что-то скинуть".
OS Windows:
Здесь у меня результаты еще плачевнее, курсор во всех случаях "дает запрет" на вставку файла.

Буду очень благодарен за помощь.
Заранее спасибо.


Название: Re: drag and drop: перетянуть файл с QListWidget в проводник
Отправлено: Вовастый от Январь 30, 2014, 10:08
Все заработало! Просто я не считывал файл и перетаскивал его содержимое, а перетаскивал только имя файла.
Вот рабочая версия функции startDrag():
Код:
void FileListWidget::startDrag()
{
    QListWidgetItem *item = currentItem();
    if (item) {
        QFileInfo fi(item->text());
        QUrl url = QUrl::fromLocalFile(fi.absoluteFilePath());
        QMimeData *mimeData = new QMimeData;
        mimeData->setUrls(QList<QUrl>() << url);

        QDrag *drag = new QDrag(this);
        drag->setMimeData(mimeData);
        drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction);
    }
}


Название: Re: drag and drop: перетянуть файл с QListWidget в проводник
Отправлено: _OLEGator_ от Январь 30, 2014, 11:32
Просто я не считывал файл и перетаскивал его содержимое, а перетаскивал только имя файла.
Причем здесь содержимое файла не ясно. Судя по коду ошибка была в том, что требовалось лишь указать абсолютный путь к файлу?


Название: Re: drag and drop: перетянуть файл с QListWidget в проводник
Отправлено: Вовастый от Январь 30, 2014, 12:48
Ну да, Вы правы, я не так выразился  :)