Comments 37
Чтобы получить applicationDirPath до создания QApplication можете использовать этот код:
PS: мой терминал на чистом QML: youtu.be/UTMOd2s9Vkk
QFileInfo(argv[0]).dir().path()
PS: мой терминал на чистом QML: youtu.be/UTMOd2s9Vkk
+3
Супер терминал получился. QML похоже отлично подходит для такого рода приложений. Интересно узнать подробности. Не хотите статью написать? Где будет использоваться. Используется ли уже? Какие сложности были? и т.п.
0
Сложности были только с заказчиками :)
Программу написал на QML v1. Думаю теперь получиться намного лучше с использованием QML v2.
Но и на QML v1 программа постоянноо выдавала 60 фпс (подлагивание мышки на видео это вина программы что записывала видео).
Когда будет больше свободного времени то напишу.
Терминалы еще не на улицах из-за этих самых сложностей :)
Программу написал на QML v1. Думаю теперь получиться намного лучше с использованием QML v2.
Но и на QML v1 программа постоянноо выдавала 60 фпс (подлагивание мышки на видео это вина программы что записывала видео).
Когда будет больше свободного времени то напишу.
Терминалы еще не на улицах из-за этих самых сложностей :)
+1
этот неловкий момент, когда понимаешь что еще есть куда расти. терминал не сложный, но на чистом qml?
+1
Офигенский терминальчик, не хотят платить — забейте на тех заказчиков, выставьте на аукцион или продайте другому городу.
+2
А вы уверены, что тачскрины на терминалах смогут нормально отрабатывать перетаскивание? Да и вообще возякать пальцем по грязному экрану на улице…
Просто никогда такого не видел.
Просто никогда такого не видел.
0
Странно, когда я разбирался с такой же проблемой, мне хватило документированного способа с подкладыванием qwindows.dll в каталог platforms, созданный рядом с EXE-файлом. Впрочем, если приложение пытается искать плагины где-то в другом месте (кстати, где именно — легко определить через Process Monitor), то достаточно создать файл qt.conf, указав в нём все необходимые пути.
+3
А никто не делал пакетов для деплоя самой платформы Qt? Ну т.е. есть у меня десяток-другой приложений на Qt, самих по себе мелких. С каждым тащить все либы мегабайт на 20 не хочется. Как корректно задеплоить саму Qt, чтобы потом только ставить приложения и все?
0
Все-таки один раз поставить runtime и потом хоть 20 программ по сотне килобайт лучше, чем 20 ужатых программ по 4 МБ.
0
Вам нужно прописать папку с дллками в глобальною переменную PATH или закинуть все длл в папку system32.
Это ответ на ваш вопрос?
Это ответ на ваш вопрос?
0
Да это-то понятно и очевидно. Но может есть более элегантное поддерживаемое решение. Уж чего-чего, а в system32 кидать не хотелось бы.
0
Но может есть более элегантное поддерживаемое решение.
Вам нужно прописать папку с дллками в глобальною переменную PATH
Куда элегантней то?
0
Пожалуйста, не сжимайте их UPX'ом. А тем более в статик сборке. Это бессмысленно, разница между UPX + Inno (LZMA, Ultra) и просто Inno (LZMA, Ultra) будет в пользу последнего.
+2
Все программы работают без инсталятора. Аля Mac OS установка style.
Тесты не показали различий в производительности с UPX и без, только с UPX больше оперативки на 10 мб используеться.
Используеться безопасное автоматическое обновление, в котором качаеться ехе файл и заменяет себя, а тут размер как раз и важен.
Тесты не показали различий в производительности с UPX и без, только с UPX больше оперативки на 10 мб используеться.
Используеться безопасное автоматическое обновление, в котором качаеться ехе файл и заменяет себя, а тут размер как раз и важен.
0
Ну в общем-то, при желании что-то такое изобразить можно… по аналогии с java runtime.
Сделать отдельный инсталлятор, будет, допустим, ставиться в c:\Program Files\Nokia Qt Runtime\5.1.0\
и прописывать веточку в реестре SOFTWARE\Nokia\Qt Runtime\
а в каждом своем приложении при запуске читать реестр, находить нужную веточку (допустим, одно приложение хочет 4.7, другое 5.0.1, третье 5.1.0) — и прописывать у себя пути через setLibraryPaths перед инциализацией QApplication.
В этом отдельном инсталляторе даже крыжики можно предусмотреть для отдельных модулей, а в приложениях проверять весь ли нужный набор установлен.
Остается вопрос: стоит ли этот велосипед потраченных усилий?
Сделать отдельный инсталлятор, будет, допустим, ставиться в c:\Program Files\Nokia Qt Runtime\5.1.0\
и прописывать веточку в реестре SOFTWARE\Nokia\Qt Runtime\
а в каждом своем приложении при запуске читать реестр, находить нужную веточку (допустим, одно приложение хочет 4.7, другое 5.0.1, третье 5.1.0) — и прописывать у себя пути через setLibraryPaths перед инциализацией QApplication.
В этом отдельном инсталляторе даже крыжики можно предусмотреть для отдельных модулей, а в приложениях проверять весь ли нужный набор установлен.
Остается вопрос: стоит ли этот велосипед потраченных усилий?
0
Извиняюсь, промахнулся. После редактирования комментария и кнопки браузера «Назад» оказываеться комментарий не редактируеться а создаеться новый.
0
Чтоб не было подобных проблем, что поправил одну зависимость, а у заказчика выскочила новая. Нужно у себя создавать виртуалку с чистой ос и там тестировать на зависимости.
+2
это верно, зоопарк виртуалок у меня есть с разными ОС/сервис-паками/браузерами, остался после тестирования совместимости тулбара который я делал.
а тут что-то поторопился, перепроверять не стал
а тут что-то поторопился, перепроверять не стал
0
К сожалению, для полной картины нужны виртуалки со всеми распространенными версиями ОС. Недавно для меня стало сюрпризом, что некоторые библиотеки MSVC runtime, предустановленные в Windows 7, отсутствуют по умолчанию в Windows XP.
0
UFO just landed and posted this here
Так я же писал про это.
Не работает, потому что addLibraryPath добавляется уже после создания QApplication, когда приложение уже упало на строчке
QApplication app(argc, argv);
А во-вторых, метод-то статический. Мне кажется неправильным вызывать его через экземпляр, надо как-то так:
QCoreApplication::addLibraryPath();
Не работает, потому что addLibraryPath добавляется уже после создания QApplication, когда приложение уже упало на строчке
QApplication app(argc, argv);
А во-вторых, метод-то статический. Мне кажется неправильным вызывать его через экземпляр, надо как-то так:
QCoreApplication::addLibraryPath();
+1
И чтобы не быть голословным, привожу исходный код QGuiApplication
вот конструктор:
в методе init() идет разбор аргументов командной строки, он длинный, весь приводить его не буду. а еще там есть такое:
Посмотрим на этот метод:
На init_platform все и падает
Наследование классов выглядит так:
QCoreApplication->QGuiApplication->QAppplication
вот конструктор:
#ifdef Q_QDOC
QGuiApplication::QGuiApplication(int &argc, char **argv)
#else
QGuiApplication::QGuiApplication(int &argc, char **argv, int flags)
#endif
: QCoreApplication(*new QGuiApplicationPrivate(argc, argv, flags))
{
d_func()->init();
QCoreApplicationPrivate::eventDispatcher->startingUp();
}
в методе init() идет разбор аргументов командной строки, он длинный, весь приводить его не буду. а еще там есть такое:
if (platform_integration == 0)
createPlatformIntegration();
Посмотрим на этот метод:
void QGuiApplicationPrivate::createPlatformIntegration()
{
// Use the Qt menus by default. Platform plugins that
// want to enable a native menu implementation can clear
// this flag.
QCoreApplication::setAttribute(Qt::AA_DontUseNativeMenuBar, true);
// Load the platform integration
QString platformPluginPath = QLatin1String(qgetenv("QT_QPA_PLATFORM_PLUGIN_PATH"));
QByteArray platformName;
#ifdef QT_QPA_DEFAULT_PLATFORM_NAME
platformName = QT_QPA_DEFAULT_PLATFORM_NAME;
#endif
QByteArray platformNameEnv = qgetenv("QT_QPA_PLATFORM");
if (!platformNameEnv.isEmpty()) {
platformName = platformNameEnv;
}
// Get command line params
int j = argc ? 1 : 0;
for (int i=1; i<argc; i++) {
if (argv[i] && *argv[i] != '-') {
argv[j++] = argv[i];
continue;
}
QByteArray arg = argv[i];
if (arg == "-platformpluginpath") {
if (++i < argc)
platformPluginPath = QLatin1String(argv[i]);
} else if (arg == "-platform") {
if (++i < argc)
platformName = argv[i];
} else {
argv[j++] = argv[i];
}
}
if (j < argc) {
argv[j] = 0;
argc = j;
}
init_platform(QLatin1String(platformName), platformPluginPath);
}
На init_platform все и падает
Наследование классов выглядит так:
QCoreApplication->QGuiApplication->QAppplication
0
man qt.conf уже же наконец.
harmattan-dev.nokia.com/docs/library/html/qt4/qt-conf.html
harmattan-dev.nokia.com/docs/library/html/qt4/qt-conf.html
0
Вроде в документации достаточно понятно написано, что по умолчанию будет искать плигины в каталогах рядом с исполняемым файлом. Т.е. в каталоге с приложением создаем platforms, в него кидаем qwindows.dll и все. И для остальных плагинов таким же образом.
0
Sign up to leave a comment.
Qt 5.1 и корректный deployment в Windows