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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QListWidget и QIcon  (Прочитано 2744 раз)
urivskay
Гость
« : Март 02, 2017, 12:55 »

Добрый день всем. У меня следующая проблема. В коде создаю QListWidget в который добавляю QListWidgetItem с картинками. Картинка может весить до 20 МБ. И потому после выбора картинке в файловом диалоге картинка на форме показывается не сразу, а спустя секунд 4-5. Хотела во время этого ожидания отображать gif анимацию. Но столкнулась с проблемой. Пока картинка грузится в объект анимация тоже не показывается... Грустный Подскажите, пожалуйста, как можно решить эту проблему ? Мне нужно чтобы анимация показывалась сразу, без задержек.
Вот мой код:
Код:
// заголовочный файл
class Loader : public QLabel{
    public:
    Loader()
    {
        animate = new QMovie(_pathToGif);
        animate->setFileName(_pathToGif);
        this->setMovie(animate);
        animate->start();
    }
    ~Loader()
    {
        animate->stop();
    }

    private:
        QString _pathToGif = "ajax-loader.gif";
        QMovie* animate;
};

class UploadPhotos : public QWidget
{
    Q_OBJECT

public:
    explicit UploadPhotos(QWidget *parent = 0);
    ~UploadPhotos();

private:
    Ui::UploadPhotos *ui;
    QListWidget *listWidget;
    QPushButton *addPhotoPushButton;
    Loader *loader;

    QListWidgetItem* createQListWidgetItem();

private slots:
 void addPhotoPushButton_clicked();
};

// файл реализации
void UploadPhotos::addPhotoPushButton_clicked()
{
    QFileDialog dialog(this);
    dialog.setNameFilter(tr("Images (*.png *.xpm *.jpg)"));
    dialog.setViewMode(QFileDialog::Detail);
    QString filePath = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                    "C:/",
                                                    tr("Images (*.png *.jpg)"));
    qDebug() << filePath;

    QFileInfo fi(filePath);
    QString fileName = fi.baseName();
    QString fileSuffix = fi.suffix();
    QString fileNameAndSuffix = fi.fileName();

    qDebug() << fi.completeSuffix() << fi.suffix();

    QListWidgetItem* item = createQListWidgetItem();   // показывает анимацию gif
    QIcon icon = QIcon(filePath); // здесь подгружается выбранная пользовательм картинка!
    item->setData(Qt::DecorationRole, icon); // показываем эту картинку
}

QListWidgetItem *UploadPhotos::createQListWidgetItem()
{
    QListWidgetItem* item = new QListWidgetItem( listWidget );
    item->setSizeHint( loader->sizeHint() );
    listWidget->setItemWidget( item, loader );

    return item;
}

Хотелось бы решить эту проблему без загрузки картинки в другом потоке. Возможно ли это ?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Март 02, 2017, 14:19 »

Хотелось бы решить эту проблему без загрузки картинки в другом потоке. Возможно ли это ?
Нет. Но ничего сложного в использовании другого потока нет, посмотрите примеры на QtConcurrent.
Записан
urivskay
Гость
« Ответ #2 : Март 02, 2017, 16:02 »

Спасибо за совет!  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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