Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Май 04, 2014, 09:05



Название: Customize Native QFileDialog
Отправлено: Igors от Май 04, 2014, 09:05
Добрый день

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

Спасибо


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


Название: Re: Customize Native QFileDialog
Отправлено: Igors от Май 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 этого не делает  :'(


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


Название: Re: Customize Native QFileDialog
Отправлено: Igors от Май 05, 2014, 13:33
то придется делать класс-обертку чисто нативных вызовов диалогов (сейчас наверное так и сделано).
Да, но для Carbon (NavCustomControl и.т.п) и кода там немало. А сейчас надо все по новой под какаву  :'( Нативняк - дело неблагодарное. Вынужден признать что на Вындоуз с совместимостью получше (работает со времен win95)


Название: Re: Customize Native QFileDialog
Отправлено: kambala от Май 05, 2014, 16:50
я уверен там надо не более получаса на этот диалог убить. могу написать если с обжс туговато.


Название: Re: Customize Native QFileDialog
Отправлено: kambala от Май 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, надо другой метод открытия использовать (см. документацию)


Название: Re: Customize Native QFileDialog
Отправлено: Igors от Май 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 нет смысла?

Спасибо


Название: Re: Customize Native QFileDialog
Отправлено: kambala от Май 06, 2014, 13:13
Т.е. выходит лучше прямолинейно писать под какаву, связываться с QFileDialog нет смысла?
будет намного проще и не будет никаких претензий к ненативности