QML使用C++对象

Posted judes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QML使用C++对象相关的知识,希望对你有一定的参考价值。

一、定义QObject子类

Myudp.h

#ifndef MYUDP_H
#define MYUDP_H

#include <QObject>
#include <QUdpSocket>
class Myudp : public QObject

    Q_OBJECT
public:
    explicit Myudp(QObject *parent = nullptr);
signals:
    void rcvdDataSignal(const QByteArray&);
    void sendedSignal(const QString&);//发送成功
public slots:
    void initUdpSlot();
    void requestSlot();
    void sendSlot(const QByteArray&);
private:
    QUdpSocket* udpClient = nullptr;
    const QString localIp="127.0.0.1";
    const quint16 localPort=8080;
    const QString aimIp="127.0.0.1";
    const quint16 aimPort=8888;
;

#endif // MYUDP_H

Myudp.cpp

#include "myudp.h"

Myudp::Myudp(QObject *parent) : QObject(parent)




/***********************************************/
// z 函数名称:初始化
// h 函数作用:NULL
// u 函数参数:NULL
// x 函数返回值:NULL
// y 备注:NULL
/***********************************************/
void Myudp::initUdpSlot()

    if(udpClient == nullptr)
    
        udpClient = new QUdpSocket(this);
        udpClient->bind(QHostAddress(localIp),localPort);
        QObject::connect(udpClient,SIGNAL(readyRead()),this,SLOT(requestSlot()));
    


/***********************************************/
// z 函数名称:接收数据
// h 函数作用:NULL
// u 函数参数:NULL
// x 函数返回值:NULL
// y 备注:NULL
/***********************************************/
void Myudp::requestSlot()

    if(udpClient->pendingDatagramSize() == 0)
    
        return;
    
    QByteArray ba;
    ba.resize(udpClient->pendingDatagramSize());
    QHostAddress tempHost("");
    quint16 port = 0;
    udpClient->readDatagram(ba.data(),udpClient->pendingDatagramSize(),&tempHost,&port);

    emit rcvdDataSignal(ba);


/**
 *函数名:发送槽函数
 *函数参数:NULL
 *函数作用:NULL
 *函数返回值:NULL
 *备注:NULL
 */
void Myudp::sendSlot(const QByteArray &info)

    if(info.size()==udpClient->writeDatagram(info,QHostAddress(aimIp),aimPort))
    
        QString str = info.toHex().toUpper();
        emit sendedSignal(str);
    

二、注册Myudp类,在QML中实例化【方式1】

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QThread>
#include "myudp.h"
#include <QQuickView>
#include <QQmlContext>
int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    qmlRegisterType<Myudp>("Myudp.module",1,0,"Myudp");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import Myudp.module 1.0
import QtQuick.Controls 2.2
Window 
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Myudp
        id:udp
    
    Row
        Button 
            id: connetBtn
            text: qsTr("连接")
            onClicked: 
                udp.initUdpSlot()
            
        

        Button 
            id: sendBtn
            text: qsTr("发送")
            onClicked: 
                udp.sendSlot("123")
            
        
    

三、注册Myudp对象,在QML直接使用

 main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QThread>
#include "myudp.h"
#include <QQuickView>
#include <QQmlContext>
int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);


    Myudp udp;

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("udp",&udp);//注册对象
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
Window 
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Row
        Button 
            id: connetBtn
            text: qsTr("连接")
            onClicked: 
                udp.initUdpSlot()
            
        

        Button 
            id: sendBtn
            text: qsTr("发送")
            onClicked: 
                udp.sendSlot("123")
            
        
    

 

以上是关于QML使用C++对象的主要内容,如果未能解决你的问题,请参考以下文章

在 QML 中创建自定义 C++ 对象并将其存储在 C++ 模型中

将对象从 c++ 发送到 qml。空闲内存呢?

如何在 QML 中访问 C++ 类对象,而不是在 QML 中创建单独的对象?

如何从 C++ 代码将 QML 对象转换为 QQuickWindow?

C++ 对象属性的 QML 属性

QML/QT 如何将对象从 C++ 转换为 QML?