#include "widget.h"
#include "ui_widget.h"
#include <QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//实例化客户端对象
client = new QTcpSocket(this);
//绑定接收readyRead信号与槽函数
connect(client, SIGNAL(readyRead()), this, SLOT(on_readyRead_handler()));
//设置控件属性
ui->btnDisconnect->setEnabled(false);
ui->btnSend->setEnabled(false);
}
Widget::~Widget()
{
delete ui;
}
//连接按钮槽函数
void Widget::on_btnConnect_clicked()
{
//获取行编辑器内IP地址与端口号
QString addr(ui->lineEdit_addr->text());
quint16 port = ui->lineEdit_port->text().toInt();
//请求连接服务器
client->connectToHost(addr, port);
//设置定时器 检测连接超时
timer = new QTimer(this);
timer->setSingleShot(true); //触发一次
timer->setInterval(3000); //设置连接超时时间
//绑定定时器溢出槽函数
connect(timer, SIGNAL(timeout()), this, SLOT(on_timer_out()));
//成功连接发出connected信号
connect(client, SIGNAL(connected()), this, SLOT(on_connected()));
//连接失败发出 error 信号 绑定槽函数
connect(client, SIGNAL(error(QAbstractSocket::SocketError)),
this, SLOT(on_error(QAbstractSocket::SocketError)));
//启动定时器
timer->start();
this->setEnabled(false);
//初步设计可采用检测正在连接状态ConnectingState IP地址+端口号正确就行
// //检测是否为连接状态
// if(client->state() == QAbstractSocket::ConnectingState)
// {
// ui->textEdit_rev->append("连接成功");
// //设置控件属性
// ui->btnDisconnect->setEnabled(true);
// ui->btnSend->setEnabled(true);
// ui->lineEdit_addr->setEnabled(false);
// ui->lineEdit_port->setEnabled(false);
// ui->btnConnect->setEnabled(false);
// }
}
//发送数据槽函数
void Widget::on_btnSend_clicked()
{
//发送文本框内数据
QByteArray sendData = ui->textEdit_send->toPlainText().toUtf8();
client->write(sendData);
// 设置发送文本为黑色
setInsertColor(Qt::black, sendData);
//光标移至末尾
ui->textEdit_rev->moveCursor(QTextCursor::End);
ui->textEdit_rev->ensureCursorVisible();
}
//接收数据槽函数
void Widget::on_readyRead_handler()
{
//获取数据 并添加至文本框
QByteArray revData = client->readAll();
//ui->textEdit_rev->insertPlainText("server: " + revData);
//设置接收文本为红色
setInsertColor(Qt::red, revData);
//光标移至末尾
ui->textEdit_rev->moveCursor(QTextCursor::End);
ui->textEdit_rev->ensureCursorVisible();
}
//断开连接按钮槽函数
void Widget::on_btnDisconnect_clicked()
{
//断开连接 关闭服务器
client->close();
ui->textEdit_rev->append("断开连接");
//设置控件属性
ui->btnDisconnect->setEnabled(false);
ui->btnSend->setEnabled(false);
ui->lineEdit_addr->setEnabled(true);
ui->lineEdit_port->setEnabled(true);
ui->btnConnect->setEnabled(true);
}
//成功连接槽函数
void Widget::on_connected()
{
//连接成功 关闭定时器
timer->stop();
ui->textEdit_rev->append("连接成功");
//设置控件属性
ui->btnDisconnect->setEnabled(true);
ui->btnSend->setEnabled(true);
ui->lineEdit_addr->setEnabled(false);
ui->lineEdit_port->setEnabled(false);
ui->btnConnect->setEnabled(false);
this->setEnabled(true);
//光标移至末尾
ui->textEdit_rev->moveCursor(QTextCursor::End);
ui->textEdit_rev->ensureCursorVisible();
}
void Widget::on_error(QAbstractSocket::SocketError error)
{
//qDebug() << "连接错误" << error;
}
void Widget::on_timer_out()
{
ui->textEdit_rev->append("连接超时");
client->abort(); //删除服务器
this->setEnabled(true);
on_btnDisconnect_clicked(); //手动调用断开连接
}
void Widget::setInsertColor(Qt::GlobalColor color, QString str)
{
//获取当前光标位置
QTextCursor cursor = ui->textEdit_rev->textCursor();
QTextCharFormat format;
//QTextCursor: void QTextCursor::setCharFormat(const QTextCharFormat &format) //方法
//QTextCharFormat: void setForeground(const QBrush &brush) //方法
//QBrush: QBrush(const QColor &color, const QPixmap &pixmap) //构造函数
//QColor: QColor(const QColor &color) //构造函数
format.setForeground(QColor(color));
cursor.setCharFormat(format);
cursor.insertText(str + "\n");
}