1、QML调用(实例化)C++类
方法一:C++使用属性系统Q_PROPERTY
优点:
- 可以方便的利用Qt的属性系统从QML中访问C++类中的属性。在QML程序中定义该C++类时会直接实例化该类。
缺点:
- 无法在C++中对QML中实例化的类对象进行操作;
- 只能访问使用属性系统Q_PROPERTY声明的属性;
- 无法设置QML中访问指定的对象,即无法访问C++中的单例;
详细描述:
- 使用Qt Creator中的"Qt Quick Application"模板创建一个新的项目;
注意:取消选中New Project Wizard的Define Project Details部分中的With ui.qml文件选项。
- 添加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处理该信号。
- 在main.cpp中注册该方法到QML
包含头文件Call_Back.h
使用qmlRegisterType<BackEnd>("io.qt.examples", 1, 0, "Call_Back");注册方法; - 将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处理信号。