Russian Qt Forum

Qt => Model-View (MV) => Тема начата: skydion от Март 03, 2010, 11:24



Название: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 11:24
Ребята есть потребность сделать в QListWidget каждый рядок (элемент) картинкой.

Код:
scaledPreview = imagePreview->scaled(s, Qt::KeepAspectRatio, Qt::FastTransformation);
lw->setData(Qt::UserRole+1, QVariant(scaledPreview));

делаю так и через делегата пробую отображать

Код:
QByteArray ba = index.data(Qt::UserRole+1).toByteArray();

    QBuffer buffer(&ba);
    buffer.open(QIODevice::ReadWrite | QIODevice::Unbuffered);

    QImage *imagePreview = new QImage();
    imagePreview->load(&buffer, "PNG");

    QRect rect(QPoint(0,0), imagePreview->size());

    painter->drawImage(rect, *imagePreview);

ничего не рисует... раньше делал

Код:
lw->setData(Qt::DecorateRole, QVariant(scaledPreview));

понятно что работало, но мне кажется, что это немного не правильно  :-\

и вот это Qt::UserRole+1 такое возможно? или свои роли задавать невозможно?


Название: Re: QListWidget и картинки
Отправлено: alexman от Март 03, 2010, 12:07
и вот это Qt::UserRole+1 такое возможно? или свои роли задавать невозможно?

Свои роли можно задавать!


Название: Re: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 12:22
Понятно, значит нужно копать дальше, что, где не так...

пс. Продебугил так почему-то из моей роли нет даных...


Название: Re: QListWidget и картинки
Отправлено: alexman от Март 03, 2010, 12:47
Попробуй для примера сначала с текстом поработать: установи для своей роли текст, затем получи... Я думаю так будет проще разобраться в связях!


Название: Re: QListWidget и картинки
Отправлено: Kolobok от Март 03, 2010, 12:58
Рисовать надо в QStyleOptionViewItemV4::rect.

А чем Qt::DecorationRole не устраивает?


Название: Re: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 12:59
Инициализирую

Код:
lw->setData(Qt::UserRole+1, QVariant("TEST"));

В делегате сделал так...

Код:
    QString text = index.data(Qt::UserRole+1).toString();
    painter->drawText(myOption.rect, Qt::AlignCenter, text);

всеравно ничего не отображает, хотя даные в text возвращает...


Название: Re: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 13:01
Рисовать надо в .

А чем Qt::DecorationRole не устраивает?

Ем... ну Qt::DecorationRole как бы для иконок которые возле текста, а я бы хотел сделать бекграундом для каждого итема
картинки которые я задаю... типа превюшки...

А как этот QStyleOptionViewItemV4::rect получить? нужно приведение типа или как?


Название: Re: QListWidget и картинки
Отправлено: alexman от Март 03, 2010, 13:16
Что за модель юзаешь?

bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )?


Название: Re: QListWidget и картинки
Отправлено: Kolobok от Март 03, 2010, 13:50
Ем... ну Qt::DecorationRole как бы для иконок которые возле текста, а я бы хотел сделать бекграундом для каждого итема
картинки которые я задаю... типа превюшки...
Qt::BackgroundRole ?

А как этот QStyleOptionViewItemV4::rect получить? нужно приведение типа или как?

Код:
void QStyledItemDelegate::paint(QPainter *painter,
        const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    QStyleOptionViewItemV4 opt = option;
    initStyleOption(&opt, index);

    ...
}


Название: Re: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 14:14
Ем... ну Qt::DecorationRole как бы для иконок которые возле текста, а я бы хотел сделать бекграундом для каждого итема
картинки которые я задаю... типа превюшки...
Qt::BackgroundRole ?

Qt::BackgroundRole The background brush used for items rendered with the default delegate. (QBrush)
Я уже читал об этом и понял что через эту роль передается QBrush...

А как этот QStyleOptionViewItemV4::rect получить? нужно приведение типа или как?

Код:
void QStyledItemDelegate::paint(QPainter *painter,
        const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    QStyleOptionViewItemV4 opt = option;
    initStyleOption(&opt, index);

}

Понятно... сделал так

Код:
void PreviewTemplateDelegate::paint(QPainter *painter,
    const QStyleOptionViewItem &option,
    const QModelIndex &index) const
{
QStyleOptionViewItemV4 myOption = option;

initStyleOption(&myOption, index);

myOption.displayAlignment = Qt::AlignLeft | Qt::AlignBottom;

QString text = index.data(Qt::UserRole+1).toString();
painter->drawText(myOption.rect, Qt::AlignCenter, text);
}

не рисует....


Название: Re: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 14:16
Что за модель юзаешь?

bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )?

ем... QListWidget пока только отображает даные, обновляються не через модель...
даные берутся из другой модели и просто туда записываются...

вся суть в тому что через Qt::DecorationRole работает оно и понятно иконка становится размером картинки ))) 200х200 или другого размера....


Название: Re: QListWidget и картинки
Отправлено: Kolobok от Март 03, 2010, 15:12
Qt::BackgroundRole The background brush used for items rendered with the default delegate. (QBrush)
Я уже читал об этом и понял что через эту роль передается QBrush...

Код:
QBrush ( const QPixmap & pixmap )
QBrush ( const QImage & image )

кистью может быть картинка


Название: Re: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 17:02
Хм.... это уже интересно :)
Никогда бы не подумал - QBrush ( const QImage & image )
Спасибо, иду попробую, что из этого выйдет...


Название: Re: QListWidget и картинки
Отправлено: skydion от Март 03, 2010, 17:55
Рапортирую  ;D

QBrush хорош, но... я упустил из виду, что он заливает всю область кистю "моя картинка", это не хорошо...

вот делал так

Код:
void PreviewTemplateDelegate::paint(QPainter *painter,
   const QStyleOptionViewItem &option,
   const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    QBrush brush = index.data(Qt::BackgroundRole).value<QBrush>();
    QImage imagePreview = brush.textureImage();

    painter->drawImage(QPoint(0,0), imagePreview);

    QStyledItemDelegate::paint(painter, option, index);
}

инициализирую

Код:
QBrush background(scaledPreview);
lw->setData(Qt::BackgroundRole, QVariant(background));

получаю фигню... я вот еще пробую получить размер картинки и вернуть размер элемента списка

Код:
QSize PreviewTemplateDelegate::sizeHint(const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
    Q_ASSERT(index.isValid());

    QBrush brush = index.data(Qt::BackgroundRole).value<QBrush>();

    QImage imagePreview = brush.textureImage();
    QSize s = imagePreview.size();

    return s;
}

пока что это не очень спасает...

вот что получается
картинка №1 к примеру такая сделана, но в списке отображается как картинка №2
тоже самое картинка №3 отображается как №4 вторая в списке...
Еще помоему вторая попадает на место первой в списке...


Название: Re: QListWidget и картинки
Отправлено: Hammer от Апрель 16, 2010, 10:21
Может, тебе подойдет в качестве примера The Pixelator example из справки?