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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPropertyAnimation не работает "rotation"  (Прочитано 9640 раз)
kvrus
Гость
« : Май 07, 2011, 18:44 »

Не крутится куллер не работает "rotation", почему то пишет
QPropertyAnimation: you're trying to animate a non-existing property rotation of your QObject
А кнопочка нормально выпадает. Почему так?

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent){
lbl = new QLabel(this);
lbl->setGeometry(5,5,373,373);
lbl->setPixmap(QPixmap(":/cooller.png"));
btn = new QPushButton("ROTATE",this);
btn->setGeometry(180,-40,100,40);
m_ani = new QPropertyAnimation(btn,"pos",this);
m_ani2 = new QPropertyAnimation(lbl,"rotation",this);
connect(btn,SIGNAL(clicked()),this,SLOT(chengeAngle()));
this->setFixedSize(400,400);
}

Widget::~Widget()
{

}

void Widget::mousePressEvent(QMouseEvent *e){
    m_ani->setDuration(500);
    if (btn->y()==-40){
        m_ani->setEndValue(QPoint(180,50));
        m_ani->setEasingCurve(QEasingCurve::InBack);
    } else {
        m_ani->setEndValue(QPoint(180,-40));
        m_ani->setEasingCurve(QEasingCurve::InBack);
    }
m_ani->start();
}

void Widget::chengeAngle(){
m_ani2->setStartValue(qreal(0));
m_ani2->setEndValue(qreal(-360));
//m_ani2->setEasingCurve(QEasingCurve::InBack);
m_ani2->start();
}
Записан
kvrus
Гость
« Ответ #1 : Май 08, 2011, 07:47 »

Короче вообще не понимаю почему не работает эта штука.
байтаррай должен содержать имя свойства объекта которое мы хотим проанимировать,
В коде который я приел я пытался изменить лейблу свойство rotation, и у лейбла действительно нет такого свойства , поэтому и не работает.
Но вот сейчас попробовал сделать вращение для QGraphicsObject и у него есть свойство "rotate":
p1->rotate(qreal(30)); напямую оно работает - поворачивает!!!
а через анимацию не поворачивает:
 
m_anim1 = new  Animation(p1,"rotate");
p1->rotate(qreal(30));
m_anim1->setStartValue(qreal(-180));
m_anim1->setEndValue(qreal(-10));
m_anim1->setDuration(500);
connect(m_anim1,SIGNAL(finished()),m_anim1,SLOT(start()));
m_anim1->start();

и пишет тоже :
QPropertyAnimation: you're trying to animate a non-existing property rotate of your QObject
Записан
kvrus
Гость
« Ответ #2 : Май 08, 2011, 08:17 »

Все господа разобрался:

есть класс элемента отображения который мы хотим вращать (при конструировании подкладываем ему картинку, полупрозрачный PNG):
//---------------------------------------------------------------------------------------------------------------
// Класс анимированной пиксмапки
// QPixmap - подсовываем в конструкторе
//---------------------------------------------------------------------------------------------------------------
class PixmapItem : public QObject, public QGraphicsPixmapItem{
    Q_OBJECT
    Q_PROPERTY(QPointF pos READ pos WRITE setPos)
    Q_PROPERTY(qreal rotation READ rotation WRITE setRotation)
public:
    PixmapItem(const QPixmap &pix) : QGraphicsPixmapItem(pix){
    }
};
В этом классе необходимо задать свойства
Q_PROPERTY(qreal rotation READ rotation WRITE setRotation)
по книжке это примерно так:
Q_PROPERTY(type name READ getFunction [WRITE setFunction] [RESET resetFunction] [DESIGNABLE bool] [SCRIPTABLE bool] [STORED bool])
Этот макрос используется для создания и управления свойствами. Мета компилятор контролирует тип значения, возвращаемого get- функции который должен совпадать с типом свойства, быть указателем на него или статической ссылкой.
После такого макроса, класс можно вращать:

    m_anim1 = new  QPropertyAnimation(p1,"rotation");
    m_anim1->setStartValue(qreal(-0));
    m_anim1->setEndValue(qreal(-360));
    m_anim1->setDuration(500);
    connect(m_anim1,SIGNAL(finished()),m_anim1,SLOT(start()));
    m_anim1->start();

Вот только надо еще центр вращения задать.
"И все таки она вертится"  Улыбающийся
Записан
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #3 : Май 13, 2011, 13:49 »

  connect(m_anim1,SIGNAL(finished()),m_anim1,SLOT(start()));

