Russian Qt Forum
Ноябрь 05, 2024, 22:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка изображений из каталога  (Прочитано 6396 раз)
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;
        }
    }
}
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Февраль 23, 2015, 08:53 »

Вызывайте загрузку через очередь сообщений:
QMetaObject::invokeMethod( this, "loadRecent", Qt::QueueConnect );
Записан
Hvzh
Гость
« Ответ #2 : Февраль 23, 2015, 09:35 »

Увы, не помогло...
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Февраль 23, 2015, 09:54 »

Увы, не помогло...
Не может быть, покажите как сейчас у вас выглядит код.
Странно, что он вообще остается виден после завершения getExistingDirectory. Еще попробуйте перед загрузкой картинок вызвать QApplication::processEvents().
А какая версия Qt?
« Последнее редактирование: Февраль 23, 2015, 09:59 от Old » Записан
Hvzh
Гость
« Ответ #4 : Февраль 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 );
    }
}
Записан
Hvzh
Гость
« Ответ #5 : Февраль 23, 2015, 11:13 »

Да, забыл. сам openProject - слот, привязанный к пункту меню:

Код:
    connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openProject()));
Записан
Hvzh
Гость
« Ответ #6 : Февраль 23, 2015, 11:26 »

Перед вызовом invokeMethod поставил задержку в 5 миллисекунд. Все заработало нормально. Но не нравится мне это...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Февраль 23, 2015, 12:19 »

А простенько вставить processEvents (после getExistingDirectory) ?
Записан
Hvzh
Гость
« Ответ #8 : Февраль 23, 2015, 14:31 »

А простенько вставить processEvents (после getExistingDirectory) ?
Не помогает
Записан
Bepec
Гость
« Ответ #9 : Февраль 23, 2015, 14:46 »

А я скажу в чем у вас проблема - у вас загрузка изображений блокирует главный поток приложения. Потому или выносите в отдельный поток, или в каждой итерации вашего цикла вызывайте processEvents Улыбающийся
Записан
Hvzh
Гость
« Ответ #10 : Февраль 23, 2015, 15:08 »

А я скажу в чем у вас проблема - у вас загрузка изображений блокирует главный поток приложения. Потому или выносите в отдельный поток, или в каждой итерации вашего цикла вызывайте processEvents Улыбающийся
Вызов в цикле помог, спасибо. Раньше я вызывал processEvents только однажды, перед началом цикла. Видимо, это было рано. А про отдельный поток думал, но пока не решил, нужно ли
Записан
Bepec
Гость
« Ответ #11 : Февраль 23, 2015, 15:14 »

Думайте, решайте, пишите Веселый
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #12 : Февраль 23, 2015, 16:58 »

Вместо QLabel'ов можно (и чаще всего нужно) заюзать какой-нибудь View (QListView, QTableView, ...)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.106 секунд. Запросов: 22.