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对象
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));  // 载入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  // 继承自QObject类
{
    Q_OBJECT // 建立QObject
    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_H
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属性更改时更新。

 