Russian Qt Forum

Qt => Model-View (MV) => Тема начата: BagmutA от Июль 18, 2011, 13:13



Название: Проблемы с отображением подписей в QListView
Отправлено: BagmutA от Июль 18, 2011, 13:13
Использую QListView для отображения изображений.
Если поставить в свойствах
Код
C++ (Qt)
QListView setViewMode(QListView::IconMode)
, то отображение большего числа картинок происходит достаточно долго.
Если же поставить в свойствах QListView
Код
C++ (Qt)
setViewMode(QListView::ListMode)
, отображение происходит быстро (картинки отображаются правильно), но подписи к ним, которые я добавляю в модель для даной картинки:
Код
C++ (Qt)
myModel->setData(index, listFiles.at(i), Qt::DisplayRole);
отображаются справа от картинки а не снизу, как я хочу.
Как заставить QListView отображать эти подписи снизу?


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: twp от Июль 18, 2011, 14:58
можно попробовать так
Код:
myModel->setData(index, Qt::AlignBottom, Qt::TextAlignmentRole);


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: BagmutA от Июль 18, 2011, 16:31
В режиме ListMode отображает: -- вложение 1
Если использовать
Код
C++ (Qt)
myModel->setData(index, Qt::AlignBottom, Qt::TextAlignmentRole);
, то: -- вложение 2
А надо чтобы было: -- вложение 3.


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: twp от Июль 18, 2011, 18:32
значит не получится сдлеать стандартными методами, нужно свой делегат делать в котором отрисовывать контент должным образом


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: BagmutA от Июль 18, 2011, 22:44
Я унаследовал QItemDelegate:
Код
C++ (Qt)
class SimpleDelegate : public QItemDelegate
{
public:
   SimpleDelegate(QObject* pobj = 0) : QItemDelegate(pobj)
   {
   }
 
   void paint(QPainter*                   pPainter,
              const QStyleOptionViewItem& option,
              const QModelIndex&          index
             ) const
   {
   }
};
Для QListView умтановил делегата:
    
Код
C++ (Qt)
PreviewList->setItemDelegate(new SimpleDelegate(&listView));
Как мне теперь нарисовать картинку и подпись под ней?
Если в paint рисовать:
Код
C++ (Qt)
pPainter->drawPixmap(option.rect, QPixmap("myPixmap"));
то картинки рисуются обрезаными (option.rect меньше картинки и gridSize или iconSize)
И вообще как изменить option.rect?


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: twp от Июль 19, 2011, 11:14
Нужно переопределить в своем делегате метод QItemDelegate::sizeHint() и возвращать нужный размер для индекса


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: GreatSnake от Июль 19, 2011, 11:35
Код
C++ (Qt)
pPainter->drawPixmap(option.rect, QPixmap("myPixmap"));
Мде, при каждой отрисовке будет создаваться, рисоваться и удаляться пиксмап ???
Чем не устроил QAbstractItemModel::setData()?
Наверное для начала не мешало бы изучить Программирование модель/представление (http://www.doc.crossplatform.ru/qt/4.7.x/model-view-programming.html).


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: BagmutA от Июль 19, 2011, 12:32
Код
C++ (Qt)
pPainter->drawPixmap(option.rect, QPixmap("myPixmap"));
Мде, при каждой отрисовке будет создаваться, рисоваться и удаляться пиксмап ???
Чем не устроил QAbstractItemModel::setData()?
Наверное для начала не мешало бы изучить Программирование модель/представление (http://www.doc.crossplatform.ru/qt/4.7.x/model-view-programming.html).
Да я бы не против. Я собственно так и делал:
Код
C++ (Qt)
myModel->setData(index, "name", Qt::DisplayRole);
myModel->setData(index, QIcon("MyIco"), Qt::DecorationRole);
Так вот проблема в том, как в режиме QListView::ListMode заставить текст заданый
Код
C++ (Qt)
myModel->setData(index, "name", Qt::DisplayRole)
отрисовыватся под иконкой а не справа?


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: BagmutA от Июль 19, 2011, 12:37
Нужно переопределить в своем делегате метод QItemDelegate::sizeHint() и возвращать нужный размер для индекса
То есть делать вот так:
Код
C++ (Qt)
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index)
{
return QSize(MainWindow::icoWidth, MainWindow::icoHeight);
}
Но на сколько я понимаю необходимо QSize возвращаемый этой функцией передать QStyleOptionViewItem& option. А как это сделать?


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: twp от Июль 19, 2011, 13:50
по идее этого достаточно. Единственное что в методе sizeHint нужно еще учесть размер для текста


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: BagmutA от Июль 19, 2011, 14:06
по идее этого достаточно. Единственное что в методе sizeHint нужно еще учесть размер для текста
Да все работает, большее спасибо(у меня была маленькая ошибка).


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: BagmutA от Июль 19, 2011, 14:10
Код
C++ (Qt)
pPainter->drawPixmap(option.rect, QPixmap("myPixmap"));
Мде, при каждой отрисовке будет создаваться, рисоваться и удаляться пиксмап ???
Чем не устроил QAbstractItemModel::setData()?
Наверное для начала не мешало бы изучить Программирование модель/представление (http://www.doc.crossplatform.ru/qt/4.7.x/model-view-programming.html).
А как это происходит в моделе/представление?
При первом отображении создается массив пиксмапов и они потом отрисовываются?


Название: Re: Проблемы с отображением подписей в QListView
Отправлено: twp от Июль 19, 2011, 21:23
При первом отображении создается массив пиксмапов и они потом отрисовываются?
в смысле? пиксмапы как и все остальные данные хранятся в модели