Кросспост из
блога автора. Комментировать лучше
там, но можно и тут
Прошу
любить, жаловать и скачивать отсюда.
По традиции, расширенно комментирую Changelog:
- 64/32 бита. Протестирована на 10.5 (32 bit),10.6 (64bit) и 10.7 (64bit), может быть
работает и на интеловской 10.4
Надо сказать, что для удержания дистрибутива в приемлемом размере пришлось пересобрать Qt в урезанном варианте (без Webkit, QDeclarative и много чего еще). Иначе размер .app моментально раздувало до 75M, а это уже перебор.
macdeployqt можно попросить не копировать лишнего (-no-plugins), но тогда оно не копирует плагины (сюрприз!), а не только QWebKit и прочих. А без плагинов - кой-чего отваливается и программа крэшится, ага.
- Поправлены размеры шрифтов и контролов в ряде мест (и где были слишком крупные, и где были слишком мелкие).
Отдельное спасибо за совет с Qt::WA_MacMiniSize. Выглядит не очень, ну так QGroupBox на маке в любом случае выглядит так себе.
- Добавлено место на правом краю гистограммы, где 5 цифр не влезало
- Поправлены верхние информационные окошки, все цифры должны (бы) быть видны
- Работает Drag-n-Drop на иконку приложения (за исключением дропа прямо на образ дистрибутивного диска, где работать и не должен).
Про это напишу особо ниже.
- Если About-диалог открыт сразу после запуска программы, то он не закрывается самопроизвольно через несколько секунд.
Так вот, теперь про маковский Drag-n-Drop.
Drop на открытое окно программы обрабатывается как-то стандартно, относительно виндовой версии ничего добавлять не пришлось.
А вот с дропом на не-запущенную программу дело обстоит весело:
- Гугление ничего разумного не дало, то есть совсем.
- Изучая Info.plist разных программ - понял что туда написать, чтобы операционка решила, что дроп поддерживается (CFBundleDocumentTypes). Программа стала запускаться, только дропнутый файл ей в командной строке не передается, тут вам не винды!
- В маковской доке написано, дескать - (void)application:(NSApplication *)sender openFiles:(NSArray *)filenames. И полученный приватно совет гласил то же самое.
Но у меня, я извиняюсь, C++, а не Objective-C. Куда Objective-C намазывать я просто не представляю.
Пошел читать Qt-шные примеры, благо там много про Drag-n-Drop. Экспериментально выяснил, что примеры - дроп на иконку не поддерживают. Но поддерживает Qt Designer. Но он, сука, здоровый, читать его умаешься. Вставляя в него отладочную печать (хорошо что там исходники разумные и имена функций называются человечески, grep Open нашел что мне надо) - выяснил искомое место.
- Оказывается, надо засабклассить QApplication и в ейном event() обработать QEvent::FileOpen.
После этого знания уже удается нагуглить правильных слов, хотя почему ни в Mac-specific-документации, ни в документации на Drag-n-Drop это место не упомянуто - до сих пор загадка.
- И таки да. Это место в Qt обрабатывается куском, написанным на Objective-C.
- И даже более-менее понятно, для чего оно так извращенно сделано, чтобы можно было дропать на иконку в доке (возможно, запущенной программы) и запускалась бы не новая копия, а старая могла бы воспринять. Хотя вот мне продолжает казаться, что это через анус.