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)); } } void Server::on_sOpenBtn_clicked() { fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) { theFileName = fileName.right(fileName.size() - fileName.lastIndexOf('/')-1); ui->sStatusLbl->setText(tr("要传送的文件为: %1").arg(theFileName)); ui->sSendBtn->setEnabled(true); ui->sOpenBtn->setEnabled(false); } }
时间: 2024-02-14 15:22:26 浏览: 80
这段代码是一个Qt框架下的服务器端程序,用于传输文件。其中 `updClntProgress(qint64 numBytes)` 函数实现了文件传输的进度条显示和统计,并在传输完成时关闭本地文件和服务器端口,同时在界面上显示传输成功的提示。`on_sOpenBtn_clicked()` 函数用于打开要传输的文件,并在界面上显示要传输的文件名,同时启用“发送”按钮,禁用“打开”按钮。
相关问题
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)); } }
这段代码是服务器端更新客户端传输进度的槽函数。在传输文件时,每次客户端发送数据,都会触发bytesWritten信号,该槽函数会将已传输的字节数记录下来,并更新进度条和状态栏显示。同时,如果还有未传输的数据,则继续发送,直到所有数据都被发送完成。最后,如果传输完成,则关闭文件和服务器,并显示传输成功的提示信息。
//开始播放 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. 视频文件本身有问题。你可以换一个视频文件测试一下,看是否仍然出现播放进度不变化的情况。
如果以上三个方面都没有问题,那么可以考虑检查你的代码逻辑是否有误。
阅读全文