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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Статическая сборка + статические плагины (QtQuick, QtQuick.Controls)  (Прочитано 4160 раз)
mib383
Гость
« : Июнь 03, 2014, 14:18 »

Всем привет.
Собрал Qt статически - все получилось. Создал проект QtQuick, откомпилировал. Файл занимает  24 мб (собственно вот почему считаю, что получилось), также запускается не из QtCreator (еще одно доказательство), запускается нормально, я вижу интерфейс. Но при попытке запустить файл на другом компьютере - он запускается но без интерфейса (в TaskManager его можно найти). Подскажите в чем проблема (подозреваю что в плагинах) и самое главное - как ее решить. Заранее спасибо.

.pro - файл:
Код:
TEMPLATE = app

QT += qml quick widgets
SOURCES += main.cpp

RESOURCES += qml.qrc

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Default rules for deployment.
include(deployment.pri)

main.cpp
Код:
#include <QApplication>
#include <QQmlApplicationEngine>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

main.qml
Код:
import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit2")
                onTriggered: Qt.quit();
            }
        }
    }

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
}
« Последнее редактирование: Июнь 10, 2014, 13:25 от mib383 » Записан
mib383
Гость
« Ответ #1 : Июнь 10, 2014, 12:17 »

Сделал некоторый прогресс.
Удалось подключить плагины при помощи <QtPlugin> и <QQmlExtensionPlugin>.
Если создавать проект QtQuick 2.2, тогда все работает и плагины подключаются статически.

qml:
Код:
import QtQuick 2.2
//import QtQuick.Controls 1.1

Rectangle{
    width: 200
    height: 200
    color: "LightGreen"
}
cpp:
Код:
#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QQuickView>
#include <QtPlugin>
#include <QQmlEngine>


#include <QQmlExtensionPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
Q_IMPORT_PLUGIN(QtQuick2Plugin)

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2Plugin().instance())->registerTypes("QtQuick");

    QQuickView viewer;
    viewer.engine()->setImportPathList(QStringList());
    viewer.setSource(QUrl(QStringLiteral("qrc:///main.qml")));
    viewer.show();

    return app.exec();
}

Но проблема возникает при попытке подключить QtQuick.Controls. Дело в том, что здесь уже не обойтись двумя плагинами QWindowsIntegrationPlugin и QtQuick2Plugin. Для работы необходимо добавить еще ряд плагинов (см. код):
qml:
Код:
import QtQuick 2.2
import QtQuick.Controls 1.1

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World"&#41;

    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit2")
                onTriggered: Qt.quit();
            }
        }
    }

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
}
cpp:
Код:
#include <QApplication>
#include <QQmlApplicationEngine>

#include <QtPlugin>
#include <QQmlExtensionPlugin>

Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
Q_IMPORT_PLUGIN(QtQuick2Plugin)
Q_IMPORT_PLUGIN(QtQuickControlsPlugin)
Q_IMPORT_PLUGIN(QtQuickLayoutsPlugin)
Q_IMPORT_PLUGIN(QtQuick2WindowPlugin)

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2Plugin().instance())->registerTypes("QtQuick");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls.Private");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls.Styles");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickLayoutsPlugin().instance())->registerTypes("QtQuick.Layouts");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuick2WindowPlugin().instance())->registerTypes("QtQuick.Window");

    QQmlApplicationEngine engine;
    engine.setImportPathList(QStringList());
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}
Вроде бы все нормально, но при попытке компиляции выдает: "ContentItem is not a type".
Есть подозрения, что проблема в строчках:
Код:
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls.Private");
    qobject_cast<QQmlExtensionPlugin*>(qt_static_plugin_QtQuickControlsPlugin().instance())->registerTypes("QtQuick.Controls.Styles");
т.е. типы находящиеся в QtQuick.Controls.Private "зарегистрированы" неправильно, ибо ContentItem как раз оттуда (посмотрел qmldir).
Причем плагин для QtQuick.Controls существует а для QtQuick.Controls.Private, видимо Private зашит в QtQuick.Controls...

Без этих двух строчек пишет, что не найден модуль QtQuick.Controls.Private и QtQuick.Controls.Styles.

В общем не знаю... Помогите кто чем сможет. У меня идеи закончились.
Записан
mib383
Гость
« Ответ #2 : Июнь 11, 2014, 12:41 »

Неужели никто не знает в чем дело...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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