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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: драг & дроп наружу приложения  (Прочитано 5989 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Январь 07, 2010, 19:48 »

Дано - архив с файлами. Нужно - отследить конец драга наружу приложения (допустим в эксплорер) и в этот момент произвести разархивацию файлов. Под виндой так работает винрар, под маком - вмваре, под линуксом - арк. Ковыряние сорцов арка мало чего дало, ибо не для средних умов.
Записан
Rcus
Гость
« Ответ #1 : Январь 07, 2010, 20:59 »

Как раз в арке то все просто
Код
C++ (Qt)
   //prepare the dbus-based drag/drop mimedata
   QMimeData *data = new QMimeData();
   data->setData("application/x-kde-dndextract",
                 QDBusConnection::sessionBus().baseService().toUtf8()
                );
 
Соответственно в сервисе есть объект /DndExtract который соответствует интерфейсу org.kde.DndExtract
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Январь 07, 2010, 21:11 »

и что это делает? там еще дальше
Код:
    if (!noFallback)
        kiolist.populateMimeData(data);
    return data;
где вроде как запихиваются урлки... разъясни поподробней нафиг тут dbus
Записан
Rcus
Гость
« Ответ #3 : Январь 07, 2010, 21:27 »

Ну а для ответа на этот вопрос нужно apt-get source dolphin и погрепать на наличие dndextract
Код
C++ (Qt)
void DragAndDropHelper::dropUrls(const KFileItem& destItem,
                                const KUrl& destPath,
                                QDropEvent* event,
                                QWidget* widget)
{
   const bool dropToItem = !destItem.isNull() && (destItem.isDir() || destItem.isDesktopFile());
   const KUrl destination = dropToItem ? destItem.url() : destPath;
 
   const QMimeData* mimeData = event->mimeData();
   if (mimeData->hasFormat("application/x-kde-dndextract")) {
       QString remoteDBusClient = mimeData->data("application/x-kde-dndextract");
       QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, "/DndExtract",
                                                             "org.kde.DndExtract", "extractSelectedFilesTo");
       message.setArguments(QVariantList() << destination.path());
       QDBusConnection::sessionBus().call(message);
   } else {
       const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
       const int urlsCount = urls.count();
       if (urlsCount == 0) {
           // TODO: handle dropping of other data
       } else if ((urlsCount == 1) && (urls.first() == destination)) {
           emit errorMessage(i18nc("@info:status", "A folder cannot be dropped into itself"));
       } else if (dropToItem) {
           KonqOperations::doDrop(destItem, destination, event, widget);
       } else {
           KonqOperations::doDrop(KFileItem(), destination, event, widget);
       }
   }
}
 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Январь 07, 2010, 21:30 »

а как же дроп в конкерор и боже упаси наутилус?
Записан
Rcus
Гость
« Ответ #5 : Январь 07, 2010, 21:54 »

Наутилус? (поставил - никак) Конк скорее всего через KIO прогоняет URL - в нем достаточно информации: формат архива в схеме и полный путь к архиву и файлу в архиве.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Январь 07, 2010, 22:16 »

мда, таки разработчики KDE криворуки:( ну хоошо, проблему-то как решать? все равно мне нужны винда и мак...
« Последнее редактирование: Январь 08, 2010, 00:43 от Dendy » Записан
Rcus
Гость
« Ответ #7 : Январь 07, 2010, 22:33 »

Таки не надо инсинуаций, в каких X11 средах с этим лучше? KDE и Gnome только недавно договорились о едином программном интерфейсе для уведомлений...
Дальше я копать не буду, на самом деле реализация DnD совсем далеко от моего рабочего профиля, а тут мне просто интересно было почитать исходники.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Январь 10, 2010, 14:49 »

ап... любители винапи, где вы?Улыбающийся
Записан
Tonal
Гость
« Ответ #9 : Январь 13, 2010, 08:27 »

В винде при операциях с клипбоардом можно не отдавать данные сразу. Тогда как только они кому-то понадобятся, тебе прилетит сообщение:
http://msdn.microsoft.com/en-us/library/ms649016%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms649051%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms649016%28VS.85%29.aspx#_win32_Processing_the_WM_RENDERFORMAT_and_WM_RENDERALLFORMATS_Messages

А в случае тащибросая работа идёт с набором комовских классов. За данные отвечает IDataObject, за процесс IDropSource и IDropTarget.
Описание самого процесса для файлов: Transferring Shell Objects with Drag-and-Drop and the Clipboard
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Январь 13, 2010, 17:23 »

ага, спасибо, учитаюсь:) Если что непонятно, спрошу)
теперь под макось бы:)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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