C++自定义信号和QML的槽函数建立连接

这篇具有很好参考价值的文章主要介绍了C++自定义信号和QML的槽函数建立连接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0x00 在C++代码在定义一个信号函数:“void sendData2UI(QString msg);”,该函数主要是将接收到的UDP消息发送到QML界面中

#ifndef UDPCLI_H
#define UDPCLI_H

#include <QObject>
#include <QUdpSocket>
#include <QString>

class UdpCli : public QObject
{
    Q_OBJECT
public:
    explicit UdpCli(QObject *parent = nullptr);

    Q_INVOKABLE void sendMsg(QString msg);
    void recvMsg();

signals:
    void sendData2UI(QString msg);

private:
    QUdpSocket* udpSocket;
};

#endif // UDPCLI_H


#include "udpcli.h"
#include <QHostAddress>

UdpCli::UdpCli(QObject *parent) : QObject(parent)
{
    udpSocket = new QUdpSocket(this);
    udpSocket->bind(QHostAddress::LocalHost, 9898);

    connect(udpSocket, &QUdpSocket::readyRead, this, &UdpCli::recvMsg);
}

void UdpCli::sendMsg(QString msg)
{
    udpSocket->writeDatagram(msg.toStdString().c_str(), msg.size(),
                             QHostAddress("127.0.01"), 19898);
}

void UdpCli::recvMsg()
{
    QHostAddress sender;
    quint16 senderPort;

    while (udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());

        udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);

        QString msg = QString::fromLocal8Bit(datagram);
        qDebug() << msg;

        sendData2UI("Recv[" + sender.toString() + ":" + QString::number(senderPort) + "] " + msg);
    }
}

0x01 在QML代码中使用Connections创建C++对象的信号与QML中定义的槽函数连接

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 1.4
import QtQuick.Controls 2.12 as Controls
import QtQuick.Controls.Styles 1.4
import QtQuick.Controls.Material 2.12
// import com.HLD 1.0
import QtQml 2.14

Window {
    visible: true;
    minimumHeight: 480;
    maximumHeight: 480;
    minimumWidth: 640;
    maximumWidth: 640;
    title: qsTr("HLD.TableView")
    color: Qt.rgba(127, 255, 170, 1.0)

    Column{
        anchors.centerIn: parent;
        spacing: 10;

        Row{
            id: sendArea;
            spacing: 10;

            TextField {
                id: inputField;
                width: 300;
                placeholderText: "Enter text";

                style: TextFieldStyle {
                    background: Rectangle {
                        color: "#ffffff"
                        border.color: "#40E0D0"
                        radius: 4
                    }
                }
            }

            Button{
                id: btn;

                text: "发送";
                style: ButtonStyle {
                    background: Rectangle {
                        color: "#2196f3"
                        radius: 4;
                    }

                    label: Text {
                        text: btn.text
                        color: "#ffffff"
                        font.pixelSize: 16
                    }
                }

                onClicked: {
                    if(inputField.text.length > 0)
                    {
                        console.log(inputField.text);
                        UdpCli.sendMsg(inputField.text);
                    }
                }
            }
        }

        Text {
            text: qsTr("接收数据:");
        }

        TextArea{
            id: recvMsg;
            width: sendArea.width;
            readOnly: true;
        }

        Connections{
            target: UdpCli;
            function onSendData2UI(msg){
                recvMsg.text += msg;
                recvMsg.text += "\r\n";

                console.log(msg);
            }
        }
    }
}
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickStyle>
#include <QMetaObject>
#include <QQmlContext>
#include "udpcli.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    QQuickStyle::setStyle("Material");

    UdpCli m_udpCli;

    /**
     * @brief qmlRegisterSingletonInstance
     * @param Url名
     * @param 主版本
     * @param 次版本
     * @param Qml中控件名
     * @param C++对象
     */
    // qmlRegisterSingletonInstance("com.HLD", 1, 0, "UdpCli", &m_udpCli);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);

    auto context = engine.rootContext();
    context->setContextProperty("UdpCli", &m_udpCli);

    engine.load(url);

    return app.exec();
}

效果演示:

C++自定义信号和QML的槽函数建立连接,QML,c++,QML文章来源地址https://www.toymoban.com/news/detail-573920.html

