Всем привет.
Собрал 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
}
}
Сделал некоторый прогресс.
Удалось подключить плагины при помощи <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")
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.
В общем не знаю... Помогите кто чем сможет. У меня идеи закончились.
Неужели никто не знает в чем дело...