Qt文档阅读笔记-QQmlApplicationEngine解析与实例(qml与C++混合编程及QQuick与widgets混合)
目錄
?
官方解析
博主例子
?
?
官方解析
QQmlApplicationEngine提供了從一個QML文件里面加載應用程序的方式。
這類聯合了QQmlEngine和QmlComponent去加載單獨的QML文件。他還向QML提供了應用程序的功能,這個應用程序的功能能夠讓C++與QML混合編程,使用C++控制業務邏輯,用QML做界面:
官方給的用法:
他這個不像QQuickView,QQmlApplicationEngine那樣,他不會自動創建一個根窗口,如果你使用Qt Quick里面的視覺item,你需要把qml里面加一個Window,然后將其放進去。
如果不使用需要QGuiApplication的QML模塊(比如QtQuick)可以使用QCoreApplication與QQmlApplicationEngine。
下面列出了默認QQmlEngine關聯了的配置列表:
1.QML中的Qt.quit()與QCoreApplication::quit()關聯在了一起;
2.自動從主QML文件附近加載翻譯文件;
3.如果存在QQuickWIndow就會自動設置an incubation controller;
4.會自動設置QQmlFileSelector作為url攔截,應用于QML文件選擇;
通過繼承QQmlEngine可以更好的實現
?
博主例子
下面來補充下官方的例子(官方只給出了3行代碼現在把他完善起來)
完善后包含如下內容:
qml與C++混合編程及QQuick與widgets混合
?
做一個qml實現的表格,C++來控制業務,程序運行截圖如下:
程序結構圖如下:
源碼如下:
mytableviewmodel.h
#ifndef MYTABLEVIEWMODEL_H #define MYTABLEVIEWMODEL_H#include <QAbstractTableModel>class MyTableViewModel: public QAbstractTableModel {Q_OBJECT public:MyTableViewModel();int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;Q_INVOKABLE void addItem(QString one, QString two, QString three);private:QVector<QVector<QString>> m_aryData;};#endif // MYTABLEVIEWMODEL_Hmain.cpp
#include <QGuiApplication> #include <QApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include <QWidget> #include <QQuickView> #include "mytableviewmodel.h"int main(int argc, char *argv[]) {QGuiApplication app(argc, argv);QQmlApplicationEngine engine;MyTableViewModel model;model.addItem(QStringLiteral("中文"), QStringLiteral("999"), QStringLiteral("888"));engine.rootContext()->setContextProperty("theModel", &model);engine.load(QUrl(QLatin1String("qrc:/main.qml")));return app.exec(); }mytableviewmodel.cpp
#include "mytableviewmodel.h"MyTableViewModel::MyTableViewModel(): QAbstractTableModel(NULL) {}int MyTableViewModel::rowCount(const QModelIndex &parent) const {Q_UNUSED(parent)return m_aryData.size(); }int MyTableViewModel::columnCount(const QModelIndex &parent) const {Q_UNUSED(parent)return 3; }QVariant MyTableViewModel::data(const QModelIndex &index, int role) const {return m_aryData[index.row()][role]; }QHash<int, QByteArray> MyTableViewModel::roleNames() const {QHash<int, QByteArray> roles;roles[0] = "1";roles[1] = "2";roles[2] = "3";return roles; }void MyTableViewModel::addItem(QString one, QString two, QString three) {beginInsertRows(QModelIndex(), m_aryData.size(),m_aryData.size());QVector<QString> list;list << one << two << three;m_aryData << list;endInsertRows(); }main.qml
import QtQuick 2.8 import QtQuick.Controls 2.1ApplicationWindow {//id: frmWindow//width: 400//height: 300visible: trueMyTableView{id: myTableViewheight: parent.heightwidth: parent.widthfocus: falsetableView.itemDelegate:Rectangle {TextField{id: textFieldheight: 25text: styleData.value}}tableView.rowDelegate: Rectangle {height: 25}} }MyTableView.qml
import QtQuick 2.8 import QtQuick.Controls 1.4TableView {property alias tableView: tableViewid: tableViewTableViewColumn {title: "第一列"; role: "1"; width: 120}TableViewColumn {title: "第二列"; role: "2"; width: 120}TableViewColumn {title: "第三列"; role: "3"; width: 120}model: theModel }?
如果要用qml和傳統widgets混合,因為QQuickView已經提供了轉化為QWidget的接口,所以很簡單,修改如下代碼:
main.cpp
#include <QGuiApplication> #include <QApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include <QWidget> #include <QQuickView> #include "mytableviewmodel.h"int main(int argc, char *argv[]) {//與傳統widgets結合QApplication app(argc, argv);QQuickView view;MyTableViewModel model;model.addItem(QStringLiteral("中文"), QStringLiteral("999"), QStringLiteral("888"));view.engine()->rootContext()->setContextProperty("theModel", &model);view.setResizeMode(QQuickView::SizeRootObjectToView);view.setSource(QUrl("qrc:/main.qml"));QWidget *widget = QWidget::createWindowContainer(&view);widget->show();return app.exec(); }main.qml
import QtQuick 2.8 import QtQuick.Controls 2.1Item {//id: frmWindow//width: 400//height: 300visible: trueMyTableView{id: myTableViewheight: parent.heightwidth: parent.widthfocus: falsetableView.itemDelegate:Rectangle {TextField{id: textFieldheight: 25text: styleData.value}}tableView.rowDelegate: Rectangle {height: 25}} }?
總結
以上是生活随笔為你收集整理的Qt文档阅读笔记-QQmlApplicationEngine解析与实例(qml与C++混合编程及QQuick与widgets混合)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件设计师习题笔记-重点习题六
- 下一篇: OpenCV如何修改Mat中某像素(某通