Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hvzh от Февраль 23, 2015, 08:30



Название: Загрузка изображений из каталога
Отправлено: Hvzh от Февраль 23, 2015, 08:30
Есть каталоги с изображениями. Пользователю предлагается выбрать каталог, после чего изображения из грузятся как 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;
        }
    }
}


Название: Re: Загрузка изображений из каталога
Отправлено: Old от Февраль 23, 2015, 08:53
Вызывайте загрузку через очередь сообщений:
QMetaObject::invokeMethod( this, "loadRecent", Qt::QueueConnect );


Название: Re: Загрузка изображений из каталога
Отправлено: Hvzh от Февраль 23, 2015, 09:35
Увы, не помогло...


Название: Re: Загрузка изображений из каталога
Отправлено: Old от Февраль 23, 2015, 09:54
Увы, не помогло...
Не может быть, покажите как сейчас у вас выглядит код.
Странно, что он вообще остается виден после завершения getExistingDirectory. Еще попробуйте перед загрузкой картинок вызвать QApplication::processEvents().
А какая версия Qt?


Название: Re: Загрузка изображений из каталога
Отправлено: Hvzh от Февраль 23, 2015, 11:06
Qt 5.4 под Ubuntu 12.04. Код стал выглядеть так:

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

    if(dir != "")
    {
        prjDirectory = dir;
        QMetaObject::invokeMethod( this, "loadRecent", Qt::QueuedConnection );
    }
}


Название: Re: Загрузка изображений из каталога
Отправлено: Hvzh от Февраль 23, 2015, 11:13
Да, забыл. сам openProject - слот, привязанный к пункту меню:

Код:
    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openProject()));


Название: Re: Загрузка изображений из каталога
Отправлено: Hvzh от Февраль 23, 2015, 11:26
Перед вызовом invokeMethod поставил задержку в 5 миллисекунд. Все заработало нормально. Но не нравится мне это...


Название: Re: Загрузка изображений из каталога
Отправлено: Igors от Февраль 23, 2015, 12:19
А простенько вставить processEvents (после getExistingDirectory) ?


Название: Re: Загрузка изображений из каталога
Отправлено: Hvzh от Февраль 23, 2015, 14:31
А простенько вставить processEvents (после getExistingDirectory) ?
Не помогает


Название: Re: Загрузка изображений из каталога
Отправлено: Bepec от Февраль 23, 2015, 14:46
А я скажу в чем у вас проблема - у вас загрузка изображений блокирует главный поток приложения. Потому или выносите в отдельный поток, или в каждой итерации вашего цикла вызывайте processEvents :)


Название: Re: Загрузка изображений из каталога
Отправлено: Hvzh от Февраль 23, 2015, 15:08
А я скажу в чем у вас проблема - у вас загрузка изображений блокирует главный поток приложения. Потому или выносите в отдельный поток, или в каждой итерации вашего цикла вызывайте processEvents :)
Вызов в цикле помог, спасибо. Раньше я вызывал processEvents только однажды, перед началом цикла. Видимо, это было рано. А про отдельный поток думал, но пока не решил, нужно ли


Название: Re: Загрузка изображений из каталога
Отправлено: Bepec от Февраль 23, 2015, 15:14
Думайте, решайте, пишите :D


Название: Re: Загрузка изображений из каталога
Отправлено: vipet от Февраль 23, 2015, 16:58
Вместо QLabel'ов можно (и чаще всего нужно) заюзать какой-нибудь View (QListView, QTableView, ...)