Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: urivskay от Март 02, 2017, 12:55



Название: QListWidget и QIcon
Отправлено: 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;
}

Хотелось бы решить эту проблему без загрузки картинки в другом потоке. Возможно ли это ?


Название: Re: QListWidget и QIcon
Отправлено: Old от Март 02, 2017, 14:19
Хотелось бы решить эту проблему без загрузки картинки в другом потоке. Возможно ли это ?
Нет. Но ничего сложного в использовании другого потока нет, посмотрите примеры на QtConcurrent.


Название: Re: QListWidget и QIcon
Отправлено: urivskay от Март 02, 2017, 16:02
Спасибо за совет!  :)