10

さて、私は Qt アプリケーションを開発しており、Qt State Framework を使用していくつかのアニメーションを作成したいと考えています。

最初: 状態遷移を使用して、水平レイアウトに含まれるボタンのグループを別の垂直レイアウトにアニメーション化するにはどうすればよいですか?

2 番目: 状態のときにウィジェットを表示するにはどうすればよいですか? メニューの例: ユーザーがメニューのボタンをクリックすると、ウィジェット (以前は 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 ();
4

2 に答える 2

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

状態 s1 の s0 に遷移を追加します。

于 2013-11-19T07:09:41.230 に答える
1

最初: stateMachine を使用してウィジェットを水平レイアウトから垂直レイアウトに移動しますか? 方法がわからない、本当に。

2 番目: 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...
于 2014-11-21T14:52:19.667 に答える