/**
LogicProcessor.h

#ifndef LOGICPROCESSOR_H
#define LOGICPROCESSOR_H

#include <QObject>
#include <QTimer>
class LogicProcessor
        : public QObject
{
    Q_OBJECT
public:
    LogicProcessor();

    // \brief  计算两个整数的加运算
    // \retval 返回运算后的数据
    Q_INVOKABLE QString machining(const int num, const int num2);
signals:

    // \brief  Qml发送请求测试C++接收信号
    // \param  Qml输入数据
    Q_INVOKABLE void requestCppPrintSignal(const QVariant&);

    // \brief  C++发送Ping请求到Qml的测试信号
    // \param  Qml输入数据
    Q_INVOKABLE void cppPingQmlSignal(const QString& param);
private slots:

    // \brief  C++发送Ping请求到Qml的测试处理槽方法
    // \param  Qml输入数据
    void requestCppPrintSlot(const QVariant&);

    // \brief  C++发送Ping请求到Qml的测试信号
    void timeoutPingQmlSlot();
private:
    QTimer m_tm;
};
#endif // LOGICPROCESSOR_H

*/
/**
LogicProcessor.cpp

#include "logicprocessor.h"
#include <QDebug>

LogicProcessor::LogicProcessor()
{
    connect(this,SIGNAL(requestCppPrintSignal(const QVariant&)),this,SLOT(requestCppPrintSlot(const QVariant&)));

    connect(&m_tm,SIGNAL(timeout()), this, SLOT(timeoutPingQmlSlot()));
    m_tm.setInterval(std::chrono::milliseconds(1000));
    m_tm.start();
}

QString LogicProcessor::machining(const int num, const int num2)
{
    return QString::number(num + num2);
}

void LogicProcessor::requestCppPrintSlot(const QVariant & var)
{
    qDebug() << __func__ << " Cpp 输出 " << var;
}

void LogicProcessor::timeoutPingQmlSlot()
{
    emit cppPingQmlSignal("来自Cpp的问候 >> Hello World");
    m_tm.stop();
}
*/
/**
main.cpp
#include <QtQml>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "logicprocessor.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    LogicProcessor logic_object;

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.rootContext()->setContextProperty("logic_object", &logic_object);
    engine.load(url);

    return app.exec();
}
*/
/**
main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.5

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Button {

        id: trigger
        width: 100
        height: 30
        text: "10 + 10 ="
        onClicked: {

            // Qml发送请求测试C++数据接收
            logic_object.requestCppPrintSignal("Qml Send Message: Hell word")
            // 调用C++ API
            logic_result.text = logic_object.machining(10,10)
        }
    }

    Text {
        anchors.left: trigger.right
        id: logic_result
        text: qsTr("null")
    }

    function print_ping(str) {

        console.log("QML >> " + str)
    }

    Component.onCompleted: {

        // 连接C++类信号
        logic_object.cppPingQmlSignal.connect(print_ping)
    }
}
*/
总结
  • C++ 中的 API 如果会被 QML 调用时,需要在 API 前置声明部分使用 Q_INVOKABLE 关键之标注 >> Q_INVOKABLE [return_type] [function_name] ([param...]);
posted on 2020-12-16 16:15  怪小子  阅读(312)  评论(0编辑  收藏  举报