m_anim1->setLoopCount(-1); // forever
Записан

lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #4 : Май 16, 2011, 08:36 »

Вот только надо еще центр вращения задать.

С центром вращения никаких проблем:
Код
C++ (Qt)
#ifndef WDGTMYCLOCK_H
#define WDGTMYCLOCK_H
 
#ifdef BUILD_MY_PLUGIN
#include <QtDesigner/QDesignerExportWidget>
#endif
 
#include <QtGui>
#include <QtGui/QWidget>
#include <QtGui/QGraphicsPixmapItem>
#include <QtCore/QPropertyAnimation>
 
#include <math.h>
 
#ifdef  M_PI
#define PI M_PI
#else
#define PI 3.14159265358979323846
#endif
 
 
class PixmapItem : public QObject, public QGraphicsPixmapItem{
   Q_OBJECT
   Q_PROPERTY(QPointF pos READ pos WRITE setPos)
   Q_PROPERTY(qreal rotate READ rotation WRITE setRot/*ation*/)
public:
   PixmapItem(const QPixmap &pix) : QGraphicsPixmapItem(pix){
 
       // Set point rotation
       crX = qreal(pixmap().width())  / 2.0;
       crY = qreal(pixmap().height()) / 2.0;
       // Radius rotation
       crR = sqrt(crX*crX + crY*crY);
 
 
       // Adjust point from scene
       crX = qreal(pixmap().width())  / 2.0F - 0.0F;
       crY = qreal(pixmap().height()) / 2.0F - 5.0F;
   }
 
   inline
   void setRot(qreal a)
   {
       qreal dxc = cos(((a+225.0F) / 360.0F) * 2 * PI) * crR + crX;
       qreal dyc = sin(((a+225.0F) / 360.0F) * 2 * PI) * crR + crY;
 
       this->setPos(dxc, dyc);
       setRotation(a);
   }
 
 
private:
   qreal crR; // radius
   qreal crX; // point rotation x
   qreal crY; // point rotation y
};
 
class
#ifdef BUILD_MY_PLUGIN
      QDESIGNER_WIDGET_EXPORT
#endif
       WdgtMyClock : public QWidget
{
   Q_OBJECT
 
public:
 
   inline explicit
   WdgtMyClock(QWidget *parent = 0): QWidget(parent)
   {
       this->setBaseSize(128,128);
       this->setFixedSize(128,128);
 
       an_pix = new PixmapItem(QPixmap(":/img/clock/arrow.png"));
 
       m_anim = new QPropertyAnimation(an_pix,"rotate",this);
       m_anim->setEasingCurve(QEasingCurve::Linear);
       m_anim->setStartValue(qreal(0.0F));
       m_anim->setEndValue(qreal(360.0F));
       m_anim->setDuration(1333);
       m_anim->setDirection(QAbstractAnimation::Forward);// Forward Backward
       m_anim->setLoopCount(-1); // forever
       //connect(m_anim,SIGNAL(finished()),m_anim,SLOT(start()));
       m_anim->start();
 
       scene = new QGraphicsScene(this);
       scene->addPixmap(QPixmap(":/img/clock/clock.png"));
       scene->addItem(an_pix);
 
       view = new QGraphicsView(scene, this);
       view->setBaseSize(this->size());
       view->setFixedSize(this->size());
       view->show();
   }
 
   inline
   ~WdgtMyClock()
   {
       delete an_pix;
       delete scene;
       delete view;
   }
 
public Q_SLOTS:
   inline void start(){ m_anim->start(); }
   inline void stop() { m_anim->stop();  }
 
 
private:
   QPropertyAnimation *m_anim;
   PixmapItem         *an_pix;
   QGraphicsScene     *scene;
   QGraphicsView      *view;
};
 
#endif // WDGTMYCLOCK_H
 
 

А можно ли вывести анимированный объект PixmapItem вне сцены ?
Записан

GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 16, 2011, 09:39 »

Цитировать
А можно ли вывести анимированный объект PixmapItem вне сцены ?
Это как это  Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
lesav
Частый гость
***
Offline Offline

Сообщений: 235


qnx.org.ru


Просмотр профиля WWW
« Ответ #6 : Май 16, 2011, 10:41 »

Или чтобы не видно было сцены за анимированным объектом.

В аттаче пояснение проблемы. 
Картинки:
слева текущее состояние.
справа что требуется.

Расписывать решение не требуется, нужен ответ в двух-пяти словах.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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