crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Анимация изменения цвета
Гость_Иван_*
сообщение 26.7.2015, 22:25
Сообщение #1





Гости








    


Всем привет. Пытаюсь сделать анимацию изменения цвета заливки у своего класса наследованного от QGraphicsPathItem. Вот значится код:

class Pointer : public QObject, public QGraphicsPathItem
{
    Q_OBJECT
    Q_PROPERTY(QBrush brush READ brush WRITE setBrush)
public:
    QStateMachine *state;
    QState *stateTrue, *stateFalse;
    Brush *col;

    Pointer(const QPainterPath &border, QGraphicsItem *parent);
signals:
    void enableTrue();
    void enableFalse();
protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *)
    {
        emit enableFalse();
    }
};

Код конструктора:
Pointer::Pointer(const QPainterPath &border, QGraphicsItem *parent)
    : QGraphicsPathItem(border, parent)
{
    this->setPen(QPen(Qt::NoPen));
    this->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
    
    col = new Brush(Qt::red);

    state = new QStateMachine;
    stateTrue = new QState(state);
    stateFalse = new QState(state);
    QState *stateNone = new QState(state);
    stateNone->assignProperty(col, "color", QColor(100,100,100));
    stateTrue->assignProperty(col, "color", QColor(150,150,150));
    stateFalse->assignProperty(col, "color", QColor(200,200,200));

    stateNone->assignProperty(this, "brush", *col);
    stateTrue->assignProperty(this, "brush", *col);
    stateFalse->assignProperty(this, "brush", *col);

    state->setInitialState(stateNone);

    QParallelAnimationGroup *group = new QParallelAnimationGroup;

    QPropertyAnimation *anim = new QPropertyAnimation(col, "color");
    anim->setDuration(2000);
    QPropertyAnimation *anim1 = new QPropertyAnimation(this, "brush");
    anim1->setDuration(2000);
    group->addAnimation(anim);
    group->addAnimation(anim1);

    QSignalTransition *trans = stateNone->addTransition(this, SIGNAL(enableTrue()), stateTrue);
    trans->addAnimation(group);
    trans = stateNone->addTransition(this, SIGNAL(enableFalse()), stateFalse);
    trans->addAnimation(group);

    state->start();
    this->setBrush(*col);
}

Ну это уже совсем такой вариант... но суть думаю ясна. Вот кстати Brush:
class Brush : public QObject, public QBrush
{
    Q_OBJECT
    Q_PROPERTY(QColor color READ color WRITE setColor)
public:
    Brush() : QBrush()
    {}
    Brush(Qt::GlobalColor color, Qt::BrushStyle style = Qt::SolidPattern) : QBrush(color, style)
    {}
};

Пробовал разные варианты.

Использую обычную QBrush, если делать анимацией напрямую изменение brush в this, то она цвет меняет по истечению времени, но не плавно, оно и понятно, ведь не получится "анимационно" переходить из, условно, кисть1 в кисть2, это ведь не числовое значение. Добавить свойство цвета к this и его менять у меня не вышло. Там есть только такое this->brush().color() ну и setSolor().

Создал свою Brush, пробовал анимацией менять только цвет в своей Brush, числовые значения цвета "анимационно" менялись, проверял. Возможно я что-то не так делал, но однако же не вышло назначить свою Brush в this->brush так, чтобы при изменении Brush менялся и this->brush. То есть цвет в Brush менялся, но в this->brush он оставался на своём начальном значении. Была идея объявить свою Brush так: Brush *col= this->brush(); Но не работает, ведь там QBrush, а col это Brush от QBrush и Object. А если объявлять col как QBrush, тогда ж цвет анимацией не сменишь...

И вот последний вариант, что я скинул, попытка соединить предыдущие варианты. Что-то не работает тоже.
Прошу помощи...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 16:32