void Server::updClntProgress(qint64 numBytes) { qApp->processEvents(); //用于在传输大文件时使界面不会冻结 bytesWritten += (int)numBytes; if (bytesTobeWrite > 0) { outBlock = locFile->read(qMin(bytesTobeWrite, payloadSize)); bytesTobeWrite -= (int)clntConn->write(outBlock); outBlock.resize(0); }else { locFile->close(); } ui->progressBar->setMaximum(totalBytes); ui->progressBar->setValue(bytesWritten); float useTime = time.elapsed(); double speed = bytesWritten / useTime; ui->sStatusLbl->setText(tr("已发送 %1MB(%2MB/s) \n 共%3MB 已用时:%4秒\n估计剩余时间:%5秒") .arg(bytesWritten / (1024*1024)) .arg(speed*1000 / (1024*1024), 0, 'f', 2) .arg(totalBytes / (1024 * 1024)) .arg(useTime/1000, 0, 'f', 0) .arg(totalBytes/speed/1000 - useTime/1000, 0, 'f', 0)); if (bytesWritten == totalBytes) { locFile->close(); tSrv->close(); ui->sStatusLbl->setText(tr("传送文件 %1 成功").arg(theFileName)); } }
时间: 2024-02-14 16:23:01 浏览: 21
这段代码是服务器端更新客户端传输进度的槽函数。在传输文件时,每次客户端发送数据,都会触发bytesWritten信号,该槽函数会将已传输的字节数记录下来,并更新进度条和状态栏显示。同时,如果还有未传输的数据,则继续发送,直到所有数据都被发送完成。最后,如果传输完成,则关闭文件和服务器,并显示传输成功的提示信息。
相关问题
erver::Server(QWidget *parent) : QDialog(parent), ui(new Ui::Server) { ui->setupUi(this); setFixedSize(400, 207); tPort = 5555; tSrv = new QTcpServer(this); connect(tSrv, SIGNAL(newConnection()), this, SLOT(sndMsg())); initSrv(); } Server::~Server() { delete ui; } void Server::initSrv() { payloadSize = 64*1024; totalBytes = 0; bytesWritten = 0; bytesTobeWrite = 0; ui->sStatusLbl->setText(tr("请选择要传送的文件")); ui->progressBar->reset(); ui->sOpenBtn->setEnabled(true); ui->sSendBtn->setEnabled(false); tSrv->close(); } void Server::refused() { tSrv->close(); ui->sStatusLbl->setText(tr("对方拒绝接受!")); } void Server::closeEvent(QCloseEvent *) { on_sCloseBtn_clicked(); }
这段代码实现了一个QTcpServer的初始化和一些槽函数的定义。下面是对每个函数的解释:
1. `Server::Server(QWidget *parent) : QDialog(parent), ui(new Ui::Server)`
构造函数,初始化了QTcpServer和UI界面。
2. `void Server::initSrv()`
初始化函数,用于初始化各个变量和控件的状态。
3. `void Server::refused()`
当连接被拒绝时的槽函数,关闭QTcpServer并更新状态栏。
4. `void Server::closeEvent(QCloseEvent *)`
重载关闭事件,关闭QTcpServer。
5. `void Server::~Server()`
析构函数,释放内存。
6. `void Server::sndMsg()`
当有新的连接时的槽函数,用于发送文件数据。
7. `void Server::on_sCloseBtn_clicked()`
关闭按钮的槽函数,关闭QTcpServer并更新状态栏。
8. `void Server::on_sOpenBtn_clicked()`
打开按钮的槽函数,用于选择要传送的文件。
9. `void Server::on_sSendBtn_clicked()`
发送按钮的槽函数,用于发送文件数据。
10. `void Server::updateClientProgress(qint64 numBytes)`
更新客户端进度条的槽函数,用于更新状态栏和进度条。
11. `void Server::displayError(QAbstractSocket::SocketError)`
显示错误信息的槽函数,用于更新状态栏。
//开始播放 void Widget::on_start_play_btn_clicked() { //播放视频 this->player->play(); //播放滑块的初始值 this->ui->slider->setValue(0); //启动定时器 this->timer->start(1000); } //更新数据 void Widget::update_data() { //显示视频总时长以及播放进度 qint64 duration = this->player->duration(); qint64 position = this->player->position(); QTime time_d(0, 0, 0, 0); QTime time_p(0, 0, 0, 0); //给时间标签设置文本内容 this->ui->time1_lab->setText(time_p.addMSecs(position).toString("hh:mm:ss")); this->ui->time2_lab->setText(time_d.addMSecs(duration).toString("hh:mm:ss")); if(duration == position)//判断歌曲是否播放完成 { //循环播放:先停止 this->player->stop();// reset this->player->play(); } }时间进度不变化
在你的代码中,定时器每隔一秒钟会调用 update_data() 函数更新数据,其中包括更新视频播放进度。如果视频播放进度不变化,可能是以下原因:
1. 定时器没有正常启动。你可以在 on_start_play_btn_clicked() 函数中添加一个 qDebug() 语句来确认定时器是否启动了。
2. 视频播放器没有正常工作。你可以在 update_data() 函数中添加一个 qDebug() 语句来确认 duration 和 position 是否正确获取到了视频的总时长和当前播放进度。
3. 视频文件本身有问题。你可以换一个视频文件测试一下,看是否仍然出现播放进度不变化的情况。
如果以上三个方面都没有问题,那么可以考虑检查你的代码逻辑是否有误。