/**
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...])
;
作者:
怪小子
Github:
https://github.com/MrSunHua
邮箱:sh4a01@163.com
本文版权归作者和博客园共有,欢迎转载,如文章有版权冲突或者有更好的见解及建议,还望联系博主讨论并修改。