Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
3 / 3 / 1
Регистрация: 03.09.2010
Сообщений: 12

Drag and drop: перетянуть файл с QListWidget в проводник

28.01.2014, 23:12. Показов 4815. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Имеется QListWidget, в котором формируется список файлов перетянутых пользователем с проводника Windows.
Пытаюсь реализовать перемещение файлов обратно в проводник, но пока безрезультатно. Вот функция, которая отвечает за перемещение:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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:
Здесь у меня результаты еще плачевнее, курсор во всех случаях "дает запрет" на вставку файла.

Для целостной картины выложу всю реализацию моего ListWidget'а:

FileListWidget.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <QtGui>
#include <QListWidget>
 
class FileListWidget : public QListWidget {
    Q_OBJECT
 
public:
    FileListWidget(QWidget *parent = 0);
 
    void setNewCurrentItem();
 
protected:
    void dragEnterEvent(QDragEnterEvent*);
    void dropEvent(QDropEvent*);
    // new methods:
    void mousePressEvent(QMouseEvent*);
    void mouseMoveEvent(QMouseEvent*);
    void dragMoveEvent(QDragMoveEvent*);
 
private:
    QListWidgetItem *newCurrentItem;
    // new members:
    QPoint startPos;
    void startDrag();
};

FileListWidget.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "FileListWidget.h"
#include <QApplication>
 
#include <QDebug>
 
FileListWidget::FileListWidget(QWidget *parent) :
    QListWidget(parent)
{    
    setAcceptDrops(true);
    setSelectionMode(QAbstractItemView::SingleSelection);
    setDropIndicatorShown(true);
    setDragDropMode(QAbstractItemView::InternalMove);
    setAlternatingRowColors(true);
}
 
void FileListWidget::dragEnterEvent(QDragEnterEvent *e)
{
    if (e->mimeData()->hasUrls())
        e->acceptProposedAction();
}
 
void FileListWidget::dropEvent(QDropEvent *e)
{
    if (e->mimeData()->hasUrls()) {
        QList<QUrl> urls = e->mimeData()->urls();
        foreach (QUrl url, urls)
            newCurrentItem = (new QListWidgetItem(url.toLocalFile(), this));
        e->setDropAction(Qt::CopyAction);
        e->accept();
    }
}
 
void FileListWidget::setNewCurrentItem()
{
    setCurrentItem(newCurrentItem);
}
 
// new methods:
 
void FileListWidget::mousePressEvent(QMouseEvent *e)
{
    if (e->button() == Qt::LeftButton)
        startPos = e->pos();
    QListWidget::mousePressEvent(e);
}
 
void FileListWidget::mouseMoveEvent(QMouseEvent *e)
{
    if (e->buttons() & Qt::LeftButton) {
        int distance = (e->pos() - startPos).manhattanLength();
        if (distance >= QApplication::startDragDistance())
            startDrag();
    }
    QListWidget::mouseMoveEvent(e);
}
 
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;
    }
}
 
 
void FileListWidget::dragMoveEvent(QDragMoveEvent *e)
{
    if (e->mimeData()->hasUrls())
        e->acceptProposedAction();
}
Буду очень благодарен за помощь.
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2014, 23:12
Ответы с готовыми решениями:

Drag and Drop между QListWidget и QGraphicsView
Решил сделать список графических элементов, которые перетаскиванием нужно будет размещать на сцене. И выяснил, что элементы с QListWidget...

Запрет на добавление новых строк в QTableWidget при drag and drop из QListWidget
Я еще во всем этом не разбираюсь, прошу помощи. Все делается в Qt Creator 4.2.1, компилятор qt 5.8.0 MSVC 2015, 32 бита. В общем,...

Drag & Drop, как определить, что мы тащим видео файл?
Добрый день! Как определить, что мы тащим видео файл?

1
3 / 3 / 1
Регистрация: 03.09.2010
Сообщений: 12
30.01.2014, 11:06  [ТС]
Все заработало! Просто я не считывал файл и перетаскивал его содержимое, а перетаскивал только имя файла.
Вот рабочая версия функции startDrag():
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2014, 11:06
Помогаю со студенческими работами здесь

Drag and Drop
Нужна помощь в реализации D&amp;D в своей программе. Вообщем, у меня имеется классы наследующие QGraphicsView и QGraphicsPixmapItem. Нужно...

Drag and drop
Доброго времени суток! Задача такая, с помощью Drag and drop перенести какой-либо виджет(это может быть кнопка,картинка или что-то в этом...

Drag n Drop
В общем пытаюсь сделать drag n drop . имеется textEdit , туда перетаскиваю текстовый файл. В заголовке окна высвечивается открытый текущий...

Drag & Drop
Доброго! Подскажите пожалуйста, перекрыл dropEvent (QDropEvent * event) в QTableWidget-e, тяну с QListWidget-а элемент, бросаю в таблицу....

Drag and Drop QWidget
Здравствуйте. Имею на своем MainWindow Qwidgets(QTabWidget,QTreeView,QListView,MyWidget), необходимо сделать Drag and Drop для этих...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru