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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Customize Native QFileDialog  (Прочитано 4765 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Май 04, 2014, 09:05 »

Добрый день

Платформы OSX и Windows. На обоих есть возможность кастомизировать нативные файловые диалоги, т.е. добавить туда свои контролы. Сейчас так и сделано, но в связи с портированием на Cocoa (OSX) придется переписывать. Возиться с тонной нативного кода не хочется, понятно желание задействовать QFileDialog, но как быть с кастомными контролами? Использовать НЕнативный вариант нельзя, писать свой тоже, обязательное требование "только нативный". Что посоветуете?

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Май 04, 2014, 12:23 »

насколько я знаю, QFileDialog не позволяет легко и просто кастомизировать нативный диалог, так что от нативняка никуда не деться. для сохранения единого интерфейса можно попробовать так:
Код
C++ (Qt)
QFileDialog dlg;
customize(dlg); // реализация находится в *_win.cpp и в *_mac.m(m)
dlg.exec();
либо унаследоваться от QFileDialog и сделать метод customize членом.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 05, 2014, 11:41 »

насколько я знаю, QFileDialog не позволяет легко и просто кастомизировать нативный диалог, так что от нативняка никуда не деться. для сохранения единого интерфейса можно попробовать так:
Код
C++ (Qt)
QFileDialog dlg;
customize(dlg); // реализация находится в *_win.cpp и в *_mac.m(m)
dlg.exec();
либо унаследоваться от QFileDialog и сделать метод customize членом.
А что я буду делать в customize, т.е. как мне вклиниться в код Qt? Посмотрел исходники 5.2, дело сводится к QCocoaFileDialogHelper у которого void * mDelegate (хз что с ним делать). Еще неприятность: на OSX файл в первую очередь должен опознаваться по типу (а потом уже по extension). Как я понял QFileDialog этого не делает  Плачущий
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Май 05, 2014, 12:55 »

ну обычно это делается так:
Код
C++ (Qt)
NSView *dlgView = dlg.winId();
дальше можно посмотреть реальный тип этого dlgView, посмотреть что там за сабвью и поискать среди них нативный файлодиалог.
Посмотрел исходники 5.2, дело сводится к QCocoaFileDialogHelper у которого void * mDelegate (хз что с ним делать)
вероятнее всего это ObjC'шный id<ляляляDelegate> delegate (опять же можно в рантайме посмотреть) — делегат файлового диалога, его колбэк-методы можно в эппловской документации посмотреть. если до него нельзя достучаться из своего кода, то придется делать класс-обертку чисто нативных вызовов диалогов (сейчас наверное так и сделано).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 05, 2014, 13:33 »

то придется делать класс-обертку чисто нативных вызовов диалогов (сейчас наверное так и сделано).
Да, но для Carbon (NavCustomControl и.т.п) и кода там немало. А сейчас надо все по новой под какаву  Плачущий Нативняк - дело неблагодарное. Вынужден признать что на Вындоуз с совместимостью получше (работает со времен win95)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Май 05, 2014, 16:50 »

я уверен там надо не более получаса на этот диалог убить. могу написать если с обжс туговато.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Май 05, 2014, 18:51 »

ради интереса посмотрел как создать диалог открытия файлов, оказалось вовсе несложно:
Код
Objective-C
   NSTextField *textField = [[NSTextField alloc] initWithFrame:CGRectMake(0, 0, 50, 20)];
   [textField setStringValue:@"test"];
 
   NSOpenPanel *openPanel = [NSOpenPanel openPanel];
   [openPanel setAccessoryView:textField];
   [openPanel setAllowsMultipleSelection:YES];
   [openPanel beginWithCompletionHandler:^(NSInteger result) {
       if (result) {
           NSLog(@"selected file(s): %@", [openPanel URLs]);
       }
   }];
если нужна поддержка ОС до 10.6, надо другой метод открытия использовать (см. документацию)
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 06, 2014, 10:09 »

ради интереса посмотрел как создать диалог открытия файлов, оказалось вовсе несложно:
Код
Objective-C
   NSTextField *textField = [[NSTextField alloc] initWithFrame:CGRectMake(0, 0, 50, 20)];
   [textField setStringValue:@"test"];
 
   NSOpenPanel *openPanel = [NSOpenPanel openPanel];
   [openPanel setAccessoryView:textField];
   [openPanel setAllowsMultipleSelection:YES];
   [openPanel beginWithCompletionHandler:^(NSInteger result) {
       if (result) {
           NSLog(@"selected file(s): %@", [openPanel URLs]);
       }
   }];
если нужна поддержка ОС до 10.6, надо другой метод открытия использовать (см. документацию)
До 10.6 не нужна. Да, на карбоне там нааамного больше, наверное и с коллбэками ситуация та же. Т.е. выходит лучше прямолинейно писать под какаву, связываться с QFileDialog нет смысла?

Спасибо
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Май 06, 2014, 13:13 »

Т.е. выходит лучше прямолинейно писать под какаву, связываться с QFileDialog нет смысла?
будет намного проще и не будет никаких претензий к ненативности
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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