- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使用 QuaZip 提取 .zip 文件并在 QProgressDialog 中显示其提取进度?
我试过这个 question1 的例子(还有这个 question2 )没有成功。因为我需要解压缩 .zip 文件(不是 .gz 文件)并且该代码显示进度百分比但不解压缩文件。即便如此,我也不知道如何在 QProgressDialog 中显示 %。
我已经能够使用以下方法提取 .zip 文件:
JlCompress::extractDir("C:/test/test.zip", "C:/test/");
但是,这还不足以实现我的目标,因为我需要在 QProgressDialog 中实时显示提取进度...
这是我的代码:
QString fileName = "C:/test/firefox-29.0.1.gz"; //I need to unzip .zip files
qDebug() << "Opened";
progressUnzip->setWindowTitle(tr("Unzip Manager"));
progressUnzip->setLabelText(tr("Unzipping %1. \nThis can take a long time to complete").arg(fileName));
progressUnzip->setAttribute(Qt::WA_DeleteOnClose);
QFile file(fileName);
file.open(QFile::ReadOnly);
QuaGzipFile gzip;
gzip.open(file.handle(), QuaGzipFile::ReadOnly);
progressUnzip->show();
while(true) {
QByteArray buf = gzip.read(1000);
//process buf
if (buf.isEmpty()) { break; }
QFile temp_file_object;
temp_file_object.open(file.handle(), QFile::ReadOnly);
double progress = 100.0 * temp_file_object.pos() / file.size();
updateUnzipProgress(temp_file_object.pos(), file.size());
qDebug() << qRound(progress) << "%";
}
unzipFinished();
qDebug() << "Finish";
地点:
void MainWindow::updateUnzipProgress(qint64 bytesRead, qint64 totalBytes)
{
qDebug() << bytesRead << "/" << totalBytes;
qint64 th = 1;
if (totalBytes >= 100000000)
{
th = 1000;
}
progressUnzip->setMaximum(totalBytes/th);
progressUnzip->setValue(bytesRead/th);
}
// When unzip finished or canceled, this will be called
void MainWindow::unzipFinished()
{
qDebug() << "Unzip finished.";
progressUnzip->hide();
}
在此代码中,QProgressDialog 不显示任何进度条,最后文件未解压缩。
有什么想法吗?
谢谢你的帮助,
最佳答案
我不会为您编写完整的代码,但我可以给您一些提示来帮助您解决问题。
QuaZIP 库不提供任何有关提取进度的 Qt 信号,这意味着您应该自己实现它。
首先,看一下JlCompress::extractDir
函数实现,看看它是如何工作的。源代码可以找到here .该函数创建一个 QuaZip
对象,它描述了您要提取的 zip 存档。然后它遍历存档中的文件。在每次迭代中,它都会创建一个 QuaZipFile
对象,该对象描述存档中的压缩文件,然后将其数据写入(=提取)到一个新文件中。
这是复制函数:
static bool copyData(QIODevice &inFile, QIODevice &outFile)
{
while (!inFile.atEnd()) {
char buf[4096];
qint64 readLen = inFile.read(buf, 4096);
if (readLen <= 0)
return false;
if (outFile.write(buf, readLen) != readLen)
return false;
}
return true;
}
inFile
是压缩的 (QuaZipFile
) 文件,outFile
是压缩数据提取到的新文件。
现在你应该明白底层逻辑了。
要添加有关提取进度的信号,您可以将 JlCompress::extractDir
源代码复制到某个包装类并进行一些更改。
在遍历存档中的文件时,您可以使用 QuaZipFile::getFileInfo
获取有关它们的信息。该信息包含未压缩的文件大小。现在回到 copyData
函数。您知道写入了多少字节,也知道预期的文件大小。这意味着您可以计算单个文件的提取进度。您还可以使用 QuaZip::getFileInfoList64
获取文件总数及其未压缩的大小。这也可以让您计算整个提取进度。
关于c++ - Qt:QuaZip 提取文件并在 QProgressDialog 中显示其进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35136155/
我正在使用 QProgressDialog,它显然只显示进度并且它会沿途递增。当它达到 100% 时,其上的进度条将重置为零,而不是之后显示 100%。 progress是类的成员变量。 QShare
我在使用我的应用程序上的 QProgressDialog 时遇到了一些问题。 当用户点击计算按钮时,我会显示一个从 QThread 更新的 QProgressDialog(我认为这与问题无关),当这个
我想从我的工作线程更新一个modal QProgressDialog。但是,如果我将对话框设置为模态,我的应用程序就会崩溃(并且对话框没有显示任何进度)。如果我不这样做,一切都会顺利(但用户可以修改程
我正在使用 QProgressDialog 来显示从 QTreeView 中的数据库加载数据的进度。我使用信号和槽来发送记录数和当前记录。这是插槽代码: void MainWindow::loadDa
我正在运行处理器繁重的操作并使用 QProgressDialog 向用户报告。然而,取消按钮工作不稳定 - 有时它在整个运行过程中被忽略,有时它会响应,但仅在进度的某个点之后(这一点也不一致)。在我看
我有一个根据MVC模型设计的程序。我的 View 有一个 open 按钮,我可以在其中打开文件。文件被解析,并根据文件内容完成大量计算。 现在我想显示一个加载程序来指示用户应该等待。我对 Python
我有理由在循环中使用 QProgressDialog,我希望对话框弹出并等待用户输入,然后再显示对话框。然而,在第二次循环中,对话框一直保持匿名,直到它开始正确更新。下面是一些示例代码: QProgr
这个问题在这里已经有了答案: Disable QDialogs default close button (upper left "cross button")? (5 个答案) 关闭 9 年前。
我正在开发一个无法共享源代码的大项目。在那个项目中,我们在 Windows(不是在 ubuntu 中)中遇到了一些可重现的堆栈溢出错误,调试器的堆栈跟踪显示进度对话框设置为窗口模式,正在递归调用 QP
我有一个简单的程序,我希望有一个远程更新的模式、非阻塞进度窗口(使用 QProgressDialog)。 SIZE 只是控制 QProgressDialog 的最大值。但是,如果我将它的值设置为 4
progress = QtGui.QProgressDialog("Parsing Log", "Stop", 0,numberOfLinesInFile , self) progress.s
我正在使用 QT 4.8.5。我在带有 MinimumDuration 的 QProgressDialog 上遇到了一些问题。这是文档:http://doc.qt.io/qt-4.8/qprogres
从 MFC 应用程序启动 Qt 应用程序时,我在显示模态 Qt 对话框时遇到问题。具体来说,当我将其父级设置为 QWinWidget 实例时,QProgressDialog 实例将不会显示在 MFC
我刚刚编写了一些基于 QThread 的代码来执行大型计算。为了可视化进度,我需要打开一个 QProgressDialog。该对话框是应用程序模式的(使用 open()),因为我不想在计算期间修改主窗
我正在从线程调用 QProgressDialog 并且无法将其设置为模态窗口,即使我将 setModal 设置为 true。我希望在 QProgressDialog 运行时阻塞主窗口。 以下是我的一段
我正在使用 subprocess.call 来运行需要一段时间(>5 分钟)才能运行的命令提示符命令: subprocess.call([command, param1, param2], cwd=c
我正在使用 QProgressDialog 来显示我的 initializeGL() 函数的进度,但是小窗口显示为未绘制...这是简化的代码: QProgressDialog barTest("Wai
主 GUI 线程在等待 QFuture 时更新 QProgressDialog 的正确方法是什么。具体来说,这个循环中发生了什么: QProgressDialog pd(...); QFuture f
有时我的 QProgressDialog 显示,有时它根本不显示(好像没有调用 processEvents)。 processEvents() 命令是否存在任何可能导致 QProgressDialog
考虑这个 SLOT ,在我的主线程中,由一个按钮触发,该按钮采用 QTreeWidgetItem 的列表来自QTreeWidget .它使用 QtConcurrent::map()调用来执行一个长任务
我是一名优秀的程序员,十分优秀!