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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Помогите организовать мигание иконки внутри делегата  (Прочитано 34025 раз)
Kolobok
Гость
« Ответ #15 : Февраль 08, 2010, 17:26 »

а вы не рассматривали вариант засовывания gif-анимации в делегат??

Не работает. Я думаю gif-анимация работает только в виджетах.
Записан
crossly
Гость
« Ответ #16 : Февраль 08, 2010, 17:45 »

а как пробовали?? посмотри как реализовано в QLabel
Записан
Kolobok
Гость
« Ответ #17 : Февраль 08, 2010, 18:01 »

Делегат в принципе не может делать анимацию сам, потому что он не знает ничего ни о модели, ни о вью, ни о том, где во вью расположены элементы.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #18 : Февраль 08, 2010, 18:58 »

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

Юра.
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #19 : Февраль 08, 2010, 19:09 »

идея на счет gif анимации и специализированного делегата кажется наиболее здравой, делегат может в своем painEvent проерять условие из вне и решать какой frame из gif рисовать
Записан
Kolobok
Гость
« Ответ #20 : Февраль 08, 2010, 19:17 »

идея на счет gif анимации и специализированного делегата кажется наиболее здравой, делегат может в своем painEvent проерять условие из вне и решать какой frame из gif рисовать
Делегат не виджет. У него нет paintEvent.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #21 : Февраль 08, 2010, 19:21 »

Код
C++ (Qt)
class CBtn_Delegate : public QItemDelegate
{
Q_OBJECT;
QString m_sIconPath;
 
public:
CBtn_Delegate( QObject * parent = 0 );
QWidget * createEditor( QWidget * parent,
const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
void setEditorData( QWidget * editor, const QModelIndex &index ) const;
void setModelData( QWidget *editor, QAbstractItemModel *model,
  const QModelIndex &index ) const;
void updateEditorGeometry( QWidget *editor,
  const QStyleOptionViewItem &option,
  const QModelIndex &index) const;
void paint( QPainter * painter, const QStyleOptionViewItem &option,
const QModelIndex &index ) const;
 
inline void setIconPath( QString sVal ) { m_sIconPath = sVal; }
};
 

Код
C++ (Qt)
void CBtn_Delegate::paint( QPainter * painter, const QStyleOptionViewItem &option,
 const QModelIndex &index ) const
{
QWidget * w = dynamic_cast<QWidget *>( painter->device() );
if ( w )
{
QStylePainter p( w );
QStyleOptionButton opt;
opt.icon = QIcon( m_sIconPath );
opt.iconSize = QSize( 24, 24 );
opt.initFrom( w );
opt.rect = option.rect;
 
bool bChecked = index.data().toInt() > 0;
if ( bChecked )
opt.state |= QStyle::State_On;
p.drawControl( QStyle::CE_PushButton, opt );
}
 
drawFocus( painter, option, option.rect );
}
 

народ выходим из танков, сказал по памяти там он называется просто paint - предназначен для отрисовки ячейки когда не создан эдитор. Думаю у делегата мигалки эдитора вообще не должно быть (а может и нет). Кстати как автор хочем чтобы все мигали разом или в такат? :-) Все это легко делается - но мое мнение что отвлекать будет жутко от основных данных в таблице - достаточно просто иконок... IMHO
Записан
Kolobok
Гость
« Ответ #22 : Февраль 08, 2010, 19:38 »

И где здесь анимация?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #23 : Февраль 08, 2010, 19:40 »

Ее там нет(я и не утверждал обратное) это просто пример моего делегата кот. первый попался на глаза в проекте, код выложил чтобы не быть голословным на счет pain в делегате.
Записан
neosapient
Гость
« Ответ #24 : Февраль 08, 2010, 20:45 »

>> Кстати как автор хочем чтобы все мигали разом или в такат?
Автор хочет, чтобы мигало в такт.

Вообще, внимательно слежу за развитием дискуссии... Способ, по которому пошел, я описал выше в 5 посте.

Медленно, но верно прихожу к выводу, что анимацию исключительно на делегат повесить нельзя. Пришел к мысли, что анимация в ячейках таблицы реализуема только в связке delegat+model+timer или в более общем случае delegat+model+event. И способов убрать модель из этой связке нет, по той причине, что следует от имени модели посылать сигнал QAbstractItemModel::dataChanged(QModelIndex,QModelIndex).
В общем делегаты хороши для статической отрисовки. Да и вся QAbstractItem-архитектура заточена для статической отрисовки.

