侧边栏壁纸
  • 累计撰写 278 篇文章
  • 累计创建 3 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【QML】QML与C++混合编程

xuanxuan
2022-03-30 / 0 评论 / 0 点赞 / 2 阅读 / 4408 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-02-14,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

QML与C++混合编程

使用QQuickView

pro文件中添加quick模块

#include<QApplication>
#include<QQuickView>

int main(int argc,char* argv[]){
    QApplication app(argc,argv);

    //加载qml文件到视图
    QQuickView view;
    view.setSource(QUrl("column.qml"));
    view.show();

    return app.exec();
}

使用QQmlApplicationEngine

创建Qt Quick Application

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    //支持高频率屏幕
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    //创建qml引擎
    QQmlApplicationEngine engine;

    //引擎加载qml文件
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QML调用C++函数

#ifndef APPLICATIONDATA_H
#define APPLICATIONDATA_H

#include <QObject>
#include <QDateTime>

class ApplicationData : public QObject
{
    Q_OBJECT
public:
    explicit ApplicationData(QObject *parent = nullptr);
    //QML中调用C++函数,这个函数需以Q_INVOKABLE进行标记——注册一个方法到QML
    //或者该函数是Qt的槽函数
    Q_INVOKABLE QDateTime getCurrentDateTime()const{
        return QDateTime::currentDateTime();
    }

signals:

public slots:
};

#endif // APPLICATIONDATA_H
#include <QApplication>
#include <QQuickView>
#include "applicationdata.h"
#include <QQmlContext>

int main(int argc,char* argv[]){
    QApplication app(argc,argv);
    QQuickView view;

    //将C++对象作为属性注册到QML
    ApplicationData data;
    view.rootContext()->setContextProperty("applicationData",&data);
    view.setSource(QUrl("item.qml"));
    view.show();
    return app.exec();
}
import QtQuick 2.0

Text{
    text: applicationData.getCurrentDateTime()

}

C++调用QML函数

import QtQuick 2.0

Text{
    text: applicationData.getCurrentDateTime()
    function qmlFunction(msg){
        console.log("Message comes:",msg)
        return "abc"
    }
}
#include <QApplication>
#include <QQuickView>
#include "applicationdata.h"
#include <QQmlContext>
#include <QQmlApplicationEngine>
#include <QQmlComponent>

int main(int argc,char* argv[]){
    QApplication app(argc,argv);

    QQmlApplicationEngine engine;
    QQmlComponent component(&engine,"item.qml");
    QObject* object = component.create();
    QVariant msg = "Hello qml!";
    QVariant returnedValue;

    //invokeMethod的 Q_RETURN_ARG       Q_ARG参数必须指定为QVariant类型
    QMetaObject::invokeMethod(
         object,
         "qmlFunction",                                            Q_RETURN_ARG(QVariant,returnedValue),//用于接收返回值
         Q_ARG(QVariant,msg));//用于传递函数函数
    qDebug()<<"QML function returned:"<<returnedValue.toString();

    return app.exec();
}

C++接收QML信号

import QtQuick 2.0

Item {
    id:item
    width:100
    height: 100

    signal qmlSignal(string msg)

    MouseArea{
        anchors.fill: parent
        onClicked: item.qmlSignal("Hello qml")
    }
}
#include <QApplication>
#include <QQuickView>
#include<QQuickItem>
#include "myclass.h"

int main(int argc,char* argv[]){
    QApplication app(argc,argv);

    QQuickView view(QUrl::fromLocalFile("quicksignal.qml"));

    QObject* item = view.rootObject();

    MyClass myClass;
    QObject::connect(item,
                     SIGNAL(qmlSignal(QString)),
                     &myClass,
                     SLOT(slotPrint(QString)));
    view.show();
    return app.exec();
}
#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>
#include <QDebug>

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = nullptr);

signals:

public slots:
    void slotPrint(QString s){
        qDebug()<<s;
    }
};

#endif // MYCLASS_H
0

评论区