一、网络调试助手UI界面
编程主要思路:
首先将水平的控件 水平布局 ,然后相对垂直的控件 垂直布局 ,哪怕是底下的groupBox也需要和里面的内容 水平布局,然后最后框选全部 栅格布局。如果需要界面自适应窗口大小,可以点击界面的空白处,然后点击栅格布局,即可界面自适应。
二、网络调试助手 控件名称修改
三、代码编写
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket> //客户端头文件
#include <QTimer>
#include <QDateTime>
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_clearReceivePushButton_clicked();
void connected_slot(); //自定义处理信号的槽函数
void readyRead_slot(); //自定义处理readyRead信号的槽函数
void disconnected_slot(); //自定义处理disconnected信号的槽函数
void on_connectPushButton_clicked();
void on_sendPushButton_clicked();
void on_clearSendPushButton_clicked();
void on_sendCheckBox_stateChanged(int arg1);
private:
Ui::Widget *ui;
QTcpSocket *socket;//定义一个客户端指针
QTimer *timer; //定义一个定时器用于定时发送数据
};
#endif // WIDGET_H
widget.c
#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//给客户端指针实例化空间
socket = new QTcpSocket(this);
//如果连接服务器成功,该客户端就会发射一个connected信号
//我们可以将该信号连接到自定义的槽函数中处理相关逻辑
//由于该连接只需要连接一次。所有在构造函数中即可
connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);
//客户端与服务器连接成功后,如果服务器向客户端发来数据,那么该客户端就会自动发射一个readyRead信号
//我们可以将该信号连接到自定义槽函数中处理相关逻辑
connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
//当客户端与服务器断开连接后,该客户端就会自动发射1一个disconnected信号
//我们可以将该信号与自定义的槽函数连接
//由于只需要连接一下,所有该连接写到构造函数即可
connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
timer = new QTimer;
timer->setInterval(1000);// 设置默认定时时长1000ms
connect(timer, &QTimer::timeout, this, [=](){
on_sendPushButton_clicked();
});
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_clearReceivePushButton_clicked()
{
ui->receivePlainTextEdit->clear();
}
void Widget::connected_slot()
{
QMessageBox::information(this,"成功","连接服务器成功");
ui->connectPushButton->setText("断开连接");
}
void Widget::readyRead_slot()
{
QByteArray msg = socket->readAll();//读取该客户端中的数据
QString str = ui->receivePlainTextEdit->toPlainText() + "\r\n" ;
if(ui->timeCheckBox->isChecked())//如果显示时间服务框被勾选
{
QDateTime nowtime = QDateTime::currentDateTime();
str += "[" + nowtime.toString("yyyy-MM-dd hh:mm:ss") + "] " + QString::fromLocal8Bit(msg);
}
else
{
str += QString::fromLocal8Bit(msg);
}
ui->receivePlainTextEdit->setPlainText(str);//将数据展示在UI界面
}
//disconn信号对应槽函数的实现
void Widget::disconnected_slot()
{
QMessageBox::information(this, "退出", "服务器断开");
ui->connectPushButton->setText("连接服务器");
}
void Widget::on_connectPushButton_clicked()
{
if(ui->connectPushButton->text().contains("连接服务器"))
{
QString hostName = ui->ipLineEdit->text(); //获取主机地址
quint16 port = ui->portLineEdit->text().toUInt(); //获取端口号
socket->connectToHost(hostName,port);
}
else
{
socket->close();
}
}
void Widget::on_sendPushButton_clicked()
{
//获取UI界面中的编辑的文本内容
QString str = ui->sendTextEdit->toPlainText();
//将消息发送给服务器
socket->write(str.toLocal8Bit());
}
void Widget::on_clearSendPushButton_clicked()
{
ui->sendTextEdit->clear();
}
void Widget::on_sendCheckBox_stateChanged(int arg1)
{
if(arg1 == 0)//如果复选框没有被选中
{
timer->stop();//定时器停止发送
}
else
{
timer->start(ui->timeLineEdit->text().toInt());
}
}
四、实验结果
五、完整工程
链接:https://pan.baidu.com/s/17FckX9WjpJuDNUk1OtP1SQ?pwd=8888
提取码:8888