При розробці програми на Qt може статися така ситуація, коли потрібно додаток, написаний на QWidgets впровадити функціонал, написаний на QML. Для вирішення подібного завдання може використовуватися клас QQuickWidget , який служить для рендерингу QML.
Напишемо найпростіший hello world, який дозволить відмалювати код, написаний на QML у віджеті, який поміщений у вікно, засноване на QWidget. Щоб воно виглядало так:
Налаштування Pro файлу
Щоб скористатися об'єктом даного класу, необхідно в Pro файлі проекту підключити модуль quickwidgets. Також додамо ресурсний файл, у якому будуть qml файли, а саме файл QmlLabel.qml.
QT += core gui quickwidgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = qmlwidget TEMPLATE = app DEFINES += QT_DEPRECATED_WARNINGS SOURCES += main.cpp\ widget.cpp HEADERS += widget.h FORMS += widget.ui RESOURCES += \ qml.qrc
віджет.h
У заголовному файлі вікна програми підключимо заголовний файл QQuickWidget та оголосимо об'єкт даного класу.
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QQuickWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget* ui; QQuickWidget* m_quickWidget; }; #endif // WIDGET_H
widget.cpp
Проект створювався за допомогою дизайнера інтерфейсів, тому в коді буде тільки додавання об'єкта QQuickWidget у розміщення Grid Layout , яке відповідає за компонування віджетів у вікні.
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); m_quickWidget = new QQuickWidget(this) ; m_quickWidget->setSource(QUrl("qrc:/QmlLabel.qml")); m_quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); ui->gridLayout->addWidget(m_quickWidget, 1, 0); } Widget::~Widget() { delete ui; }
QmlLabel.qml
Вміст Hello World на QML
import QtQuick 2.5 import QtQuick.Controls 2.1 Item { Text { id: text text: qsTr("Hello world") anchors.centerIn: parent } }