Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt QQmlApplicationEngine refuse to display qml code

Tags:

qt

qml

I have this pro file

QT += qml quick widgets
TARGET = sPassKeeper
include(src/src.pri)
include(qml/qml.pri)
RESOURCES += \
    resources.qrc

in src pri and qml pri only single lines qml.pri

OTHER_FILES += \
    qml/main.qml

src.pri

SOURCES += \
    src/main.cpp

In main.cpp got this code

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QQmlApplicationEngine engine(QUrl("qrc:/new/prefix1/qml/main.qml"));
    qDebug() << "Ok engine created";
//    Q_UNUSED(engine)
    return app.exec();
}

main.qml

import QtQuick 2.0
import QtQuick.Controls 1.1

ApplicationWindow{
    title: "sPassKeeper"
    Button{
        text: "Hello"
    }
}

As a result got this output

QML debugging is enabled. Only use this in a safe environment. Ok engine created

Nothing displayed and process is not completed.

like image 667
tty6 Avatar asked Jul 05 '14 09:07

tty6


2 Answers

You're missing this:

ApplicationWindow {
    visible: true

Qt Creator's new project wizard (New File or Project... > Qt Quick Application) has a step where you choose the component set (Select Qt Quick Component Set). If you choose Qt Quick Controls (which are required in order to use ApplicationWindow), Creator generates the correct code for you:

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("Exit")
                onTriggered: Qt.quit();
            }
        }
    }

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
}
like image 175
Mitch Avatar answered Nov 15 '22 07:11

Mitch


You need to create QQuickWindow from object created by engine. This is a peace of code from my project about it:

  engine.load(QUrl(QString(String_val(_qmlpath))));
  QList<QObject*> xs = engine.rootObjects();
  if (xs.count() == 0) {
    Q_ASSERT_X(false, "Creating C++ runtime", "Your QML file seems buggy");
  }
  QQuickWindow *window = qobject_cast<QQuickWindow*>(xs.at(0) );
  window->showMaximized();
  app.exec();
like image 39
Kakadu Avatar answered Nov 15 '22 05:11

Kakadu