В моем приложении Qt в Windows у меня есть виджет, который служит в качестве цели перетаскивания для файлов или папок, перетаскиваемых из других приложений. Когда виджет получает действие удаления и пути из MIME, он копирует файлы и обрабатывает их определенным образом. Хорошо работает при копировании обычных файлов или папок, например из проводника Windows или из Total Commander. Также было бы неплохо принимать файлы, непосредственно извлеченные из архива, например, с помощью 7Z (7zip). Когда я открываю архив в приложении 7Z и перетаскиваю его на свой виджет, виджет получает QDropEvent
с действием Qt::CopyAction
, форматами MIME ("text/uri-list")
и вектором путей (URI). Проблема в том, что пути ведут к временной папке где-то в ..../AppData/Local/Temp/....etc.
, и, прежде чем мне удается обработать файлы, кто-то (я предполагаю, 7Z) немедленно удаляет их. Я не знаю, как получить больше времени для их обработки или связи с источником перетаскивания, чтобы не удалять их. Кажется, что некоторые другие программы, выступающие в качестве целей удаления, хорошо справляются с этой проблемой, например Windows Explorer или Total Commander могут без проблем использоваться в качестве мишеней для 7Z. Есть идеи, как они это делают? Можно ли сделать то же самое в приложении Qt?
UPDATE:
Я обнаружил, что извлеченные временные файлы не удаляются, пока цикл обработки событий моего приложения не завершит обработку события удаления (независимо от того, вызываю ли я event->acceptProposedAction()
или нет). Так что, если бы я обработал все файлы в обработчике событий, было бы хорошо. Но обработка (или даже копирование больших файлов) занимает много времени, и выполнение этого в основном потоке блокирует графический интерфейс, поэтому я делаю это в другом потоке. Это означает, что событие обрабатывается и 7Z сообщается раньше, чем завершается другой поток. Есть ли способ отложить завершение обработки этого события удаления, т. Е. Отложить ответ на 7Z?