日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Qt文档阅读笔记-QQmlApplicationEngine解析与实例(qml与C++混合编程及QQuick与widgets混合)

發布時間:2025/3/15 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt文档阅读笔记-QQmlApplicationEngine解析与实例(qml与C++混合编程及QQuick与widgets混合) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

官方解析

博主例子


?

?

官方解析

QQmlApplicationEngine提供了從一個QML文件里面加載應用程序的方式。
這類聯合了QQmlEngine和QmlComponent去加載單獨的QML文件。他還向QML提供了應用程序的功能,這個應用程序的功能能夠讓C++與QML混合編程,使用C++控制業務邏輯,用QML做界面:
官方給的用法:

QQuickWidget *view = new QQuickWidget;view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));view->show();

他這個不像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_H

main.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混合)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。