这里以使用engine.rootContext()->setContextProperty 函数接口,操作步骤如下
① 首先定义好自己的 Test 的class类
class Test : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(int year READ year WRITE setYear NOTIFY yearChanged)
QString m_name;
int m_year;
public:
explicit Test(QObject *parent = nullptr);
const QString &name() const;
void setName(const QString &newName);
const int &year() const;
void setYear(const int &newYear);
//add Invokable to send signal
Q_INVOKABLE void sendSignal();
signals:
void nameChanged();
void yearChanged();
void cppSignalA(); //no parameter
void cppSignalB(const QString &str, int value); //with parameter
public slots:
void cppSlotA(); //slot function with no parameter
void cppSlotB(const QString &str, int value); //slot function with parameter
};
② 在main.cpp中添加如下代码
engine.rootContext()->setContextProperty("Greeting",
QObject::tr("Hello QML from C++"));
CPlusPlusClass *cplusplusclass = new CPlusPlusClass();
engine.rootContext()->setContextProperty("CPlusPlusClass", cplusplusclass);
cplusplusclass->setDisplay("Display test");
③ 在QML中使用注册好的C++资源
Text {
id: idTextDisplay
anchors.centerIn: parent
text: CPlusPlusClass.display
font.family: "Helvetica"
font.pointSize: 24
font.bold: true
color: "red"
}
MouseArea{
property int year: 2021
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
//test left button right button
onClicked: {
if(mouse.button == Qt.LeftButton){
console.log('----qml left button: cpp send signal')
idTest.name = "TestObj"
idTest.year = year++
idTest.sendSignal()
CPlusPlusClass.setDisplay(year.toString())
}else{
console.log('----qml right button: qml send signal')
idRoot.qmlSignalA()
idRoot.qmlSignalB('TestObj', 202111)
}
}
}
这里的 CPlusPlusClass.display 和 CPlusPlusClass.setDisplay(year.toString()) 就是调用的在C++注册的资源。