Как скопировать файлы и папки из одной директории в другую и отображать процесс копирования в QProgressBar?
Имеется директория с директориями и файлами.Нужно скопировать директорию с файлами в другое место.Имеется такой код:
void MainWindow::copyPath(QString src, QString dst)
{
QDir dir(src);
if (!dir.exists())
return;
foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
QString dst_path = dst + QDir::separator() + d;
dir.mkpath(dst_path);
qDebug() << dir.entryList(QDir::Files).length();
copyPath(src+ QDir::separator() + d, dst_path);
}
foreach (QString f, dir.entryList(QDir::Files)) {
QFile::copy(src + QDir::separator() + f, dst + QDir::separator() + f);
}
}
Запускаю функцию через QtConcurrent:
QFuture<void> future = QtConcurrent::run(this,&MainWindow::copyPath,QString("/folder1"),QString("/home/user/folder2"));
Как показать,сколько осталось до конца выполнения копирования файлов в QProgressBar?
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
Например, так:
class MainWindow: public QMainWindow {
...
public:
MainWindow(QWidget* parent = null): QMainWindow(parent) {
connect(this, &MainWindow::progress, [&](const QString& src, const QString& dst, int current, int total) {
// Прогресс
qDebug() << src << dst << qRound(current * 100. / total);
});
}
// Отправляем сигнал в очередь событий из потока run
// src - путь к исходному файлу
// dst - к файлу назначения
// current - текущий прогресс
// total - всего файлов папке
void emitProgress(const QString& src,
const QString& dst, int current, int total)
{
emit progress(src, dst, current, total);
}
signals:
void progress(const QString& src, const QString& dst, int current, int total);
}
QFuture<void> future = QtConcurrent::run(
this,
&MainWindow::copyPath,
QString("/folder1"),
QString("/home/user/folder2"),
this); // указатель на объект класса с методом emitProgress
void MainWindow::copyPath(QString src, QString dst, MainWindow* window)
{
QDir dir(src);
if (!dir.exists())
return;
foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
QString dst_path = dst + QDir::separator() + d;
dir.mkpath(dst_path);
copyPath(src+ QDir::separator() + d, dst_path);
}
// Счетчик
int current = 1;
auto list = dir.entryList(QDir::Files);
foreach (QString f, list) {
QString s = src + QDir::separator() + f;
QString d = dst + QDir::separator() + f;
QFile::copy(s, d);
window->emitProgress(s, d, current++, list.length());
}
}