Qt State Machine Transition в макете

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

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

Во-вторых:
Как я могу показать виджет, когда в состоянии? Например, меню: когда пользователь нажимает кнопку в меню, виджет (который ранее был скрыт с помощью 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 ();

10

Решение

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

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...
1

По вопросам рекламы [email protected]