自己跟着老师的课程一步步跟着写下来的,有需要的可以自取,有用的话还希望点一个小小的赞同哦~
视频连接专栏的前几篇文章有,此处就不再冗余的放了(其实就是懒得粘贴链接了~~~)
六、TCP 客户端(包括启动新窗口一节内容)
chat.h
#ifndef CHAT_H
#define CHAT_H
#include <QWidget>
#include <QTcpSocket>
namespace Ui {
class Chat;
}
class Chat : public QWidget
{
Q_OBJECT
public:
explicit Chat(QTcpSocket *s, QWidget *parent = nullptr);
//函数括号中只能更改前面,因为默认参数只能放在后面。
~Chat();
private slots:
void on_clearBt_clicked();
void on_sendBt_clicked();
private:
Ui::Chat *ui;
QTcpSocket *socket;
};
#endif // CHAT_H
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>
#include <chat.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_cancelBt_clicked();
void on_connectBt_clicked();
private:
Ui::Widget *ui;
QTcpSocket *socket; //指针,需要在cpp文件的构造函数中初始化
};
#endif // WIDGET_H
chat.cpp
#include "chat.h"
#include "ui_chat.h"
Chat::Chat(QTcpSocket *s, QWidget *parent) :
QWidget(parent),
ui(new Ui::Chat)
{
ui->setupUi(this);
socket = s;
}
Chat::~Chat()
{
delete ui;
}
void Chat::on_clearBt_clicked()
{
ui->lineEdit->clear();
}
void Chat::on_sendBt_clicked()
{
QByteArray ba;
ba.append(ui->lineEdit->text()); //将QString 转换成 QByteArray
socket->write(ba);
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug> //调试程序时使用
/* 搭建一个TCP客户端 */
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
socket = new QTcpSocket; //创建socket对象
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_cancelBt_clicked()
{
this->close();
}
void Widget::on_connectBt_clicked()
{
//获取IP地址和端口号
QString IP = ui->ipLineEdit->text();
QString port = ui->portLineEdit->text();
qDebug() << IP ;
qDebug() << port; // 测试程序时使用
//连接服务器
socket->connectToHost(QHostAddress(IP),port.toShort()); //toSort 转换成短整型
//连接服务器成功,socket对象会发出信号
connect(socket,&QTcpSocket::connected,[this]()
{
QMessageBox::information(this,"连接提示","连接服务器成功");
this->hide(); //隐藏此界面,展示新的界面
// Chat c; //c是局部变量,函数运行结束后,局部变量释放(没了),所以不能在栈上面创建对象,要在堆上面创建对象
Chat *c = new Chat(socket); //堆空间创建对象
c->show();
});
//连接断开,socket也会发出信号
connect(socket,&QTcpSocket::disconnected,[this]()
{
QMessageBox::warning(this,"连接提示","连接异常,网络断开");
});
}