由于在写自己的串口收发工具时,有写到发送文件的功能,因此希望通过进度条来显示当前传送文件的进度。
文件的大小读取和数据读取在线程中,使用信号和槽发送到主进程,更新到ui控件上。
connect(sendfile,&SendFile::SndfilesizeSignal,this,&MainWindow::Rcvfilesize);
connect(sendfile,&SendFile::SndfileSignal,this,&MainWindow::Rcvfiledata);
先在线程当中发送文件的大小到主进程,通过setRange设置进度条控件的范围,再按行读取并将每次按行读到数据大小发到主进程,通过setValue叠加设置当前进度条的值。
sendfile.cpp
//重写线程run方法
void SendFile::run()
{
QFile myfile(sndFilepath);
emit SndfilesizeSignal(myfile.size()); //发送文件大小
if(myfile.open(QIODevice::ReadOnly))
{
while(!myfile.atEnd()) //当读到末尾
{
QThread::usleep(100);
QByteArray data = myfile.readLine(); //按行读取文件
emit SndfileSignal(data,data.size()); //发送每次按行读取的数据和数据大小
}
}
}
mainwindow.cpp
//接收线程发来的文件大小
void MainWindow::Rcvfilesize(int filesize)
{
//qDebug()<< filesize;
ui->FileSend_progressBar->setRange(0,filesize); //设置进度条的范围
}
//接收线程每次发来的文件数据
void MainWindow::Rcvfiledata(QByteArray filedata,int fileline_size)
{
if(isSerialState)
{
serial->write(filedata);
progress_value += fileline_size;
//qDebug()<< "progrss_value:" << progress_value <<",fileline_size:" << fileline_size;
ui->FileSend_progressBar->setValue(progress_value); //更新进度条
}
}
效果图