一:学到的重点
1 client->connectToHost()
这行代码的主要功能是让 client
对象(通常是一个 QTcpSocket
类型的网络套接字对象)尝试连接到指定 IP 地址和端口号的服务器。
2 QTextCursor
QTextCursor
可以看作是文本编辑器中的光标,它不仅能指示当前文本操作的位置,还能对文本进行选择、插入、删除等操作。通过 QTextCursor
,你可以在不依赖用户界面交互的情况下,以编程的方式对文本进行精细控制。
3 QTextFormat
在 Qt 框架里,QTextFormat
是一个基类,为 QTextDocument
中文本的格式设置提供了基础支持。QTextDocument
是 QTextEdit
、QPlainTextEdit
等文本编辑控件所使用的文档模型。QTextFormat
本身是抽象类,不能直接实例化,不过它有多个具体的子类,用于设置不同类型的文本格式。
1. QTextCharFormat
该类用于设置单个字符的格式,像字体、颜色、字号、加粗、倾斜、下划线等。
2.QTextBlockFormat
此子类用于设置文本块的格式,例如段落的对齐方式、缩进、行间距等。
3. QTextListFormat
该类用于设置列表的格式,比如列表的样式(有序列表、无序列表)、缩进等。
4 client->abort()
abort()
方法的作用是立刻终止当前的连接,并且丢弃读写缓冲区里所有未处理的数据。和 disconnectFromHost()
不同,disconnectFromHost()
会尝试正常关闭连接,也就是发送完缓冲区里的数据之后再关闭;而 abort()
则是直接切断连接,不考虑缓冲区数据。
5 timer->setSingleShot();
setSingleShot
是 QTimer
类的一个成员函数,其作用是设定定时器的触发模式,该函数接收一个布尔类型的参数:
- 当参数为
true
时,定时器仅会触发一次。也就是说,在启动定时器之后,经过设定的时间间隔,定时器会发出timeout()
信号,随后自动停止,不会再继续计时和触发。 - 当参数为
false
时,定时器会进入周期性触发模式。在启动定时器之后,每隔设定的时间间隔,定时器就会发出timeout()
信号,持续不断地触发,直到手动停止定时器。
6 timer->start(5000)
setInterval
是 QTimer
类的一个成员函数,其功能是设定定时器触发的时间间隔,单位为毫秒。在上述代码中,5000
代表将定时器的时间间隔设置为 5000 毫秒,也就是 5 秒。
当定时器启动后,它会按照设定的时间间隔重复触发(如果是周期性定时器)或者仅触发一次(如果是单次定时器)。具体的触发模式由 setSingleShot
函数来决定。
timer->setInterval(5000)
仅设置时间间隔,不会启动定时器,适合多次启动定时器且使用相同时间间隔的场景。timer->start(5000)
既设置时间间隔又启动定时器,适合单次启动定时器并直接指定时间间隔的场景。
二 网络调试助手(客户端)
1 完成应用界面
2 连接服务端和完成接收发送功能
一 :连接服务端
//连接服务端
void Widget::on_btn_connect_clicked()
{
//连接的服务端的地址和端口号
client->connectToHost(ui->lineEdit_IP->text(),ui->lineEdit_port->text().toInt());
}
二:接收服务端的数据
//接收服务端发送的内容 当 client 接收到新的数据时,就会发出 readyRead 信号
connect(client,&QIODevice::readyRead,this,&Widget::on_recText);
//接收服务端发送的内容并显示
void Widget::on_recText()
{
//得到的内容显示到ui界面上
ui->textEdit_rec->insertPlainText(client->readAll());
}
三:发送功能的实现
//发送功能的实现
void Widget::on_btn_sent_clicked()
{
//写入数据
client->write(ui->textEdit_sent->toPlainText().toUtf8());
}
3 断开连接和ui界面的完善
ui->btn__disconnect->setEnabled(true); true按钮可按 false按钮不可用
//断开连接
void Widget::on_btn__disconnect_clicked()
{
client->close();
ui->textEdit_rec->insertPlainText("断开连接\n");
ui->btn_connect->setEnabled(true);
ui->btn__disconnect->setEnabled(false);
ui->btn_sent->setEnabled(false);
}
4 用颜色区分发送和接收数据
//设置显示的颜色发送信息打印黑色 接收信息也红色
void Widget::Show_Color(Qt::GlobalColor color, QString str)
{
//这行代码 主要用于从 QTextEdit 控件中获取当前的文本光标对象
QTextCursor cursor=ui->textEdit_rec->textCursor();
//QTextCharFormat 是 Qt 中用于设置文本字符格式的类,如字体、颜色、字号、加粗、倾斜等
QTextCharFormat format;
//setForeground:QTextCharFormat 类的成员函数,用于设置文本的前景色(即文字颜色)。
format.setForeground(QBrush(QColor(color)));
//将设置好的格式应用到光标位置的文本
cursor.setCharFormat(format);
//在光标位置插入指定的文本光标后的文本显示当前设置的格式
cursor.insertText(str);
}
结果:
5 解决服务端的bug
一:在连接成功后在断开如果此时不点击更换端口这个控件 继续点击发送会运行中止
解决:在widget构造函数中设置发送按钮不可以选择 在连接成功后设置可以选择 在断开后实现不能选择
二:实现光标跟着内容移动
//实现光标跟着内容移动
ui->textEdit_rec->moveCursor(QTextCursor::End);
ui->textEdit_rec->ensureCursorVisible();
三: 连接到端口刷新combobox_choose
四:当连接俩个端口的时候向第二个端口发送数据其实是向第一个端口发送
在发送的时候不要用下标查找用name
else{
//当连接俩个端口的时候向第二个端口发送数据其实是向第一个端口发送
//不用下标用currentName
QString currentName=ui->comboBox_choose->currentText();
for(QTcpSocket* sto :stocket){
if(currentName==QString::number(sto->peerPort())){
sto->write(ui->textEdit_sent->toPlainText().toUtf8());
}
}
//stocket[choose_index]->write(ui->textEdit_sent->toPlainText().toUtf8());
}
6 优化客户端
1 当连接的时候出现如果ip不一样也出现连接成功
当连接超时的时候报错显示在接收区域上: