В 5 версии Qt в QML добавили множество новых элементов для десктоп разработки. Но диллема оказалась в том, что на том же маке применить их оказалось не тривиальной задачей.
Данная библиотека в документации зовется QtQuick.Controls.
Пример кода, созданного с использованием данных элементов выглядит следующим образом:
Так вот, если проект был создан стандартным путем (приложение Qt Quick версии 2.0), то при запуске данного приложения у меня отображалось пустое окно.
Что решить эту проблему, нам лучше создать чистый проект, а все необходимое подключить в ручную.
1. Создаем .pro файл (либо чистим полностью предыдущий) и подключаем:
2. Добавляем main.cpp. Собственно в нем и хранятся наши коренные изменения:
Немного поясню код.
P. S. я опустил вопрос с созданием 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 файла, потому что надеюсь что для вас это уже не проблема.
Охохо, зачем столько велосипедов? Делюсь ссылкой на свой вариант того же решения, только в три раза короче , эленнтнее: https://drive.google.com/file/d/0BwGKNPHf5PHLRmxacGJXUmRuWFU/edit?usp=sharing
ОтветитьУдалитьВоистину :) причем если копирую только С++ код, то не работает. Надо полистать настройки проекта
Удалить