在之前我写过如何调用函数,当时的属性都是手搓的,也就是自己写成员变量、变化信号和读写函数,但其实有一个很便捷的方法,即使用Q_PROPERTY,下面给出标准结构:
Q_PROPERTY(数据类型 变量名 READ 变量名 WRITE set变量名 NOTIFY 变量名Changed FINAL)//FINAL 禁止子类覆盖此属性
这句语句也不用记,输入Q_PROPERTY是能够自动补全的,同时在输入变量名时qt也会同步帮你修改后续,只能说是相当的方便。
那里面的函数怎么实现呢?甚至也不需要自己实现,在语句末尾按下alt+enter,选择Generate Missing Q_PROPERTY Members,qt会自动补全没有写的成员和函数声明,并带上函数实现,也属于是一套龙服务了
这是我的代码补全后的样子:
//mediainfo.h...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;
};...
//mediainfo.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中直接访问和绑定了
Button{...onClicked: {musicfile.open()}
}
FileDialog{id:musicfile...onAccepted: {mediasolve.getdata(selectedFile)console.log(mediasolve.currenttitle) //打印 最新标题}
}
MediaInfo{id:mediasolve
}
当然,在极其便利的反面,就是代码可能比较冗长,可能会实现多余的函数,而且性能开销可能会较大。但是熟练运用Q_PROPERTY仍是让开发更加快速、便捷的实用方法~