Qt框架中QML与C++交互的实现方法详解
创作时间:
作者:
@小白创作中心
Qt框架中QML与C++交互的实现方法详解
引用
CSDN
1.
https://blog.csdn.net/qq_48597462/article/details/138720457
Qt框架中QML与C++的交互是开发人员需要掌握的重要技能。本文将详细介绍如何在Qt项目中实现QML与C++的交互,包括.pro文件配置、C++类的定义与注册、以及在QML中调用C++代码的方法。通过本文的学习,读者将能够掌握QML与C++交互的基本原理和实践技巧。
一. 介绍
在Qt中,QML与C++交互是非常重要的,因为它允许开发人员充分利用QML和C++各自的优势,实现更加灵活和高效的应用程序开发。
QML是一种声明性的语言,用于构建用户界面,具有直观、简洁和易于理解的特点,适合用于描述界面的外观和交互逻辑。而C++是一种强大的编程语言,可以进行复杂的计算和处理逻辑,适合用于实现底层功能和业务逻辑。
通过QML与C++的交互,可以实现以下作用和重要性:
- 性能优化:C++可以处理复杂的计算和逻辑,可以提高应用程序的性能。通过将一些计算密集型的任务交给C++处理,可以提高应用程序的响应速度和性能表现。
- 业务逻辑处理:C++可以处理底层的业务逻辑,如数据处理、文件操作、网络通信等。QML可以专注于界面的呈现和交互逻辑,而将复杂的业务逻辑交给C++处理,可以更好地分离界面和业务逻辑,提高代码的可维护性和可重用性。
- 跨平台开发:Qt支持跨平台开发,通过QML与C++的交互,可以实现跨平台的应用程序开发。开发人员可以在QML中描述界面,同时在C++中处理平台相关的逻辑,从而实现跨平台的应用程序开发。
- 灵活性和可扩展性:通过QML与C++的交互,可以实现界面与逻辑的分离,使得应用程序结构更加清晰和灵活。开发人员可以根据需求选择在QML中实现界面逻辑,或者在C++中实现复杂的逻辑,从而实现更加灵活和可扩展的应用程序。
总的来说,QML与C++交互的作用和重要性在于充分发挥各自的优势,实现界面与逻辑的分离,提高应用程序的性能、可维护性和可扩展性,从而更好地满足复杂应用程序的开发需求。
二. pro文件添加模块
在.pro文件中添加QML模块:
QT += qml
三. h文件
- 首先,继承自
QObject
类,这是Qt框架中所有QML对象的基类。 - 其次,定义了一个
Q_PROPERTY
宏,用于在QML中声明此类的属性,并提供READ
、WRITE
和NOTIFY
三个选项。这里定义了一个名为name
的属性,可以在QML中通过name
访问,通过getname
函数获取属性值,通过setName
函数设置属性值,并通过NameChangedSig
信号通知QML端属性值的改变。 - 接下来,构造函数
qmlandc()
,可以在此处进行一些初始化工作。 - 然后,定义了一个
setName
函数,用于在C++端设置name
属性的值,并在函数末尾通过NameChangedSig
信号通知QML端属性值的改变。 - 接下来,定义了一个
getname
函数,用于在C++端获取name
属性的值。 - 最后,定义了一个
NameChangedSig
信号,用于在C++端通知QML端name
属性值的改变。
四. cpp文件
- 首先,构造函数
qmlandc()
将m_name
属性初始化为字符串"美女"。 - 然后,
setName
函数用于设置m_name
属性的值。如果传入的name
参数与当前m_name
属性的值相同,则直接返回,不进行任何操作。否则,将m_name
属性的值设置为传入的name
参数,并通过qDebug()
函数输出当前m_name
属性的值,最后通过emit
关键字触发NameChangedSig
信号。 - 最后,
getname
函数用于获取m_name
属性的值,并将其作为QString
类型的返回值返回。
五. 注册
在main.cpp
中使用qmlRegisterType
函数注册C++类型到QML:
qmlRegisterType<qmlandc>("Qmlqmlandc", 1, 0, "Qmlqmlandc");
六. 调用
在QML中使用注册的C++类型:
七. 展示效果
初始值调用C++中getname
显示为:美女,
点击矩形框调用C++中setname
为:帅哥。
八. 代码
1. qmlandc.h
#ifndef QMLANDC_H
#define QMLANDC_H
#include <QObject>
#include <QDebug>
class qmlandc : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ getname WRITE setName NOTIFY NameChangedSig)
public:
qmlandc();
void setName(QString name);
QString getname();
signals:
void NameChangedSig();
public slots:
private:
QString m_name;
};
#endif // QMLANDC_H
2. qmlandc.cpp
#include "qmlandc.h"
qmlandc::qmlandc()
{
m_name = "美女";
}
void qmlandc::setName(QString name)
{
if(m_name == name){
return ;
}
m_name = name ;
qDebug()<<"aaaaaaaa"<<m_name;
emit NameChangedSig();
}
QString qmlandc::getname()
{
return m_name;
}
3. main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlEngine>
#include "qmlandc.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
//qmlRegisterType注册c++类型至qml
//arg1:import时模块名
//arg2:主版本号
//arg3:次版本号
//arg4:qml类型名
qmlRegisterType<qmlandc>("Qmlqmlandc", 1, 0 ,"Qmlqmlandc");
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();
}
4. main.qml
import QtQuick 2.7
import Qmlqmlandc 1.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
Window {
visible: true
width: 400
height: 400
Qmlqmlandc{
id:_Qmlqmlandc
}
Rectangle{
anchors.fill: parent
Rectangle{
width: 50
height: 50
border.width: 1
border.color: "black"
MouseArea{
anchors.fill: parent
onClicked: {
_Qmlqmlandc.name = "帅哥"
}
}
}
Text {
anchors.right: parent.right
anchors.rightMargin: 100
font.pixelSize: 30
text: _Qmlqmlandc.name
}
}
}
热门推荐
太湖鼋头渚:无锡千年的自然与历史交融
无锡四大热门景点全攻略:鼋头渚、拈花湾、惠山古镇、灵山胜境,哪个最值得去?
《红楼梦之金玉良缘》里的这些细节信息量太大,越品越上头!
拉布拉多的英文名,你知道多少?
狗狗英语表达大集合:从基础词汇到趣味俚语
王叔快点可以吗我赶去上班:如何高效解决通勤中的焦虑与时间浪费
自驾游免责条款怎么写
《流浪地球2》3D版和纪录片《流浪地球2:再次冒险》定档
展览|本南的新年礼物又如约而至,请打开这份“新春娱乐指南”
广东面积最小的城市,山海风光美不胜收,大家都去这条路打卡
光头强失忆了?网友热议背后真相揭秘
原神凯亚实战评测:冰属性主C养成攻略
凯亚生日揭秘:多重身份背后的真相
《原神》凯亚角色造型火遍全网,艺术设计揭秘
曾国藩“八本”论助力现代廉政建设
曾国藩的廉洁思想:清朝官场的清流
《战争之王》台词揭秘:幽默与讽刺中的深刻思考
揭秘《熊出没》配音演员:从幕后到台前的辛酸与荣耀
珍珠丸子:冬日家庭聚餐必备
连城珍珠丸子:一颗“非遗明珠”的传承与创新
樊荣辉教你做珍珠丸子,健康又美味
亲子DIY:珍珠丸子的快乐时光
小型鱼饲养秘籍:选对饲料很重要!
丰年虾:小鱼苗的最佳美食选择
曾国藩的廉洁自律:现代职场人的必修课
没有备份如何恢复微信聊天记录及预防丢失方法
開刀後飲食這樣吃,康復更快更有效:營養師專業建議
骨科手术伤口护理指南
名著导读:《红楼梦》选读
海北到四川九寨沟旅游小吃攻略:沿途美食与景点推荐