实现:两个对话框之间利用udp套接字进行通信。 UdpSocket:面向无连接 步骤:1.设置好自身端口号,发送方的端口号和IP 2.通过套接字绑定端口号bind 3. 书写报文writeDatagram(报文内容,对方IP地址,对方端口号) 4. 监听信号ReadyRead,读取报文readDatagram 界面布局(利用UI设计): 各控件类型即名字 代码: widget.cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QUdpSocket>
#include <QDebug>
#include "mytexteidt.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QUdpSocket *udp;
private:
Ui::Widget *ui;
};
#endif
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->myport->setText("8888");
ui->toport->setText("9999");
ui->toIP->setText("127.0.0.1");
udp=new QUdpSocket(this);
udp->bind(ui->myport->text().toInt());
connect(ui->send,&QPushButton::clicked,[=](){
if(ui->input->toPlainText().isEmpty()) return;
udp->writeDatagram(ui->input->toHtml().toUtf8(),
QHostAddress(ui->toIP->text()),
ui->toport->text().toInt());
ui->record->append("I:");
ui->record->append(ui->input->toPlainText());
ui->input->clear();
});
connect(udp,&QUdpSocket::readyRead,[=](){
int recievesize=udp->pendingDatagramSize();
QByteArray array=QByteArray(recievesize,0);
udp->readDatagram(array.data(),recievesize);
ui->record->append("he:");
ui->record->append(array);
});
connect(ui->input,&myTextEidt::Send,ui->send,[=](){
ui->send->clicked();
});
}
Widget::~Widget()
{
delete ui;
}
对方的窗口设置一致,只需要置换端口号即可,其余一样
自定义了一个textedit,为了实现自定义的键盘事件,需要把ui窗口中的文本框提升为自定义的文本框类型。 mytexteidt.h
#ifndef MYTEXTEIDT_H
#define MYTEXTEIDT_H
#include <QWidget>
#include <QTextEdit>
#include <QKeyEvent>
#include <QDebug>
class myTextEidt : public QTextEdit
{
Q_OBJECT
public:
explicit myTextEidt(QWidget *parent = nullptr);
void keyPressEvent(QKeyEvent *e);
signals:
void Send();
};
#endif
mytexteidt.cpp
#include "mytexteidt.h"
myTextEidt::myTextEidt(QWidget *parent) : QTextEdit(parent)
{}
void myTextEidt::keyPressEvent(QKeyEvent *e)
{
if(e->key()==Qt::Key_Return)
{
this->Send();
return;
}
return QTextEdit::keyPressEvent(e);
}
main.cpp
#include "widget.h"
#include "you.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.setWindowTitle("用户1");
w.show();
You y;
y.setWindowTitle("用户2");
y.show();
return a.exec();
}
最终效果
|