到了这里,关于C++自定义信号和QML的槽函数建立连接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++与QML 信号与槽交互

    在main.cpp中通过 QQmlApplicationEngine engine 获得全局对象 在qml中使用   SCREEN_WIDTH  全局属性 1.创建一个MyObject类  2.在myobject.h中定义一些属性,以便在qml中可以使用 并为每个属性添加读写的方法和相应的信号 2.在myobject.cpp中实现 #include \\\"myobject.h\\\" MyObject::MyObject(QObject *parent) : QOb

    2024年02月16日
    浏览(31)
  • Linux系统调用之signal,sigaction函数 (捕捉指定的信号,自定义/默认处理该信号)

    如果,想要深入的学习Linux系统调用中的signal,sigaction函数,还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令: 即可查阅到完整的资料信息。 signal()是一个用于处理Unix和类Unix操作系统(如Linux)中的信号的系统调用。信号是用于在进程间或者进程内部传递通知或者

    2024年02月02日
    浏览(38)
  • Qt - 不同类之间槽函数和信号的连接

    本文记录了自己在写一个五子棋游戏中的所遇到的一个问题,我被这个小问题卡了好久才解决。 作为一个Qt小白 ,如有错误请多多包含,并可以在评论区留言~~ 方案一中如果在 Game_control.cpp 里添加 Chessboard chessboard; 和 connect(chessboard, SIGNAL(GameOver(int)), this, SLOT(GameIsOver(int))); 之

    2024年02月21日
    浏览(26)
  • Qt (ui界面)信号与槽函数 组件连接

    重点:信号与槽连接机制。 难点:信号与槽函数的 参数使用。 头函数: 原函数: 测试函数: 测试结果:

    2024年02月14日
    浏览(36)
  • qml学习之qwidget与qml结合使用并调用信号槽交互

    说明: 学习qml系列之qwiget和qml信号槽的交互使用,并在qwidget中显示qml界面 在qml中发送信号到qwidget里 在qwidget里发送信号给qml 方式一:使用QQuickView 这个是Qt5.0中提供的一个类,继承自QQickWindow中,用来显示qt quick用户界面: QQuickView基于QWindow,需要转换成 QWidget才能使用,还需

    2024年02月08日
    浏览(41)
  • 使用libssh2建立安全的SSH连接:C++开发者的综合指南

    SSH和安全连接的重要性是不可忽视的。在今天的互联网环境中,保护敏感数据和网络通信的安全至关重要。 通过使用SSH建立安全连接,可以确保数据在传输过程中是加密的。这意味着即使在网络上拦截到数据包,攻击者也无法读取其内容。 SSH提供了多种身份验证方法,如密

    2024年02月04日
    浏览(42)
  • matlab函数转C++(数字信号处理)

    近期主要利用QT完成一个本科的通信教学软件,其中涉及大量matlab转C++的工作,本来是想利用matlab的Coder模块进行转换的,本人小白不太会用,还是自己按着matlab内置函数的代码进行转换,函数写的比较笨,希望大家能够多多指导. 使用的是C++的armadillo矩阵库进行矩阵的运算,

    2024年02月06日
    浏览(31)
  • 【QML COOK】- 007-Item对象、信号和槽

    信号(signal)和槽(slot)是Qt的独特的设计,自然在QML中也被支持。 Item是QML所有类型的基类,Item类型不会显示在窗口上,但是可以支持信号和槽。本节就用Item编写一个信号和槽的实例。 1. 创建Qt Quick并编辑Main.qml 代码中创建了两个Item对象,一个id为sender,另一个为receiver。

    2024年01月23日
    浏览(31)
  • 【QML】QML与cpp交互(一)—— QML直接调用cpp函数

    目录 1、cpp 创建一个类 2、将类对象暴露给QML 3、QML通过对象直接调用cpp函数 类模板如下:  要求:  使用  Q_OBJECT 宏需要继承 QObject 类。Q_OBJECT能够启用信号和槽机制、使用动态属性系统。(使用 Q_OBJECT 宏的类需要通过Qt的元对象编译器(moc)进行处理。) 使用  Q_INVOKABLE 修

    2024年02月02日
    浏览(30)
  • 【QML COOK】- 008-自定义属性

    前面介绍了用C++定义QML类型,通常在使用Qt Quick开发项目时,C++定义后端数据类型,前端则完全使用QML实现。而QML类型或Qt Quick中的类型时不免需要为对象增加一些属性,本篇就来介绍如何自定义属性。 1. 创建项目,并编辑Main.qml 在sender对象中通过property创建了一个in

    2024年02月01日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包