Предоставление данных для перетаскивания во время перетаскивания вместо времени перетаскивания - PullRequest
1 голос
/ 02 ноября 2011

У меня есть настольное приложение Qt, которое работает в Linux и Windows.В какой-то момент я надеюсь перенести его на MacOS X и другие * nix-системы тоже.

Моя проблема в том, что часть приложения имеет функциональность, которая позволяет пользователям перетаскивать файлы в ииз архива.Интерфейс подобен WinZip или аналогичным архиваторам на основе графического интерфейса.Но система перетаскивания Qt хочет, чтобы данные были подготовлены, когда пользователь начинает перетаскивать файлы из архива.

В настоящее время я занимаюсь извлечением перетаскиваемых файлов во временную папку и передачей этих имен файлов в качестве данных.,Но это нежелательно, потому что извлечение глубоких деревьев каталогов занимает много времени, и это приводит к зависанию GUI в течение этого времени.Было бы хорошо, если бы я мог выполнить эту операцию, когда пользователь решает удалить файлов, а не когда он / она начинает перетаскивать .К сожалению, документы Qt ничего не говорят об этом.

Я знаю, как этого добиться с помощью Windows API, и я почти уверен, что большинство систем тоже могут это сделать.Но я хочу как можно больше избегать написания кода для конкретной платформы.

Есть ли способ добиться этого с помощью Qt?Я что-то упустил?

1 Ответ

1 голос
/ 03 ноября 2011

Возможно, я неправильно понимаю, но я думаю, что вы хотите предоставить достаточно информации в QMimeData для создаваемого вами QDrag, чтобы вы могли находить файлы в архиве после того, как пользователь удалит их без необходимости сначала извлекать их. Таким образом, если ваш код в исходном коде не знает, из какого архива поступили файлы, вам также необходимо указать путь к архиву в ваших данных MIME.

Перетаскивание начинается как сообщение: «Я перетаскиваю Archive1: FileA, Archive1: FileB», но не извлекаю файл.

Он заканчивается на другом конце, интерпретируя сообщение и затем извлекая файлы. Я бы, наверное, установил какой-то простой ICD для обеих сторон передачи сообщения. Если вы можете перетаскивать только один архив за раз, возможно, список строк, в котором первый элемент является архивом, а следующие - файлы:

QStringList list;
list << archivePath;
list << fileName1;
list << fileName2;

QByteArray ba;
QDataStream stream(&ba);
stream << list;

QMimeData* mime = new QMimeData;
mime->setData("yourType", ba);

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...