Russian Qt Forum
Май 22, 2024, 10:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: drag and drop: перетянуть файл с QListWidget в проводник  (Прочитано 2400 раз)
Вовастый
Гость
« : Январь 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:
Здесь у меня результаты еще плачевнее, курсор во всех случаях "дает запрет" на вставку файла.

Буду очень благодарен за помощь.
Заранее спасибо.
Записан
Вовастый
Гость
« Ответ #1 : Январь 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);
    }
}
Записан
_OLEGator_
Гость
« Ответ #2 : Январь 30, 2014, 11:32 »

Просто я не считывал файл и перетаскивал его содержимое, а перетаскивал только имя файла.
Причем здесь содержимое файла не ясно. Судя по коду ошибка была в том, что требовалось лишь указать абсолютный путь к файлу?
Записан
Вовастый
Гость
« Ответ #3 : Январь 30, 2014, 12:48 »

Ну да, Вы правы, я не так выразился  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.182 секунд. Запросов: 20.