QML用來做界面,在不考慮資料的請款下,那是溜溜的,但是,程式是沒有不和背景資料互動的,但是了,QML在資料處理方面的效率又是不敢恭維的,這裡就出現了QML負責前端界面,而後端使用JS或者C++了。
那麼,QML調用C++有兩種方式,這裡詳細需要看以為大神提供的内容,放上大神連結
http://blog.csdn.net/foruok/article/details/32698603這兩就講一下這兩種調用的差別及用法
注意 下面的内容都是按照我的了解來的,如果有什麼錯誤,還請指出
上結構圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SO2UDO0kTNzUjNwIGZ3MjYmdzM0UDN3UWOmZTZklzMz8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
第一種方式,把一個C++類注冊成為一個QML的全局屬性,這樣,這個屬性在任何時候任意地方都可以被QML檔案調用,就和每一個QML空間的屬性一樣簡單
我的PCpp類就是被我注冊成為了一個QML的全局屬性
下面是詳細代碼
PCpp.h
#ifndef PCPP_H
#define PCPP_H
#include
class PCpp : public QObject
{
Q_OBJECT
public:
explicit PCpp(QObject *parent = 0);
Q_INVOKABLE void showLog();
};
#endif // PCPP_H
PCpp.c
#include "pcpp.h"
PCpp::PCpp(QObject *parent) : QObject(parent)
}
void PCpp::showLog()
qDebug()<<"PCpp";
沒有具體的内容,這裡就是輸出了一行LOg
運作截圖
第二種方式了,在我了解看來,就是吧C++注冊成為一個QML的元件,類似BUtton等空間
那麼在中方式,首先需要注意的就是
必須在QML程式之前建立,不然QML不識别
還有就是,當我們想要使用的時候,是必須初始化出來這個元件才可以了,這個在跨檔案使用的時候會有許多問題。
上詳細代碼
TCpp.h
#ifndef TCPP_H
#define TCPP_H
class TCpp : public QObject
explicit TCpp(QObject *parent = 0);
#endif // TCPP_H
TCpp.cpp
#include "tcpp.h"
TCpp::TCpp(QObject *parent) : QObject(parent)
void TCpp::showLog()
qDebug()<<"TCpp";
QML檔案調用
import QtQuick 2.5
import QtQuick.Controls 1.4
import TCpp 1.0
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
MouseArea
{
anchors.fill: parent
onClicked:
{
Demo1.showLog()
mytcpp.showLog()
}
}
TCpp
id:mytcpp
這裡剩下最為關鍵的,就是C++的注冊部分
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "pcpp.h"
#include "tcpp.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qmlRegisterType<TCpp>("TCpp",1,0,"TCpp");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QQmlContext *context = engine.rootContext();
PCpp *damo1 = new PCpp();
context->setContextProperty("Demo1",damo1);
return app.exec();
}
注意,這句話必須解除安裝QML引擎的前面,不然是沒法使用的