Qt: загрузка изображений из каталога

Рейтинг: 0Ответов: 2Опубликовано: 23.02.2015

Есть каталоги с изображениями. Пользователю предлагается выбрать каталог, после чего изображения из грузятся как QLabel's pixmaps. Проблема в следующем. Диалог выбора каталога закрывается только после того, как все изображения загрузятся, а хотелось бы, чтобы сначала диалог закрылся.

Вызов диалога:

void PhotoTableWindow::openProject()
{
    QString dir = QFileDialog::getExistingDirectory(this, tr("Choose Directory"),
                                                    rootDir,
                                                    QFileDialog::ShowDirsOnly
                                                    | QFileDialog::DontResolveSymlinks);

    if(dir != "")
    {
        prjDirectory = dir;
        loadRecent();
    }
}

Загрузка изображений:

void PhotoTableWindow::loadRecent()
{
    QString fileName;
    QImage img;
    QDir dir;

    dir.cd(prjDirectory);

    for(int i = 1; i < 25; i++)
    {
        fileName = QString::number(i) + ".jpg";
        if(QFile::exists(fileName))
        {
            bool b = img.load(fileName);
            qDebug() << "PhotoTableWindow::initLabels(): file " << fileName << " is found";
            if(!b)
            {
                QMessageBox::critical(0, tr("Error!"), tr("Cannot load image!"));
                continue;
            }
            lblList[i]->setPixmap(QPixmap::fromImage(img.scaled(lblList[i]->width(), lblList[i]->height(), Qt::KeepAspectRatio)));
            lblList[i]->repaint();
            isPhoto[i] = 1;
        }
    }
}

Ответы

▲ 1

Я бы рекомендовал еще отлавливать тот случай, когда в диалоге отмену нажали:

QFileDialog dialog(this);
dialog.setFileMode(QFileDialog::DirectoryOnly);
if (dialog.exec()){
   QString dirPath = dialog.selectedFiles();
   QDir dir(dirPath);
   if (dir.exist()
      ....
}

Как-то так. А вообще я предпочитаю выносить все сложные вычисления в отдельный поток и в статусбаре показывать прогрессбар и кнопку отмены.

▲ 1

Перед началом обработки файлов выполните QApplication::processEvents(), чтобы Qt обновила интерфейс и скрыла диалог.