Pull to refresh

Comments 37

Чтобы получить applicationDirPath до создания QApplication можете использовать этот код:
QFileInfo(argv[0]).dir().path()

PS: мой терминал на чистом QML: youtu.be/UTMOd2s9Vkk
Супер терминал получился. QML похоже отлично подходит для такого рода приложений. Интересно узнать подробности. Не хотите статью написать? Где будет использоваться. Используется ли уже? Какие сложности были? и т.п.
Сложности были только с заказчиками :)
Программу написал на QML v1. Думаю теперь получиться намного лучше с использованием QML v2.
Но и на QML v1 программа постоянноо выдавала 60 фпс (подлагивание мышки на видео это вина программы что записывала видео).
Когда будет больше свободного времени то напишу.
Терминалы еще не на улицах из-за этих самых сложностей :)
этот неловкий момент, когда понимаешь что еще есть куда расти. терминал не сложный, но на чистом qml?
Да, на чистом QML 1 и немножко JavaScript для упрощения настроек подключяемых карт.
Qt использовался только для синхронизации переменных.
А вы покажите свою программу?
Офигенский терминальчик, не хотят платить — забейте на тех заказчиков, выставьте на аукцион или продайте другому городу.
А вы уверены, что тачскрины на терминалах смогут нормально отрабатывать перетаскивание? Да и вообще возякать пальцем по грязному экрану на улице…
Просто никогда такого не видел.
Вот более старое видео ранней версии с демонстрацией работы на самом тачскрине.
А эти две программы разрабатывал в 2008 году, когда не было QML вовсе: первое, второе.
Терминалов с первого видео было штук 30, с перетаскиванием проблем никогда не было.
Странно, когда я разбирался с такой же проблемой, мне хватило документированного способа с подкладыванием qwindows.dll в каталог platforms, созданный рядом с EXE-файлом. Впрочем, если приложение пытается искать плагины где-то в другом месте (кстати, где именно — легко определить через Process Monitor), то достаточно создать файл qt.conf, указав в нём все необходимые пути.
а раньше в какой версии? в 4.7 у меня тоже работало. спасибо за подсказку про qt.conf, этого способа я не нашел
Разбираться с этим начал с версией 5.0.1 или 5.0.2, а после релиза 5.1.0 пересобрал программу и ещё раз проверил, что всё продолжает работать.
А никто не делал пакетов для деплоя самой платформы Qt? Ну т.е. есть у меня десяток-другой приложений на Qt, самих по себе мелких. С каждым тащить все либы мегабайт на 20 не хочется. Как корректно задеплоить саму Qt, чтобы потом только ставить приложения и все?
Во первых, каждую длл можно сжать UPX'ом и получиться меньший размер.
Во вторых, можно сделать статик сборку и получиться один файл, а потом его UPX'ом, выйдет до 4 мб.
Мои примеры: раз, два.
Все-таки один раз поставить runtime и потом хоть 20 программ по сотне килобайт лучше, чем 20 ужатых программ по 4 МБ.
Вам нужно прописать папку с дллками в глобальною переменную PATH или закинуть все длл в папку system32.
Это ответ на ваш вопрос?
Да это-то понятно и очевидно. Но может есть более элегантное поддерживаемое решение. Уж чего-чего, а в system32 кидать не хотелось бы.
Но может есть более элегантное поддерживаемое решение.

Вам нужно прописать папку с дллками в глобальною переменную PATH

Куда элегантней то?
Честно, я боюсь конфликтов в сторонних приложениях. Особенно если они будут использовать одну и ту же ветку Qt. Пропишу я свой, возможно более новый рантайм, а тут привет, не работает сторонний софт.
Пожалуйста, не сжимайте их UPX'ом. А тем более в статик сборке. Это бессмысленно, разница между UPX + Inno (LZMA, Ultra) и просто Inno (LZMA, Ultra) будет в пользу последнего.
Все программы работают без инсталятора. Аля Mac OS установка style.
Тесты не показали различий в производительности с UPX и без, только с UPX больше оперативки на 10 мб используеться.
Используеться безопасное автоматическое обновление, в котором качаеться ехе файл и заменяет себя, а тут размер как раз и важен.
При таком раскладе, соглашусь, неплохой вариант. Вы весь свой софт в таком форм-факторе поставляете?
Open Source софт да.
А коммерческий в шаред сборке и с инсталлятором.
Ну в общем-то, при желании что-то такое изобразить можно… по аналогии с 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.
В этом отдельном инсталляторе даже крыжики можно предусмотреть для отдельных модулей, а в приложениях проверять весь ли нужный набор установлен.
Остается вопрос: стоит ли этот велосипед потраченных усилий?
Извиняюсь, промахнулся. После редактирования комментария и кнопки браузера «Назад» оказываеться комментарий не редактируеться а создаеться новый.
Чтоб не было подобных проблем, что поправил одну зависимость, а у заказчика выскочила новая. Нужно у себя создавать виртуалку с чистой ос и там тестировать на зависимости.
это верно, зоопарк виртуалок у меня есть с разными ОС/сервис-паками/браузерами, остался после тестирования совместимости тулбара который я делал.
а тут что-то поторопился, перепроверять не стал
К сожалению, для полной картины нужны виртуалки со всеми распространенными версиями ОС. Недавно для меня стало сюрпризом, что некоторые библиотеки MSVC runtime, предустановленные в Windows 7, отсутствуют по умолчанию в Windows XP.
Правильно. Потому я у себя и держу:
— Windows XP (x86, x64)
— Windows Vista (x86, x64)
— Windows 7 (x86, x64)
— Windows 8 (x86, x64)
UFO just landed and posted this here
Так я же писал про это.
Не работает, потому что addLibraryPath добавляется уже после создания QApplication, когда приложение уже упало на строчке
QApplication app(argc, argv);
А во-вторых, метод-то статический. Мне кажется неправильным вызывать его через экземпляр, надо как-то так:
QCoreApplication::addLibraryPath();
И чтобы не быть голословным, привожу исходный код QGuiApplication
вот конструктор:
#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

UFO just landed and posted this here
Вроде в документации достаточно понятно написано, что по умолчанию будет искать плигины в каталогах рядом с исполняемым файлом. Т.е. в каталоге с приложением создаем platforms, в него кидаем qwindows.dll и все. И для остальных плагинов таким же образом.
Sign up to leave a comment.

Articles