내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Q_OBJECT
매크로 및 조인QML_ELEMENT
매크로 및 개인 멤버에는Q_PROPERTY
매크로(다음을 통해 사용 가능ALT
+ENTER
빠른 설치)#include <QObject>
#include <QtQml>//注意 QML_ELEMENT 需要该头文件
class MyCppObj : public QObject
{
Q_OBJECT
QML_ELEMENT
public:
explicit MyCppObj(QObject *parent = nullptr);
int iValue() const;
void setIValue(int newIValue);
QString string() const;
void setString(const QString &newString);
//加入 Q_INVOKABLE宏的函数才可在QML端进行访问
Q_INVOKABLE void func();
private:
int m_iValue;
QString m_string;
Q_PROPERTY(int iValue READ iValue WRITE setIValue NOTIFY iValueChanged FINAL)
Q_PROPERTY(QString string READ string WRITE setString NOTIFY stringChanged FINAL)
signals:
void iValueChanged();
void stringChanged();
};
//一定要通过创建对象来定义我们自定义的obj,对象存在于qml端
qmlRegisterType<MyCppObj>("MyCppObj.Obj",1,0,"MyCppObj");
//MyCppObj.Obj:import的库的名字
//1:主版本号
//0:次版本号
//MyCppObj:QML中类的名字
import QtQuick 2.15
import QtQuick.Window 2.15
import MyCppObj 1.0
Window {
width: 640
height: 480
visible: true
MyCppObj
{
id:myObj
onIValueChanged: {}
onSstringChanged: {}
}
Component.onCompleted:
{
console.log(myObj.iValue,myObj.sstring)
myObj.func()
}
}
위 내용을 토대로 C++ 클래스 등록을 완료한 후
public slots:
void cppSlot(int i,QString s)
{
qDebug()<<__FUNCTION__<<i<<s;
}
Window {
id:window
width: 640
height: 480
visible: true
signal qmlSignal(int i,string s)
MyCppObj
{
id:myObj
onIValueChanged: {}
onSstringChanged: {}
}
Button{
onClicked:
{
qmlSignal(10,"666")
}
}
Connections
{
target: window
function onQmlSignal(i,s)
{
myObj.cppSlot(i,s);
}
}
}
Component.onCompleted:
{
qmlSignal.connect(myObj.cppSlot)
}
engine.load(url);
auto list = engine.rootObjects();//在engine.load之后
auto window = list.first();
MyCppObj *myObj = new MyCppObj();
QObject::connect(window,SIGNAL(qmlSignal(int,QString)),myObj,SLOT(cppSlot(int,QString)));
Button{
onClicked:
{
myObj.cppSignal(10,"6")
}
}
function qmlSlot(i,s)
{
console.log("qml",i,s)
}
Connections
{
target: myObj
function onCppSignal(i,s)
{
qmlSlot(i,s);
}
}
송신측과 수신측 모두의 매개변수는 QVariant 유형이어야 합니다.
QObject::connect(myObj,SIGNAL(cppSignal(QVariant,QVariant)),window,SLOT(qmlSlot(QVariant,QVariant)));
우리가 사용할 때qmlRegisterType
객체를 생성하여 사용자 정의 obj를 정의해야 하는 경우 객체는 qml 측에 존재하며 클래스가 전역적으로 존재해야 할 때 사용할 수 있습니다.qmlRegisterSingletonInstance
MyCppObj *myObj = new MyCppObj();
qmlRegisterSingletonInstance("MyCppObjSingle",1,0,"MyCppObj",myObj);
auto list = engine.rootObjects();
auto window = list.first();
QVariant res;
QVariant arg_1 = 123;
QVariant arg_2 = "ffffff";
QMetaObject::invokeMethod(window,//获取到的qml对象
"qmlFunc",//需要调用的函数名
Q_RETURN_ARG(QVariant,res),//准备好的返回值和参数
Q_ARG(QVariant,arg_1),
Q_ARG(QVariant,arg_2));