Анимация элементов списка / перерисовка Qt QListView - PullRequest
3 голосов
/ 28 июня 2011

Чего бы я хотел достичь :

Визуальная индикация для привлечения внимания к вновь добавленным элементам в QListView. Я имел в виду, что фоновый цвет «пульсирует» один раз (исчезает от цвета к фону).

Настройка

У меня есть модель / представление, использующее QListView, отображающее QStandardItems. Qt версия 4.7

Что я пробовал:

Я создал новый класс, производный от QStyledItemDelegate. У меня есть свой собственный метод рисования для визуализации элемента. Эта часть работает. Я создал объект QTimeLine и настроил его на создание событий для перерисовки элементов.

Я не могу понять, как вызвать перерисовку элемента QListView.

В конструкторе делегата элемента:

   timeLine = new QTimeLine( 3000, this );
   timeLine->setFrameRange( 100, 0 );
   connect( timeLine, SIGNAL( frameChanged( int ) ), this, SLOT( update() ) );
   timeLine->start();

Я попытался подключиться к событию sizehintChanged, но это не работает

void myDelegate::update()
{
   const QModelIndex index;
   emit QStyledItemDelegate::sizeHintChanged( index );
}

Есть предложения? Можно ли это сделать с помощью таблиц стилей?

1 Ответ

5 голосов
/ 28 июня 2011

Стандартная практика включения анимации в код - использование конечных автоматов.Анимации в Qt не могут быть достигнуты с использованием QtStylesheets.Либо используйте QML, либо используйте QStyledItemDelegate и конечный автомат.

 /*CustomItemDelegate*/

    int state;
    enum states{
        animating,
        normal
     }

    void setstate(int state){
        this->state = state;
        /*Start animation depending on state ,by starting a QTimer and calling 
        repaint when the timer expires,also change animation variables like opacity ,         
        angle etc etc*/

    }

     void paint(QPainter *painter, const QStyleOptionViewItem &option,
            const QModelIndex &index) const{

          switch(state){
               case animating:
                     break;
               case normal;
                     break;
          }
      }
    ....

 /*CustomListView*/

    slots:
       void dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ){
              ( (CustomItemDelegate)itemDelegate(topleft) )->setState(animating);
       } 
    ....


 /*Mainwindow*/
      connect(model,SIGNAL(datachanged(QModelIndex,QModelindex)),view,SLOTS(QModelindex,QModelindex));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...