(очень хочется, чтобы я ошибался, но факты упрямая вещь)

Timer->   Model      ->  Table   ->Delegat
Event->dataChange->rendering->paint
« Последнее редактирование: Февраль 08, 2010, 20:53 от neosapient » Записан
Kolobok
Гость
« Ответ #25 : Февраль 08, 2010, 22:51 »

А таблица большая? И сколько может быть мигающих элементов?

Захотелось сказать пару слов о самой идее. Мигающую таблицу я стал бы делать только для клиента, которого тихо ненавижу. Существует столько способов выделить нужные строки ( цвет фона или  шрифта, размер шрифта или строки ... ), которые привлекают внимание и не приводят к нервному срыву.

PS
Придумал еще один способ. Повесить прокси модель, которая пропускает максимальное количество видимых строк, на мигающие ячейки повесить виджеты с анимацией и прикрутить сбоку скроллбар.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Февраль 09, 2010, 01:11 »

Код
C++ (Qt)
void CBtn_Delegate::paint( QPainter * painter, const QStyleOptionViewItem &option,
 const QModelIndex &index ) const
{
QWidget * w = dynamic_cast<QWidget *>( painter->device() );
if ( w )
{
QStylePainter p( w );
QStyleOptionButton opt;
opt.icon = QIcon( m_sIconPath );
 
... Все это легко делается ...
[/quote]Не вызывает сомнений что Вы владеете Qt, и для Вас это действительно легко. Но чего это надо перекрывать paint (т.е. брать на себя рисование) только для того чтобы изменить background? Чем плохо просто дополнить модель? У модели все на руках, все данные она знает, ну и пусть занимается также и цветом фона - зачем это совать в делегат который так себе "прослойка интеллигенция"?  Улыбающийся
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #27 : Февраль 09, 2010, 10:56 »

Цитировать
Да и вся QAbstractItem-архитектура заточена для статической отрисовки.
Поясните конкретнее что вы имеете ввиду. Что нельзя написать модель так чтобы при частых изменениях в данных эти изменения происходили во VIEW? если я правильно понял то вы ошибаетесь это вполне можно сделать.

Цитировать
Но чего это надо перекрывать paint (т.е. брать на себя рисование) только для того чтобы изменить background? Чем плохо просто дополнить модель? У модели все на руках, все данные она знает, ну и пусть занимается также и цветом фона - зачем это совать в делегат который так себе "прослойка интеллигенция"?
Для меня модель это данные - а в данных просто где-то стоит галочка что эта строка/ячейка/столбец особенные. И вот однажды эту особенность захотелось выделить в таблице миганием - при чем тут модель? А завтра в другой таблице этого не захочется - а в модели останется ненужный функционал, которые вообще ничего не делает с данными а как раз занимается декорациями. Мне кажется здесь как раз вполне нормально использовать делегат для реализации таких декораций. Тем более что с производительностью проблем быть не должно, делегаты для того и придуманы чтобы установить его на колонку и не забивать голову про производительность (при такой установке создается 1 экземпляр класса делегата код которого вызывается при отрисовке каждой ячейки вместо стандартного кода отрисовки ячеек).

По поводу связки с таймером - тоже не вижу особых проблем - даже несколько способов можно придумать:
1) Делегат имеет право иметь слот который будет сконнекчен с сигналом таймера (QTimer) заведенным в программе (ни в моделе, ни в таблице - просто в окне в котором моздается эта таблица будет еще и таймер),
2) Можно не использовать QTimer и сигналы со слотами - а стартовать таймер через int QObject::startTimer ( int interval ) в делегат передать ID созданного таймера и там слушать его в  void MyObject::timerEvent(QTimerEvent *event) проверяя на совпадение с заданным ID

по сигналу от таймера в делегате переключается отрисовываемый фрейм или грубо говоря выбираем картинку одну из двух для отрисовки в данный момент.
Записан
Kolobok
Гость
« Ответ #28 : Февраль 09, 2010, 12:12 »

to break
Я не просто так говорил, что делегат не виджет и у него нет paintEvent. Почитай документацию о том, как происходит рисование в Qt.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #29 : Февраль 09, 2010, 12:27 »

Цитировать
Я не просто так говорил, что делегат не виджет и у него нет paintEvent. Почитай документацию о том, как происходит рисование в Qt.
В чем проблема?
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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