Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > загрузка QPixmap из БД


Автор: ecspertiza 1.4.2009, 08:36
Есть такая тема нужно создать компонент в котором будут создаваться Item в виде таблицы , в каждом Item-e должна быть картинка и внизу описание, проблема в том что картинку я загружаю в QPixmap размерность 5х4 то бишь 20 картинок, довольно токи долго грузятся вот как я подгружаю картинку

Код

QByteArray data = query.values(2).toByteArray();

QPixmap pxm;
pxm.loadFromData(data);

image->setPixmap(QPixmap(data.data())); // QLabel


может есть что то быстрее?

или уже есть готовый компонент вот фотка?

http://pic.ipicture.ru/uploads/090401/o5r5CD5Uc4.jpg

Автор: Elfebet 1.4.2009, 09:20
1. 3 и 4 строка у тебя лишние
2. Для быстроты картинки можно загружать в другом потоке
3. Так же загружать каждую картинку по мере необходимости

Добавлено через 5 минут и 45 секунд
а также использовать QPixmapCache
на счет компонента - для простоты я бы использовал QTableWidget

Автор: ecspertiza 1.4.2009, 09:30
эээ извиняюсь с кодом напутал так как в первом посте написано картинки вообще не подгружаются

Код

QByteArray data = query.values(2).toByteArray();
QPixmap pxm;
pxm.loadFromData(data);

image->setPixmap(pxm);


вот так подгружаются но долго, а загружать в отдельном потоке не знаю навряд ли поможет так как суть такова есть таблица с каталогами у каждого каталога может быть несколько картинок( в идеале неограниченно), вот и отображение должно происходить так, юзверь в QComboBox выбрал каталог и в этот компонент под грузились  картинки размерностью выбранной юзверем, при этом если картинок больше чем позволяет размерность то должен появится ешё и выбор страниц, так что загрузка по мере необходимости уже тоже присутствует)))

Автор: just_geek 1.4.2009, 09:41
гхм, может сам запрос не оптимизирован? Проверь просто выполнение запроса без загрузки в pixmap.
Покажи полностью код вместе запросом и загрузкой pixmap'a, а не этот кусок.

Автор: ecspertiza 1.4.2009, 09:50
процедура запроса и создания массива

Код

    QSqlQuery query;

    QString str = "select Object.id,Catalogue.name,Illustration.image from object,catalogue, "
                "illustration where object.catalogue_id = catalogue.id and "
                "illustration.object_id = object.id and illustration.\"DEFAULT\" = 1 ";

    str += " and Catalogue.name='"+catalogue->currentText()+"'";

    if (!query.exec(str))
    {
        qDebug() << "error execute query!!!";
        qDebug() << str;
    }

    int left = 0;
    int top = 0;

    int wid = (preview->width()-10) / _old_preview_option.horizontal;
    int hei = (preview->height()-10) / _old_preview_option.vertical;

    for (int i = 0;i<_old_preview_option.horizontal*_old_preview_option.vertical;i++)
    {
        query.seek(i,false);
        qDebug() << _old_preview_option.horizontal*_old_preview_option.vertical;
        qDebug() << i << query.value(0).toInt();
        if (left == _old_preview_option.horizontal)
        {
            top++;
            left = 0;
        }

        PreviewItem *item = new PreviewItem(preview,left*wid,top*hei,query.value(2).toByteArray(),
                                            createSostNumber(query.value(0).toInt()));
        item->show();

        left++;
    }


класс PreviewItem

Код

PreviewItem::PreviewItem(QWidget *parent,int x,int y,QByteArray data,QString _text)
:QWidget(parent)
{
    setGeometry(x,y,100,120);

    QVBoxLayout *verticalLayout = new QVBoxLayout(this);

    QPixmap pxm;
    pxm.loadFromData(data);

    image = new QLabel(this);
    image->setScaledContents(true);
    image->setPixmap(pxm);

    verticalLayout->addWidget(image);

    text = new QLabel(this);
    text->setMaximumSize(QSize(16777215, 20));
    text->setAlignment(Qt::AlignCenter);
    text->setText(_text);

    verticalLayout->addWidget(text);
}


вот как то так

Автор: just_geek 1.4.2009, 09:57
Код

PreviewItem::PreviewItem(QWidget *parent,int x,int y,QByteArray data,QString _text)

Передача массива и строки по значению. Замени на ссылку или указатель.

Автор: Elfebet 1.4.2009, 10:14
в твоем случае идет копирование data, что есть лишнее, сделай так
Код

PreviewItem::PreviewItem(QWidget *parent,int x,int y, const QByteArray &data, const QString &_text)


Автор: ecspertiza 1.4.2009, 10:54
Сделал особо не помогло, хотел ещё спросить размер картинок 70-250 кб это сильно много?

всё время жрёт вот этот кусок

Код

QPixmap pxm;
pxm.loadFromData(data);

Автор: just_geek 1.4.2009, 11:44
Цитата

70-250 кб

Это общий размер, или каждой? В любом случае не очень много. У нас в проекте грузятся QImage, гораздо большего размера и в большем количестве. Да еще из пожатого zlib'ом архива. Правда отрисовывается все в QGLWidget smile Все проходит довольно быстро. Как узнал что затык именно в этом куске?

Убрал его и загрузка стала быстрее? Сборка дебаг или релиз?

Автор: ecspertiza 1.4.2009, 12:00
Цитата(just_geek @  1.4.2009,  11:44 Найти цитируемый пост)
Это общий размер, или каждой?


Размер каждой


Цитата(just_geek @  1.4.2009,  11:44 Найти цитируемый пост)
Убрал его и загрузка стала быстрее?


Почтиsmile оставил только этот кусок и скорость не изменилась


Цитата(just_geek @  1.4.2009,  11:44 Найти цитируемый пост)
Сборка дебаг или релиз?


релиз

Ещё такой вопрос как средствами  КуТе уменьшить размер(высота, ширина) изображения?
Думаю может в базе хранить превьюшки размером 200х300 пикселей, они весят килобайт по 10:)

Автор: just_geek 1.4.2009, 12:07
Попробуй его убрать smile А остальное оставить, хотя что это даст...

Метод
Код

QPixmap QPixmap::scaled ( const QSize & size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation ) const

Автор: bsa 1.4.2009, 13:11
Цитата(just_geek @ 1.4.2009,  09:57)
Код

PreviewItem::PreviewItem(QWidget *parent,int x,int y,QByteArray data,QString _text)

Передача массива и строки по значению. Замени на ссылку или указатель.

В документации указано, что в QT все контейнеры имеют архитектуру COW (copy on write), т.е. по сути они сами представляют собой указатели с подсчетом ссылок. Поэтому не удивительно, что при замене на ссылку ничего не изменилось.  smile 

Автор: ecspertiza 1.4.2009, 14:34
Превьюшки немного помогли до превью загрузка на 20-ть картинок была 2.3 сек после 0.9))) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)