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中實例化【注冊C++類

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")
            }
        }
    }
}

 

 

ps:舉例使用QTimer

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QThread>
#include "myudp.h"
#include <QQuickView>
#include <QQmlContext>
#include <QTimer>
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);



    qmlRegisterType<QTimer>("QTimer.module",1,0,"Timer");

    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 QTimer.module 1.0
import QtQuick.Controls 2.2
Window {
    id: root
    visible: true
    width: 100
    height: 100
    title: qsTr("")
    Rectangle {
        id: lamp
        width: 40
        height: 40
        radius: 5
        color: "red"
        anchors.centerIn: parent
    }
    Timer {
        id:countDown
        interval: 1000
        property bool isChange: true
        onTimeout:  {
            isChange = !isChange
            if(isChange){
                lamp.color = "black"
            }
            else{
                lamp.color = "red"
            }
        }
        Component.onCompleted: {
            countDown.start()
        }
    }
}

效果:每隔一秒修改背景色

 果然采用GPU渲染:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM