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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QListWidget и картинки  (Прочитано 9321 раз)
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 такое возможно? или свои роли задавать невозможно?
Записан
alexman
Гость
« Ответ #1 : Март 03, 2010, 12:07 »

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

Свои роли можно задавать!
Записан
skydion
Гость
« Ответ #2 : Март 03, 2010, 12:22 »

Понятно, значит нужно копать дальше, что, где не так...

пс. Продебугил так почему-то из моей роли нет даных...
Записан
alexman
Гость
« Ответ #3 : Март 03, 2010, 12:47 »

Попробуй для примера сначала с текстом поработать: установи для своей роли текст, затем получи... Я думаю так будет проще разобраться в связях!
Записан
Kolobok
Гость
« Ответ #4 : Март 03, 2010, 12:58 »

Рисовать надо в QStyleOptionViewItemV4::rect.

А чем Qt::DecorationRole не устраивает?
Записан
skydion
Гость
« Ответ #5 : Март 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 возвращает...
Записан
skydion
Гость
« Ответ #6 : Март 03, 2010, 13:01 »

Рисовать надо в .

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

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

А как этот QStyleOptionViewItemV4::rect получить? нужно приведение типа или как?
« Последнее редактирование: Март 03, 2010, 13:06 от skydion » Записан
alexman
Гость
« Ответ #7 : Март 03, 2010, 13:16 »

Что за модель юзаешь?

bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )?
Записан
Kolobok
Гость
« Ответ #8 : Март 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);

    ...
}
Записан
skydion
Гость
« Ответ #9 : Март 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);
}

не рисует....
Записан
skydion
Гость
« Ответ #10 : Март 03, 2010, 14:16 »

Что за модель юзаешь?

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

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

вся суть в тому что через Qt::DecorationRole работает оно и понятно иконка становится размером картинки ))) 200х200 или другого размера....
Записан
Kolobok
Гость
« Ответ #11 : Март 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 )

кистью может быть картинка
Записан
skydion
Гость
« Ответ #12 : Март 03, 2010, 17:02 »

Хм.... это уже интересно Улыбающийся
Никогда бы не подумал - QBrush ( const QImage & image )
Спасибо, иду попробую, что из этого выйдет...
Записан
skydion
Гость
« Ответ #13 : Март 03, 2010, 17:55 »

Рапортирую  Смеющийся

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 вторая в списке...
Еще помоему вторая попадает на место первой в списке...
« Последнее редактирование: Март 03, 2010, 18:16 от skydion » Записан
Hammer
Гость
« Ответ #14 : Апрель 16, 2010, 10:21 »

Может, тебе подойдет в качестве примера The Pixelator example из справки?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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