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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QItemDelegate  (Прочитано 19591 раз)
ритт
Гость
« Ответ #15 : Ноябрь 08, 2007, 00:35 »

сдаётся мне, фокс - анонимус Улыбающийся
Записан
QCasper
Гость
« Ответ #16 : Ноябрь 08, 2007, 01:13 »

Если заглянуть в исходник qitemdelegate то перед вызовом отрисовки drawDecoration() как раз и создаётся rect для определения области где будет отрисовываться иконка

Вот именно! Наконец то Улыбающийся Библиотека все посчитает за меня, и вызовет мне drawDecoration() с готовым рассчитанным ректом Улыбающийся И мне только останется вызвать в этом drawDecoration() код типа painter->drawPixmap("my_mega_icon.png");

Записан
fox
Гость
« Ответ #17 : Ноябрь 08, 2007, 01:29 »

Вот именно! Наконец то Улыбающийся Библиотека все посчитает за меня, и вызовет мне drawDecoration() с готовым рассчитанным ректом Улыбающийся И мне только останется вызвать в этом drawDecoration() код типа painter->drawPixmap("my_mega_icon.png");
Она посчитает для стандартной иконки
И используемый для отрисовки данной иконки QRect decorationRect; наружу не как из paintа не вылазит
Как вы собираетесь получить координаты иконки где она была нарисована?
Так как для drawDecoration() нужно указать область отрисовки полюбому
Или вы предлагаете переопределить drawDecoration()?
Записан
Sergey B.
Программист
*****
Offline Offline

Сообщений: 544



Просмотр профиля WWW
« Ответ #18 : Ноябрь 08, 2007, 07:06 »

