Qt状态机布局中的转换

10

我正在开发一个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 ();

2
动态流畅的GUI正是QML所发明的,你可能想尝试一下。 - Terenty Rezman
“动画化一组按钮”是什么意思?是指它们应该改变颜色之类的吗? - Tab
2个回答

1

第一步: 使用状态机将小部件从水平布局移动到垂直布局?真的不知道该如何做。

第二步: 您可以使用自己的透明属性实现小部件,它可以与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中使用alpha属性:

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

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);

为了使 widget 可见,请添加以下状态转换:
s1->assignProperty(MyWid,"visible", true);

在状态 s0 中添加转换到状态 s1 的过渡。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接