Qt QML注册全局对象并调用其函数和属性
在QML中注册全局对象是一种非常便捷的方法。通过将c++类封装为全局对象,QML就可以在不创建实例的情况下直接调用其中的函数和属性。
当然最关键的一点是,QML能通过访问同一个全局变量来实现数据同步,而不是各自维护一份,这自然顺带避免了多余的创建new实例和内存占用,可以说是必须熟练掌握的方法之一了,下面给出注册示例:
一、在main.cpp中注册全局变量
我这里就沿用我之前博客中处理音乐数据的MediaInfo类来写
#include "mediainfo.h"
#include <QQmlContext>int main(int argc, char *argv[])
{...QQmlApplicationEngine engine;.......qmlRegisterType<MediaInfo>("mediainfo",1,0,"MediaInfo");MediaInfo mdif; //创建c++类的实例对象mdifengine.rootContext()->setContextProperty("mdif",&mdif);//engine 加载QML的引擎//.rootContext()拿到根上下文,即全局作用域的“入口”//setContextProperty("命名",对象) 将命名和对象绑定,放入根上下文中... engine.load(url);...
}
二、在QML中通过全局变量调用方法
注册成功后就能够在任何qml文件中直接通过全局变量mdif来调用MediaInfo的函数和属性了
//main.qmlButton{width: 80height: 50anchors.centerIn: parentonClicked: {musicfile.open()}
}
FileDialog{id:musicfiletitle:"选择导入的音乐"nameFilters:["音乐文件(*.mp3 *.flac *.wav)"]fileMode: FileDialog.OpenFileonAccepted: {mdif.getdata(selectedFile) //省略去了创建对象}
}
三、在不同QML文件中通过全局变量读取属性
我这边直接用我之前写的函数做示例了,在 .h 文件中用Q_PROPERTY声明并暴露属性
class MediaInfo : public QObject
{Q_OBJECT
public:...Q_PROPERTY(QString currenttitle READ currenttitle WRITE setCurrenttitle NOTIFY currenttitleChanged FINAL)QString currenttitle() const;void setCurrenttitle(const QString &newCurrenttitle);signals:void currenttitleChanged();private:QString m_currenttitle;
};
然后在 .cpp 中调用
void MediaInfo::getdata(const QString &file)
{......setCurrenttitle("最新标题"); //在自己写的函数中赋值
}QString MediaInfo::currenttitle() const
{return m_currenttitle;
}void MediaInfo::setCurrenttitle(const QString &newCurrenttitle)
{if (m_currenttitle == newCurrenttitle)return;m_currenttitle = newCurrenttitle;emit currenttitleChanged();
}
最后在需要的qml文件中获取属性的值
//ea.qmlItem {Component.onCompleted: {mdif.getdata("")console.log(mdif.currenttitle) //打印 最新标题}
}
至此,我们就成功的完成了在不同QML文件中调用全局对象的方法和属性了。希望对大家有所帮助~