2013-09-17 2 views
10

Ну, я разрабатываю приложение Qt, и я хочу использовать Qt State Framework для создания некоторых анимаций.Qt State Machine Transition в макете

Первое: Как можно анимировать группу кнопок, содержащуюся в горизонтальной компоновке, в другую вертикальную компоновку, используя состояние перехода?

Во-вторых: Как я могу показать виджет, когда находится в состоянии? Например, меню: Когда пользователь нажимает кнопку в меню, отображается виджет (который ранее был скрыт с widget-> hide()) ... ???

Это пример кода:

boxInsert = new BoxInsert(this); 
boxInsert->hide(); 


btn1 = new QPushButton("Introducir", this); 
btn2 = new QPushButton("Informe", this); 
btn3 = new QPushButton("Salir", this); 

QStateMachine *machine = new QStateMachine(this); 

QState *st1 = new QState(machine); 
st1->setObjectName ("menuMode"); 
st1->assignProperty (btn1, "pos", QPointF(center - btn1->width()/2, 20)); 
st1->assignProperty (btn2, "pos", QPointF(center - btn1->width()/2, 40)); 
st1->assignProperty (btn3, "pos", QPointF(center - btn1->width()/2, 60)); 
st1->assignProperty (boxInsert, "visible", QVariant(false)); 

QState *st2 = new QState(machine); 
st2->setObjectName ("barMode"); 
st2->assignProperty (btn1, "pos", QPointF(40, 0)); 
st2->assignProperty (btn2, "pos", QPointF(40, 0)); 
st2->assignProperty (btn3, "pos", QPointF(40, 0)); 
st1->assignProperty (boxInsert, "visible", QVariant(true)); 

machine->setInitialState (st1); 

QAbstractTransition *t1 = st1->addTransition (btn1, SIGNAL(clicked()), st2); 
//QSequentialAnimationGroup *sq1 = new QSequentialAnimationGroup; 
//sq1->addPause (250); 
t1->addAnimation (new QPropertyAnimation(btn1, "pos")); 
t1->addAnimation (new QPropertyAnimation(btn2, "pos")); 
t1->addAnimation (new QPropertyAnimation(btn3, "pos")); 
t1->addAnimation (new QPropertyAnimation(boxInsert, "visible")); 

machine->start(); 
+2

Animated GUI жидкость, что QML был изобретен для, вы можете дать ему попробовать –

+0

Что вы имеете в виду анимировать группа Кнопки - это что-то вроде того, что они должны менять цвет? – Tab

ответ

1

Это что-то вроде, когда вы начнете машину она изменит цвет кнопки, которая может указывать на это щелкают затем выполнить что-то, связанный с сигналом поэтому его связанный слот будет выполнен.

s0->addTransition(s1); 
s1->assignProperty(ui->pushButton,"styleSheet","background-color:rgb(255,0,0);"); 
s1->addTransition(s2); 
s2->addTransition(ui->pushButton,SIGNAL(clicked()),s0); 
QStateMachine m; 
m.addState(s0); 
m.addState(s1); 
m.addState(s2); 
m.setInitialState(s0); 

Чтобы сделать видимый виджет добавить переход состояния, как это:

s1->assignProperty(MyWid,"visible", true); 

и добавить переход в s0 для состояния s1.

1

Первый: Переместить виджеты с горизонтальной компоновки в вертикальную, используя stateMachine? Не знаю, как это сделать.

Второе: Вы можете реализовать виджет с вашим собственным свойством прозрачности, которая работает с QGraphicsEffect:

class myWidget 
{ 
    //your methods 
    Q_PROPERTY(double alpha READ alpha WRITE setAlpha) 
    double mAlpha; 
    double alpha() {return mAlpha;} 
    void setAlpha(double a); 
    QGraphicsOpacityEffect* eff; 
} 

сделать QGraphicsEffect работы в SetAlpha() метод:

void myWidget::setAlpha(double a) 
{ 
    mAlpha = a; 
    if(mAlpha < 0.0) 
     mAlpha = 0.0; 
    if(mAlpha > 1.0) 
     mAlpha = 1.0; 

    if(mAlpha == 0) 
    { 
     this->hide(); 
    } 
    else 
    { 
     this->show(); 
     eff->setOpacity(mAlpha); 
    } 

    this->update(); 
} 

И, конечно, , установите QGraphicsOpacityEffect вашему виджету в конструкторе:

eff = new QGraphicsOpacityEffect(this); 
eff->setOpacity(mAlpha); 
this->setGraphicsEffect(eff); 

Тогда вы можете работать с альфа свойство в QState:

QState* s1 = new QState(mainState); 
s1->assignProperty(mywidget, "alpha", 1.0); 
//and so on... 

 Смежные вопросы

  • Нет связанных вопросов^_^