QML 时常需要从C++的代码中引用类或者方法来达到QML无法执行的内容。由于QML是解释执行的,无法直接引用C++中的类,所以需要用QT的方法进行传递参数。
首先建立一个项目,选择:Qt Quick Application
他会生成这些 main.cpp 代码:
#include <QGuiApplication> #include <QQmlApplicationEngine>
int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) { return -1; } return app.exec(); }
|
我们新建一个类,叫做 BackEnd 并定义内容。
#ifndef BACKEND_H #define BACKEND_H
#include <QObject> #include <QString>
class BackEnd : public QObject { Q_OBJECT Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged) public: explicit BackEnd(QObject *parent = nullptr);
QString userName(); void setUserName(const QString &userName);
signals: void userNameChanged();
private: QString m_userName; };
#endif
|
BackEnd 类的函数:
#include "backend.h"
BackEnd::BackEnd(QObject *parent) : QObject(parent){}
QString BackEnd::userName() { return m_userName; }
void BackEnd::setUserName(const QString &userName) { if (userName == m_userName){ return; } m_userName = userName; emit userNameChanged(); }
|
然后定义QML文件:
import QtQuick 2.6 import QtQuick.Controls 2.0 import io.qt.examples.backend 1.0
ApplicationWindow { id: root width: 300 height: 480 visible: true
BackEnd { id: backend }
TextField { text: backend.userName placeholderText: qsTr("User name") anchors.centerIn: parent
onTextChanged: backend.userName = text } }
|
最后,修改Main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine>
#include "backend.h"
int main(int argc, char *argv[]) { QGuiApplication app(argc, argv);
qmlRegisterType<BackEnd>("io.qt.examples.backend", 1, 0, "BackEnd");
QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec(); }
|
使用BackEnd实例可以访问userName属性,该属性在TextField的text属性更改时更新。