天天看點

Qt-QML-QML調用C++類

QML用來做界面,在不考慮資料的請款下,那是溜溜的,但是,程式是沒有不和背景資料互動的,但是了,QML在資料處理方面的效率又是不敢恭維的,這裡就出現了QML負責前端界面,而後端使用JS或者C++了。

那麼,QML調用C++有兩種方式,這裡詳細需要看以為大神提供的内容,放上大神連結

http://blog.csdn.net/foruok/article/details/32698603

這兩就講一下這兩種調用的差別及用法

注意 下面的内容都是按照我的了解來的,如果有什麼錯誤,還請指出

上結構圖

Qt-QML-QML調用C++類

第一種方式,把一個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

Qt-QML-QML調用C++類

運作截圖

第二種方式了,在我了解看來,就是吧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";

Qt-QML-QML調用C++類

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();
}      
Qt-QML-QML調用C++類

注意,這句話必須解除安裝QML引擎的前面,不然是沒法使用的

繼續閱讀