QML实例化C++的类

本文详细介绍了如何在QML中实例化和调用C++类,包括使用Q_PROPERTY和公开方法两种方式。同时,还探讨了C++如何访问QML对象的属性、函数和信号,强调了C++对象嵌入到QML中作为上下文属性的使用,以及QML如何处理C++对象的信号。
摘要由CSDN通过智能技术生成

1、QML调用(实例化)C++类

方法一:C++使用属性系统Q_PROPERTY

优点:

  • 可以方便的利用Qt的属性系统从QML中访问C++类中的属性。在QML程序中定义该C++类时会直接实例化该类。

缺点:

  • 无法在C++中对QML中实例化的类对象进行操作;
  • 只能访问使用属性系统Q_PROPERTY声明的属性;
  • 无法设置QML中访问指定的对象,即无法访问C++中的单例;

详细描述:

  1. 使用Qt Creator中的"Qt Quick Application"模板创建一个新的项目;

注意:取消选中New Project Wizard的Define Project Details部分中的With ui.qml文件选项。

  1. 添加C++类,命名为Call_Back,作为QML中使用的C++类,类的方法如下:

头文件

#ifndef CALL_BACK_H
#define CALL_BACK_H

#include <QObject>
#include <QString>

class Call_Back: public QObject
{
Q_OBJECT
//只读,只写,改变信号
Q_PROPERTY(QString userName READ userName WRITE setuserName NOTIFY userNameChanged)
public:
explicit Call_Back(QObject *parent = nullptr);
QString userName;
void setuserName(const QString &userName);
void callClassFunction();

signals:
void userNameChanged();

private:
QString m_userName;

};

#endif // CALL_BACK_H

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓


源文件

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


// 构造函数
Call_Back::Call_Back(QObject *parent):
QObject(parent)
{
qDebug() << "-------Class construct-------";
m_userName = "hello world";
}

QString Call_Back::userName()
{
qDebug() << __FILE__ << __func__ << m_userName;
return m_userName;
}

void Call_Back::setuserName(const QString &userName)
{
qDebug() << __FILE__ << __func__ << userName;
if (userName == m_userName)
return;

m_userName = userName;
emit userNameChanged();
}

void Call_Back::callClassFunction()
{
qDebug() << __FILE__ << __func__ << __LINE__;
}

每次值改变时,该setUserName函数都会>发出userNameChanged信号。可以在QML中使用onUserNameChanged处理该信号。

  1. 在main.cpp中注册该方法到QML
    包含头文件Call_Back.h
    使用qmlRegisterType<BackEnd>("io.qt.examples", 1, 0, "Call_Back");注册方法;
  2. 将main.qml的内容替换如下:

main.qml

import QtQuick 2.6
import QtQuick.Controls 2.0
import io.qt.examples 1.0
//io.qt.examples 是使用qmlRegisterType进行注册的方法,名称必须和注册时一致
ApplicationWindow {
id: root
width: 300
height: 480
visible: true

BackEnd {
id: backend
}

Text {
id: txt1
x: 20
y: 20

text: backend.userName

}

TextField {
text: backend.userName
placeholderText: qsTr("User name")
anchors.centerIn: parent

onTextChanged:{
backend.userName = text
}
}
}

每当m_userName的值发生变化时,setUserName函数就会发出userNameChanged信号。可以使用onUserNameChanged处理程序从QML处理信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值