Как скопировать файлы и папки из одной директории в другую и отображать процесс копирования в 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());
    }
}
→ Ссылка