1,项目.pro加入network
2,ui设计,按钮转到槽
3,添加头文件,声明私有变量
private:
Ui::SendFile *ui;
QTcpSocket *msocket;
QFile file; //文件对象
QString filename; //文件名字
qint64 filesize; //文件大小
qint64 sandsize; //发送文件大小
4,文件浏览槽函数实现,发送文件槽函数实现
void SendFile::on_linkFile_clicked()
{
//通过文件路径获取文件
QString filepath = QFileDialog::getOpenFileName(this);
//显示到lineedit
ui->lineEdit->setText(filepath);
}
//发送文件
void SendFile::on_Sand_clicked()
{
//获取IP,Port
QString IP = ui->line_IP->text();
QString Port = ui->line_Port->text();
//连接
msocket->connectToHost(IP, Port.toUShort());
qDebug() <<“connect success”;
//初始化文件大小
filesize = 0;
sandsize = 0;
}
5,构造函数给socket分配空间
msocket = new QTcpSocket(this);
//连接成功,需要将文件的头信息发送给服务器
connect(msocket, &QTcpSocket::connected,
this,SendFile::lianjie);
//当头信息发送成功,产生信号byteWritten
connect(msocket, &QTcpSocket::bytesWritten,
this, SendFile::fasong);
6,lianjie(),fasong()槽函数实现
void SendFile::lianjie()
{
//准备获取文件大小和名称
QFileInfo info(ui->lineEdit->text());
filename = info.fileName();
filesize = info.size();
qDebug()<< filename<< " "<<filesize;
//使用数组绑定文件大小和文件名
QByteArray array;
QDataStream stream(&array, QIODevice::WriteOnly);
stream<< filesize<< filename;
//设置进度条的最大值
ui->progressBar->setMaximum(filesize);
//打开文件准备读写数据
file.setFileName(ui->lineEdit->text());
file.open(QIODevice::ReadOnly);
//发送数据
msocket->write(array);
}
void SendFile::fasong()
{
//发送数据
if(sandsize<filesize)
{
//读取一段数据
QByteArray array = file.read(1024*10);
//发送数据
msocket->write(array);
//发送大小累计
sandsize += array.size();
//更新进度条显示
ui->progressBar->setValue(sandsize);
}
//发送完成
if(sandsize == filesize)
{
//关闭文件
file.close();
}
}