VS2019+Qt5.14.2 测试QtRO进程间通信记录

本文介绍了如何在Windows10上使用VS2019配置Qt5.14.2开发环境,通过创建.rep文件并生成头文件,利用QtRemoteObject实现Master和Slave端的信号槽通信,详细步骤包括环境配置、源码编写及跨机器通信的注意事项。
摘要由CSDN通过智能技术生成

一 VS2019 配置Qt5

本文参考以下文章整理:

win10平台下VS2019+Qt5.14.2开发环境搭建_qt vs2019 开发_Star_ID的博客-CSDN博客VS2019+QT5.14.2 解决环境搭建可能遇到的问题_qt 5.14.2_呵呵哒( ̄▽ ̄)"的博客-CSDN博客

二由 .rep文件生成.h头文件

用记事本写一个文件,内容:

class CommonInterface
{
    SIGNAL(sigMessage(QString msg))   //server下发消息给client
    SLOT(void onMessage(QString msg)) //server接收client的消息
}


另存为CommonInterface.rep ,文件编码UTF-8,保存文件,复制到Qt的安装目录C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin , 然后按住shift在这个目录空白处右键,选择“在此处打开PowerShell窗口” ,分别执行以下两条命令:

repc CommonInterface.rep -o replica -c rep_Commoninterface_replica.h
repc CommonInterface.rep -o source -c rep_Commoninterface_source.h
(参照:(269条消息) Qt Remote Object(QtRO)解决找不到rep_xx_source.h或rep_xx_replica.h的终极方法_qrep未找到命令_hp_cpp的博客-CSDN博客), 目录中会得到两个新文件:

rep_Commoninterface_source.h

rep_Commoninterface_replica.h

复制两个文件出来,备用。

 

三 Master端程序设计

打开VS2019 ,新建项目,项目类型:Qt Widgets Application ,

建立窗体:

将刚才步骤生成的rep_Commoninterface_source.h文件添加到项目头文件目录中: 

 然后新建commoninterface.h,内容:

#pragma once
#include "rep_commoninterface_source.h"

class CommonInterface : public CommonInterfaceSource
{
    Q_OBJECT
public:
    explicit CommonInterface(QObject* parent = nullptr);
    virtual void onMessage(QString msg);
    void sendMsg(const QString& msg);
signals:
    void sigReceiveMsg(const QString& msg);

};

新建commoninterface.cpp

#include "stdafx.h"
#include "commoninterface.h"
#include <QDebug>

CommonInterface::CommonInterface(QObject* parent) :
    CommonInterfaceSource(parent)
{
}

/**
 * @brief CommonInterface::onMessage
 * @param msg
 * 接收客户端的消息
 */
void CommonInterface::onMessage(QString msg)
{
    emit sigReceiveMsg(msg);
}

/**
 * @brief CommonInterface::sendMsg
 * @param msg
 * 发送消息给客户端
 */
void CommonInterface::sendMsg(const QString& msg)
{
    emit sigMessage(msg);
}

项目MasterWidget.h文件:

#pragma once
#include "commoninterface.h"
#include <QtWidgets/QWidget>
#include "ui_MainWidget.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MasterWidgetClass; };
QT_END_NAMESPACE

class MasterWidget : public QWidget
{
    Q_OBJECT

public:
    MasterWidget(QWidget *parent = nullptr);
    ~MasterWidget();

    void sendData(QString Msg);
private slots:
    void on_pushButton_clicked();
    void onReceiveMsg(const QString& msg);
private:
    void init();

private:
    Ui::MasterWidgetClass *ui;
    CommonInterface* m_pInterface = nullptr;
    QRemoteObjectHost* m_pHost = nullptr;
};

项目MasterWidget.cpp文件

#include "stdafx.h"
#include "MasterWidget.h"

MasterWidget::MasterWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MasterWidgetClass())
{
    ui->setupUi(this);
    init();
}

MasterWidget::~MasterWidget()
{
    delete ui;
}

void MasterWidget::init()
{
    m_pHost = new QRemoteObjectHost(this);
    m_pHost->setHostUrl(QUrl("local:interfaces"));
    m_pInterface = new CommonInterface(this);
    m_pHost->enableRemoting(m_pInterface);
    connect(m_pInterface, &CommonInterface::sigReceiveMsg, this, &MasterWidget::onReceiveMsg);
}

void MasterWidget::sendData(QString Msg) {      

    if (!Msg.isEmpty()) {
        m_pInterface->sendMsg(Msg);
    }
}

void MasterWidget::on_pushButton_clicked()
{
    QString msg = ui->lineEdit->text();
    sendData(msg);
    ui->textEdit->append(QString("Server:") + msg);
    ui->lineEdit->clear();
}


void MasterWidget::onReceiveMsg(const QString& msg)
{
    ui->textEdit->append(QString("Client:") + msg);
}

项目目录结构:

 

四 Slave端程序设计

跟上边Master一样,建立一个新的Qt Widgets Application项目,项目头文件导入第一步生成的rep_Commoninterface_replica.h

建立与Master一样的窗口 

Slave.h

#pragma once
#include <QtWidgets/QWidget>
#include "ui_Slave.h"
#include <QRemoteObjectHost>
#include "rep_CommonInterface_replica.h"

QT_BEGIN_NAMESPACE
namespace Ui { class SlaveClass; };
QT_END_NAMESPACE

class Slave : public QWidget
{
    Q_OBJECT

public:
    Slave(QWidget *parent = nullptr);
    ~Slave();

private slots:
    void onReceiveMsg(QString msg);
    void SendData(QString Msg);
    void on_pushButton_clicked();

private:
    void init();

private:
    Ui::SlaveClass *ui;

    QRemoteObjectNode* m_pRemoteNode = nullptr;
    CommonInterfaceReplica* m_pInterface = nullptr;
};

Slave.cpp:

#pragma once

#include <QtWidgets/QWidget>
#include "ui_Slave.h"
#include <QRemoteObjectHost>
#include "rep_CommonInterface_replica.h"

QT_BEGIN_NAMESPACE
namespace Ui { class SlaveClass; };
QT_END_NAMESPACE

class Slave : public QWidget
{
    Q_OBJECT

public:
    Slave(QWidget *parent = nullptr);
    ~Slave();

private slots:
    void onReceiveMsg(QString msg);
    void SendData(QString Msg);
    void on_pushButton_clicked();

private:
    void init();

private:
    Ui::SlaveClass *ui;

    QRemoteObjectNode* m_pRemoteNode = nullptr;
    CommonInterfaceReplica* m_pInterface = nullptr;
};

编译运行,即可正常通讯:

 

以上为同一台机器上同时运行Master  /  Slave 程序进行通讯, 如果在不同机器上,需要修改代码中:

 m_pRemoteNode->connectToNode(QUrl("local:interfaces")); 

QUrl("local:interfaces") 改为QUrl("192.168.1.100:9527") 这样的远程地址。

+++++++++++++++

回头看第一步,建立的rep文件:

class CommonInterface
{
    SIGNAL(sigMessage(QString msg))   //server下发消息给client
    SLOT(void onMessage(QString msg)) //server接收client的消息
}

只是一个QString msg参数的信号和槽函数,如果需要多个参数或者多个参数,可以根据需要修改定义,重新生成 rep_Commoninterface_source.h  和rep_Commoninterface_replica.h 放到项目中调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值