一 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 放到项目中调用。