пятница, 4 октября 2013 г.

Создание ApplicationWindow в QML для qt 5.1

В 5 версии Qt в QML добавили множество новых элементов для десктоп разработки. Но диллема оказалась в том, что на том же маке применить их оказалось не тривиальной задачей.



Данная библиотека в документации зовется QtQuick.Controls.
Пример кода, созданного с использованием данных элементов выглядит следующим образом:
import QtQuick 2.1
import QtQuick.Controls 1.0

ApplicationWindow {
    title: "My Application"
    width: 480
    height: 420

    Button {
        text: "Push Me"
        anchors.centerIn: parent
        width: 100
        height: 100

    }

}

Так вот, если проект был создан стандартным путем (приложение Qt Quick версии 2.0), то при запуске данного приложения у меня отображалось пустое окно.
Что решить эту проблему, нам лучше создать чистый проект, а все необходимое подключить в ручную.

1. Создаем .pro файл (либо чистим полностью предыдущий) и подключаем:

QT += qml quick widgets

2. Добавляем main.cpp. Собственно в нем и хранятся наши коренные изменения:
#include <QQmlApplicationEngine>
#include <QtQuick/QQuickItem>
#include <QQuickWindow>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;
    QFile file("://qml/elementsTest/main.qml");
    if (file.open(QFile::ReadOnly))
    {
        qDebug() << "tut";
        engine.loadData(file.readAll());
        QObject *topLevel = engine.rootObjects().value(0);
        QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
        if ( !window ) {
            qWarning("Error: Your root item has to be a Window.");
            return -1;
        }
        window->show();
    }

    return app.exec();

}

Немного поясню код.

    QFile file("://qml/elementsTest/main.qml");
Здесь я подгружаю файл с QML кодом. Он начинается с :/ потому что файл хранится в qrc, т.е. в ресурсах.

        QObject *topLevel = engine.rootObjects().value(0);
        QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
Здесь мы берем объект верхнего уровня. Если мы посмотрим в QML код в начале поста, ты мы увидим наш объект - ApplicationWindow. А далее мы делаем преобразование и пытаемся отобразить это окно.

P. S. я опустил вопрос с созданием qml файла, потому что надеюсь что для вас это уже не проблема.

2 комментария:

  1. Охохо, зачем столько велосипедов? Делюсь ссылкой на свой вариант того же решения, только в три раза короче , эленнтнее: https://drive.google.com/file/d/0BwGKNPHf5PHLRmxacGJXUmRuWFU/edit?usp=sharing

    ОтветитьУдалить
    Ответы
    1. Воистину :) причем если копирую только С++ код, то не работает. Надо полистать настройки проекта

      Удалить