Примет из книги Foundations of Qt Development.
Код:
class BarDelegate : public QAbstractItemDelegate
{
public:
BarDelegate( QObject *parent = 0 );
void paint( QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
QSize sizeHint( const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
};

The sizeHint method is shown in Listing 5-10. It simply returns a size that is large enough
yet doesn’t exceed the size limitations. Remember that this is just a hint; the real size can be
changed by Qt for layout issues or by the user by adjusting the size of rows and columns.

Код:
QSize BarDelegate::sizeHint( const QStyleOptionViewItem &option,
const QModelIndex &index ) const
{
return QSize( 45, 15 );
}

Код:
void BarDelegate::paint( QPainter *painter,
const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if( option.state & QStyle::State_Selected )
painter->fillRect( option.rect, option.palette.highlight() );
int value = index.model()->data( index, Qt::DisplayRole ).toInt();
double factor = (double)value/100.0;
painter->save();
if( factor > 1 )
{
painter->setBrush( Qt::red );
factor = 1;
}
else
painter->setBrush( QColor( 0, (int)(factor*255), 255-(int)(factor*255) ) );
painter->setPen( Qt::black );
painter->drawRect( option.rect.x()+2, option.rect.y()+2,
(int)(factor*(option.rect.width()-5)), option.rect.height()-5 );
painter->restore();
}

Код:
QTableView table;
QStandardItemModel model( 10, 2 );
for( int r=0; r<10; ++r )
{
QStandardItem *item = new QStandardItem( QString("Row %1").arg(r+1) );
item->setEditable( false );
model.setItem( r, 0, item );
model.setItem( r, 1, new QStandardItem( QString::number((r*30)%100 )) );
}
table.setModel( &model );
BarDelegate delegate;
table.setItemDelegateForColumn( 1, &delegate );
« Последнее редактирование: Ноябрь 08, 2007, 07:10 от Sergey B. » Записан
QCasper
Гость
« Ответ #19 : Ноябрь 08, 2007, 11:12 »

Или вы предлагаете переопределить drawDecoration()?

Вам действительно это только сейчас стало понятно? Это уже давно было предложено, правда vaprele07, а не мною. За что ему собственно и спасибо.
Записан
fox
Гость
« Ответ #20 : Ноябрь 08, 2007, 12:14 »

Вам действительно это только сейчас стало понятно? Это уже давно было предложено, правда vaprele07, а не мною. За что ему собственно и спасибо.
Странный путь Но каждому свое
Записан
QCasper
Гость
« Ответ #21 : Ноябрь 09, 2007, 13:57 »

Странный путь Но каждому свое

Это у меня то странный путь? Шокированный Веселый Ну конечно, куда проще лопатить код библиотеки, в поисках необходимого кода, разбираться как он работает и тащить его в свою реализацию. Причем после этого еще наверняка всячески модифицировать и только потом (!!!) добавить код, рисующий крестик. Конечно, куда более сложное дело переопределить метод drawDecoration(painter, option, rect, pixmap), только добавив в него код, который рисует крестик в области rect Улыбающийся
« Последнее редактирование: Ноябрь 09, 2007, 13:59 от QCasper » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #22 : Ноябрь 09, 2007, 14:56 »

...куда проще лопатить код библиотеки, в поисках необходимого кода, разбираться как он работает и тащить его в свою реализацию.

Между прочим, это не так уж и плохо, знать как работает библиотека (конечно если это вам интересно). В коде самой библиотеке находиться много интересных решений и примеров использования того или иного метода. Чтение исходного кода бибилотеки может помочь при решении той или иной задачи. Так что зря вы так, fox прав, можно было хотябы подсмотреть...
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
fox
Гость
« Ответ #23 : Ноябрь 09, 2007, 14:57 »

Это у меня то странный путь? Шокированный Веселый Ну конечно, куда проще лопатить код библиотеки, в поисках необходимого кода, разбираться как он работает и тащить его в свою реализацию. Причем после этого еще наверняка всячески модифицировать и только потом (!!!) добавить код, рисующий крестик. Конечно, куда более сложное дело переопределить метод drawDecoration(painter, option, rect, pixmap), только добавив в него код, который рисует крестик в области rect Улыбающийся
Поэтому я и написал каждому своё Тем более для случая если все картинки статичны на мой взгляд вообще нет смысла рисовать что то по верх них Проще заранее сделать нужные наборы

Тем более все равно придётся перетаскивать часть кода при переопределении drawDecoration() Так как если посмотреть что там делается то можно заметить что там не только тупая отрисовка картинки в определённых координатах но и как минимум проверка отрисовка картинки в выделенной ячейки или нет
« Последнее редактирование: Ноябрь 09, 2007, 15:00 от fox » Записан
QCasper
Гость
« Ответ #24 : Ноябрь 09, 2007, 15:41 »

Тем более для случая если все картинки статичны на мой взгляд вообще нет смысла рисовать что то по верх них Проще заранее сделать нужные наборы
Не статичны, в определенный момент времени, нужно на стандартную иконку файла накладывать некоторое изображение. Например, если Вы когда-нибудь пользовались TortoiseSVN под винду, то видели как в проводнике появляются галочки и восклицательные знаки на файлах, которые up to date или changed соответственно. Вот мне нужно что-то вроде этого.

Тем более все равно придётся перетаскивать часть кода при переопределении drawDecoration() Так как если посмотреть что там делается то можно заметить что там не только тупая отрисовка картинки в определённых координатах но и как минимум проверка отрисовка картинки в выделенной ячейки или нет

Не придется. Мой делегат выглядит так:
Код:
void PatchItemDelegate::paint(QPainter *p, const QStyleOptionViewItem & o, const QModelIndex & i) const {
const_cast<PatchItemDelegate*>(this)->m_Operation = i.data(OperationRole).toInt();
QItemDelegate::paint(p, o, i);
}
void PatchItemDelegate::drawDecoration(QPainter *p, const QStyleOptionViewItem & o, const QRect & r, const QPixmap & px) const {
QItemDelegate::drawDecoration(p,o,r,px);

if (m_Operation == None) return;

int x = r.topLeft().x();
int y = r.topLeft().y() + r.height()/3;

p->drawPixmap(x,y, QPixmap(m_IconFiles[m_Operation]));
}

И всё! В зависимости от OperationRole конкретного итема, поверх его иконки рисуется соответствующее изображение (восклицательный знак или галочка по аналогии с TortoiseSVN). И не надо ниче считать, таскать куски кодов, где-то копаться, разбираться. И дело тут не в "каждому своё", а в оптимальном подходе к решению задачи.
Записан
QCasper
Гость
« Ответ #25 : Ноябрь 09, 2007, 15:53 »

Между прочим, это не так уж и плохо, знать как работает библиотека (конечно если это вам интересно). В коде самой библиотеке находиться много интересных решений и примеров использования того или иного метода. Чтение исходного кода бибилотеки может помочь при решении той или иной задачи. Так что зря вы так, fox прав, можно было хотябы подсмотреть...

Я не говорю, что просмотр кода библиотеки в ста процентах случаев бесполезное занятие. Я говорю, что нафига решать через такие грабли данную задачу, когда можно обойтись и без этого?
Записан
fox
Гость
« Ответ #26 : Ноябрь 09, 2007, 16:20 »

Не статичны, в определенный момент времени, нужно на стандартную иконку файла накладывать некоторое изображение. Например, если Вы когда-нибудь пользовались TortoiseSVN под винду, то видели как в проводнике появляются галочки и восклицательные знаки на файлах, которые up to date или changed соответственно. Вот мне нужно что-то вроде этого.
Не видел так как не пользуюсь

Не придется. Мой делегат выглядит так:
У этого решения есть один маленький визуальный минус связанный как раз с выделением или наоборот в зависимости от того что вы пытаетесь добиться В стандартном варианте поведения иконка при отрисовки в выделенной ячейке немного притеняется В вашем решении по верх притенённой иконки будет отрисованн яркий значек Хотя может это вы и хотите добиться Из ваших сообщений не совсем понятно

И всё! В зависимости от OperationRole конкретного итема, поверх его иконки рисуется соответствующее изображение (восклицательный знак или галочка по аналогии с TortoiseSVN). И не надо ниче считать, таскать куски кодов, где-то копаться, разбираться. И дело тут не в "каждому своё", а в оптимальном подходе к решению задачи.
Видимо у нас с вами разное понятие об оптимальности
Записан
fox
Гость
« Ответ #27 : Ноябрь 09, 2007, 16:21 »

Я не говорю, что просмотр кода библиотеки в ста процентах случаев бесполезное занятие. Я говорю, что нафига решать через такие грабли данную задачу, когда можно обойтись и без этого?
Мы опять возвращаемся к точке зрения На мой взгляд и вкус данное решение будет граблями
Записан
QCasper
Гость
« Ответ #28 : Ноябрь 09, 2007, 16:27 »

Мы опять возвращаемся к точке зрения На мой взгляд и вкус данное решение будет граблями

В чем грабельность моего (вернее vaprele07) решения мне не понятно. Если не принимать во внимание минус, упомянутый Вами в предыдущем посте, вобщем-то достаточно нормальное решение. По-крайней мере время точно экономит, да и по производительности вряд-ли уступает.
Записан
fox
Гость
« Ответ #29 : Ноябрь 09, 2007, 16:51 »

В чем грабельность моего (вернее vaprele07) решения мне не понятно. Если не принимать во внимание минус, упомянутый Вами в предыдущем посте, вобщем-то достаточно нормальное решение. По-крайней мере время точно экономит, да и по производительности вряд-ли уступает.
Для меня лично он не лучше не хуже других решений, просто я бы не пошёл по данному пути решения по нескольким причинам
Про мизерный визуальный недостаток я упомянул
Так же остаётся вопрос про производительность Но данный вопрос нельзя обсуждать оторвано от задачи которая решается Так как в вашем случаи возможно это будет решение хорошее В моем случаи оно будет возможно снижать производительность
Возможно привести ещё доводы, начиная с того что в какой нибудь будущей версии Qt может измениться поведение drawDecoration() так что данное решение будет не работоспособным и тд Но это уже будут мелочи

Просто я предложил свои варианты и попытался понять предложеные варианты
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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