QML笔记-整合C++及单例模式管理QML中控件

这里两个Integrate标题的界面是widgets界面,Hello World标题的界面是QML界面

 

程序运行截图如下:

点击获取QML中的值后:

点击设置QML中的值后

这里关闭窗口,整合的C++类也会自动析构(Qt真是强大)

目前官网给出的要整合C++的,需要Qt5.7以上的版本。

使用Q_PROPERTY宏可以被QML控件直接读取,访问

如下:

 

这个setUserName函数里面发出userNameChanged信号,这个型号被QML的onUsername
Changed

 

 

 

这里使用了ItemManager类管理qml界面的控件:

#ifndef ITEMMANAGER_H
#define ITEMMANAGER_H

#include <QObject>
#include <QList>

class ItemManager : public QObject
{
    Q_OBJECT
public:
    void addItem(QObject *item);
    QObject *getObject();
    void printTest();
    ~ItemManager();
    static ItemManager *getInstance();


protected:
    explicit ItemManager(QObject *parent = nullptr);
    ItemManager();
    ItemManager(ItemManager &item);

private:
    QList<QObject*> m_item;

    static ItemManager *m_instance;

};

#endif // ITEMMANAGER_H

QML进行注册:

对应的C++类

#ifndef BACKEND_H
#define BACKEND_H

#include <QObject>

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

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

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


signals:
    void userNameChanged();

private:
    QString m_userName;

};

#endif // BACKEND_H

Qml使用

import QtQuick 2.6
import QtQuick.Window 2.14
import QtQuick.Controls 2.2
import cn.it1995.bakend 1.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    BackEnd{

        id: backend
    }

    TextField{

        text: backend.userName
        placeholderText: "user name"
        anchors.centerIn: parent
        onTextChanged: backend.userName = text
    }

}

源码下载地址如下:

https://github.com/fengfanchen/Qt/tree/master/IntegrateCPP%26QML

发布了1269 篇原创文章 · 获赞 1970 · 访问量 179万+

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/104041272
今日推荐