При разработке приложения на 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
widget.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 } }