Qml中调用C++
在qml中调用C++类步骤如下:
方法一
1. 写一个C++类
写一个类,继承自QObject。将类中需要qml调用的方法,用前置的Q_INVOKABLE声明。属性用 Q_PROPERTY注册。
代码如下:
//testsum.h
#ifndef TESTS,LMLLM,L. UM_H
#define TESTSUM_H
#include <QObject>
//继承Q_OBJECT
class TestSum : public QObject
{
//此处要有
Q_OBJECT
//需要定义GetSum() SetSum() 信号SumChanged
Q_PROPERTY(int sum READ GetSum WRITE SetSum NOTIFY SumChanged)
public:
explicit TestSum(QObject *parent = nullptr);
int GetSum() const;
void SetSum(const int & sum);
//Q_INVOKABLE 让其在qml可以调用
Q_INVOKABLE void SumAdd() ;
signals:
//在sum发生改变时发送该信号
void SumChanged(int value);
public slots:
//此槽函数由qml处调用触发
void sumReduce();
private:
int m_sum;
};
#endif // TESTSUM_H
//testsum.cpp
#include "testsum.h"
#include<QDebug>
TestSum::TestSum(QObject *parent) : QObject(parent)
{
qDebug()<<Q_FUNC_INFO<<endl;
m_sum = 5;
qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}
int TestSum::GetSum() const
{
qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
return m_sum;
}
void TestSum::SetSum(const int &sum)
{
qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
m_sum = sum;
qDebug()<<Q_FUNC_INFO<<"send signale"<<m_sum<<endl;
emit SumChanged(m_sum);
qDebug()<<Q_FUNC_INFO<<"send signale============"<<m_sum<<endl;
}
void TestSum::SumAdd()
{
qDebug()<<Q_FUNC_INFO<<endl;
m_sum++;
qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}
void TestSum::sumReduce()
{
qDebug()<<Q_FUNC_INFO<<endl;
m_sum--;
qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}
2. 在需要使用的地方注册该类
//main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include"testsum.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
//注册类 包名+版本号 ,以及使用的对象TestSum
qmlRegisterType<TestSum>("com.test.testSum", 1, 0, "TestSum");
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.load(url);
return app.exec();
}
3. qml 中调用
import QtQuick 2.12
import QtQuick.Window 2.12
import com.test.testSum 1.0 // 注意此处 与步骤二中的一致(包名+版本号)
import QtQuick.Controls 1.4
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Rectangle {
anchors.fill: parent
width: 360;
height: 360;
id:r1;
//此处将TestSum像正常qml控件一样调用。
TestSum {
id: ts;
sum: 10; //此处会调用SetSum函数
}
Button{
id:b1;
text:"Add";
anchors.left:r1.left
onClicked: {
ts.sum += 1; //先调用GetSum 在调用SetSum,发送信号
}
}
Button{
id:b2;
text:"Add";
anchors.left:b1.left
onClicked: {
ts.sumReduce();
}
}
}
Connections {
target: ts;
onSumChanged:{
//单击按钮,发送信号的接受端此处,由于ts.sum ,先调用GetSum.
console.log("qml onSumChanged",ts.sum)
}
}
}