QML与C++集成

QML与C++集成

QML应用经常要处理一些更高级和性能敏感的以C++ 中处理的任务。处理这个场景最常用和最快的方法是将继承自QObject的,且带有实现的 C++ 类暴露给QML运行时。假定你装了Qt 5.7 或更高版本,以下一步一步的操作将教给你在QML中使用BackEnd这一C++ 类的过程。
1、在Qt Creator中使用"Qt Quick Application" 模板来创建一个新的工程

2、为工程添加名为BackEnd的新的C++ 类,并替换头文件内容:

#ifndef BACKEND_H
#define BACKEND_H

#include <QObject>
#include <QString>
#include <qqml.h>

class BackEnd : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged)
    QML_ELEMENT

public:
    explicit BackEnd(QObject *parent = nullptr);

    QString userName();
    void setUserName(const QString &userName);

signals:
    void userNameChanged();

private:
    QString m_userName;
};

#endif // BACKEND_H

Q_PROPERTY宏声明了一个可以从QML访问的属性。宏QML_ELEMENT使得类BackEnd 可以在QML中访问。

3、在工程文件中添加以下几行:

CONFIG += qmltypes
QML_IMPORT_NAME = io.qt.examples.backend
QML_IMPORT_MAJOR_VERSION = 1

BackEnd将自动注册为可在QML中访问类型,但需要导入URL:"io.qt.examples.backend 1.0"。

4、替换backend.cpp内容:

#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();
}

每当m_userName的值改变时,setUserName函数发出userNameChanged信号。这个信号可以被在QML中的onUserNameChanged函数来处理。

5、用以下内容替换main.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

        onEditingFinished: backend.userName = text
    }
}

当TextField的文本改变时,BackEnd实例允许访问userName属性,以改变其值。
现在程序可以运行了.

Qt 提供几种方法来集成C++ 和QML,本文中所讨论的只是其中一种。更多方法,可以参考QML与C++ 集成概览

posted @ 2022-05-06 09:46  sammy621  阅读(225)  评论(0编辑  收藏  举报