一.C++调用QML函数
//1.必须在添加到main.cpp文件 engine.load(url)后面才有效 是后面
QList<QObject *> listObj = engine.rootObjects();
//2.必须先设置QML中控件属性objectName:objectName1,才能找到。
//如果设置的是main.qml中的根控件,就是他本身,不需要找子类,直接QObject * obj = listObj.first()就行。
QObject * obj = listObj.first()->findChild<QObject*>("objectName1");
QVariant ret;
QVariant param1("参数1");
//3.通过元对象,调用函数或者信号,传参与获取返回值,
//C++类型选择QVariant,QML 信号类型选择用var;
QMetaObject::invokeMethod(obj,"function1",
Q_RETURN_ARG(QVariant,ret),Q_ARG(QVariant,param1) );
QMetaObject::invokeMethod(obj,"sigTest",
Q_ARG(QVariant,param1));
qDebug()<<"ret:"<<ret.toString();
二.QML调用C++函数
首先创建一个test的C++类 DataDeal,QML测试按钮 button
//1.C++类函数前必须加 Q_INVOKABLE
class DataDeal : public QObject
{
Q_OBJECT
private:
explicit DataDeal(QObject *parent = nullptr);
public:
Q_INVOKABLE QString setStr(QString str)
{
qDebug()<<"C++函数被调用:"<<str;
emit sigSetstr(str);//发射C++信号
return str;
}
signals:
void sigSetstr(QString str);
public slots:
void SlotOnclick()
{
qDebug()<<"C++槽函数被调用";
}
}
//2.QML 里面添加按钮测试
Button{
id:"button"
objectName:"buttonObj"
text:"QML按键"
onClicked: {
var ret= Datadeal.setStr("QML调用C++")
console.log("QML获取C++函数返回值:",ret);
}
}
1.添加单独实例类方法:
//第一种:main.cpp文件engine.load(url)前面加代码 是前面
DataDeal deal;
QQmlContext * ctx = engine.rootContext();
ctx->setContextProperty("Datadeal",&deal);
//第二种:main.cpp文件engine.load(url)前面加代码 是前面
// QML使用文件需要添加 import Model1 1.0
DataDeal deal;
qmlRegisterSingletonInstance("Model1",1,0,"Datadeal",&deal);
2.添加类型类方法:
//1.创建C++类型
class Peopel : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
public:
explicit Peopel(QObject *parent = nullptr);
Q_INVOKABLE void setName(QString name)
{
m_strName=name;
emit nameChanged();
}
Q_INVOKABLE QString getName()
{
return m_strName;
}
signals:
void nameChanged();
private:
QString m_strName;
};
//2.注入C++类
qmlRegisterType<Peopel>("ModelPeople",1,0,"People");
//3.使用People类型
People{
id:people
name:"xiaoming"
onNameChanged: {
console.log(people.age)
}
}
三.C++,QML信号槽的绑定
QML信号关联C++槽:
auto objlist = engine.rootObjects();
auto button = objlist.first()->findChild<QObject*>("buttonObj");
QObject::connect(button,SIGNAL(clicked()),deal,SLOT(SlotOnclick()));
C++ 信号关联QML槽
//C++信号首字母必须小写;QML 超函数必须把信号首字母大写
Connections{
target: Datadeal
function onSigSetstr(str)
{
console.log("C++信号关联QML槽:成功",str)
}
}