- Qt5 C++ GUI Programming Cookbook
- Lee Zhi Eng
- 470字
- 2021-07-02 12:17:56
How to do it…
We want to create a label in QML and change its text occasionally. In order to expose the label object to C++, we can do the following steps:
- Create a C++ class called MyLabel that extends from the QObject class in mylabel.h:
class MyLabel : public QObject {
Q_OBJECT
public:
// Object pointer
QObject* myObject;
explicit MyLabel(QObject *parent = 0);
// Must call Q_INVOKABLE so that this function can be used in QML
Q_INVOKABLE void SetMyObject(QObject* obj);
}
In the mylabel.cpp source file, define a function called SetMyObject() to save the object pointer. This function will later be called in QML in mylabel.cpp:
void MyLabel::SetMyObject(QObject* obj) {
// Set the object pointer
myObject = obj;
}
- In main.cpp, include the MyLabel header and register it to the QML engine using the
qmlRegisterType() function:
include "mylabel.h"
int main(int argc, char *argv[]) {
// Register your class to QML
qmlRegisterType<MyLabel>("MyLabelLib", 1, 0, "MyLabel");
}
- Notice that there are four parameters you need to declare in qmlRegisterType(). Besides declaring your class name (MyLabel), you also need to declare your library name (MyLabelLib) and its version (1.0), which will be used to import your class to QML.
- Map the QML engine to our label object in QML and import the class library we defined earlier in step 3 by calling import MyLabelLib 1.0 in our QML file. Notice that the library name and its version number have to match the one you declared in main.cpp, otherwise it will throw an error. After declaring MyLabel in QML and setting its ID as mylabels, call mylabel.SetMyObject(myLabel) to expose its pointer to C/C++ right after the label is initialized:
import MyLabelLib 1.0
ApplicationWindow {
id: mainWindow
width: 480
height: 640
MyLabel {
id: mylabel
}
Label {
id: helloWorldLabel
text: qsTr("Hello World!")
Component.onCompleted: {
mylabel.SetMyObject(hellowWorldLabel);
}
}
}
- Wait until the label is fully initiated before exposing its pointer to C/C++, otherwise you may cause the program to crash. To make sure it's fully initiated, call the SetMyObject() function within Component.onCompleted and not in any other functions or event callbacks. Now that the QML label has been exposed to C/C++, we can change any of its properties by calling the setProperty() function. For instance, we can set its visibility to true and change its text to Bye bye world!:
// QVariant automatically detects your data type
myObject->setProperty("visible", QVariant(true));
myObject->setProperty("text", QVariant("Bye bye world!"));
- Besides changing the properties, we can also call its functions by calling the following:
QMetaObject::invokeMethod():
QVariant returnedValue;
QVariant message = "Hello world!";
QMetaObject::invokeMethod(myObject, "myQMLFunction", Q_RETURN_ARG(QVariant, returnedValue), Q_ARG(QVariant, message));
qDebug() << "QML function returned:" << returnedValue.toString();
- Or, simply, we can call the invokedMethod() function with only two parameters if we do not expect any values to be returned from it:
QMetaObject::invokeMethod(myObject, "myQMLFunction");
推薦閱讀
- Learning Ansible 2.7(Third Edition)
- 醫(yī)院消毒:消毒工作的重中之重
- 實(shí)用甲狀腺疾病診療學(xué)
- 臨床檢驗(yàn)一萬(wàn)個(gè)為什么:病原檢驗(yàn)分冊(cè)
- Practical PowerShell Security and Compliance Center
- 男性不育癥知識(shí)與門(mén)診心理調(diào)適
- 媽媽寶寶口腔保健
- 新生兒聽(tīng)力篩查
- 放射診斷學(xué)讀片:北京協(xié)和醫(yī)院放射十年影像薈萃
- 兒童音樂(lè)治療理論與應(yīng)用方法
- 慢性意識(shí)障礙
- Activiti 5.x Business Process Management Beginner's Guide
- 中國(guó)口腔疾病經(jīng)濟(jì)負(fù)擔(dān)和預(yù)防策略經(jīng)濟(jì)學(xué)評(píng)價(jià)研究
- 呼吸與危重癥醫(yī)學(xué)2014-2015
- 吞咽障礙康復(fù)指南