1、准备工作
C++方负责数据,QML负责显示,先准备工作如下:
(1)新建一个数据类,继承至QObject
class Cdata : public QObject
(2)将有交互关系的数据,加入到类的私有成员中
private:
int iNum;
QString strEdit;
(3)给此成员Q_PROPERTY和相应的函数实现(ALT+回车可自动创建)
Q_PROPERTY(int iNum READ getINum WRITE setINum NOTIFY iNumChanged)
setINum中要有emit iNumChanged();
Q_PROPERTY(QString strEdit READ getStrEdit WRITE setStrEdit NOTIFY strEditChanged)
函数实现:
int Cdata::getINum() const
{
return iNum;
}
void Cdata::setINum(int newINum)
{
if (iNum == newINum)
return;
iNum = newINum;
emit iNumChanged();
}
2、C++数据变化,QML控件显示变化后的数据
例如:现在在Cdata中,新建一个定时器,每秒iNum数据+1;QML中有个按钮,按钮的显示值是iNum的值。现在要求QML上按钮的值随iNum每秒更新。
(1)main.c中注册此数据类到QML。
qmlRegisterType(“CData”,1,0,“CdataS”);
(2)QML中引入此类
import CData 1.0
CdataS{
id:cdatas
}
(3)将按钮的显示值设置成iNum
Button{
text:cdatas.iNum
}
(4)重点:在Cdata的定时器槽函数中,iNum变化后,发送一个值改变的信号,QML中由于绑定,iNum的值将更新在按钮显示上。
void Cdata::update()
{
iNum++;
emit iNumChanged();
}
3、QML控件被操作,C++端数据接收操作后的值
例如:在QML中,有一个编辑控件,当改变控件输入的值,在C++数据收到改变后的值,不使用信号槽绑定操作
3.1 在QML中调用属性的set方法
(1)setStrEdit函数加Q_INVOKABLE 宏
Q_INVOKABLE void setStrEdit(const QString &newStrEdit);
(2)控件属性变化时,调用set方法
TextEdit{
id:textedit
text:cdatas.strEdit
onTextChanged: {
cdatas.setStrEdit(textedit.text);
}
}
}文章来源:https://www.toymoban.com/news/detail-764822.html
3.2 在QML中直接赋值
(1)setStrEdit函数加Q_INVOKABLE 宏
Q_INVOKABLE void setStrEdit(const QString &newStrEdit);
(2)控件属性变化时,直接赋值
TextEdit{
id:textedit
text:cdatas.strEdit
onTextChanged: {
cdatas.strEdit = textedit.text;
}
}
}文章来源地址https://www.toymoban.com/news/detail-764822.html
到了这里,关于QT C++类与QML交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!