1

ユーザーが行編集ウィジェットに何かを入力するのを待つプログラムを作成しようとしています。ユーザーがEnterキーを押したときに、値を事前定義された値(たとえば、「1」)と比較したいと思います。私が抱えていると思われる問題は、QStateMachineでこれを機能させる方法が見つからないことです。現時点では、ユーザーがEnterキーを押すのを待って、次の状態に切り替わるだけですが、入力が「1」の場合にのみ次の状態に移行したいと思います。これが私が使用しているコードです、そしてあなたが提供できるどんな助けにも感謝します。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->lineEdit, SIGNAL(editingFinished()), this, SLOT(someSlot()));
    setupStateMachine();
}

...

void MainWindow::setupStateMachine()
{
    QStateMachine *machine = new QStateMachine(this);
    QState *s1 = new QState();
    QState *s2 = new QState();
    QState *s3 = new QState();

    s1->assignProperty(ui->label, "text", readFile("intro.txt"));
    s2->assignProperty(ui->label, "text", "In state s2");
    s3->assignProperty(ui->label, "text", "In state s3");

    s1->addTransition(this, SIGNAL(editing()), s2);
    s2->addTransition(this->ui->pushButton, SIGNAL(clicked()), s3);
    s3->addTransition(this->ui->pushButton, SIGNAL(clicked()), s1);

    machine->addState(s1);
    machine->addState(s2);
    machine->addState(s3);
    machine->setInitialState(s1);

    machine->start();

    qDebug() << "State Machine Created";
}

...

void MainWindow::someSlot()
{
    if(ui->lineEdit->text() == "1")
    {
        emit editing();
    }
}

ヘッダーファイル:

{
...
signals:
    void editing();
...
private slots:
    void someSlot();
...
};

PS:信号が私が望むことをしていないことはわかっていますが、どの信号を使用するかがわかりません。

4

1 に答える 1

1

おそらくあなたはeditingFinishedあなた自身のスロットに接続することができます。そのスロットで、入力が「1」であるかどうかを確認します。もしそうなら、addTransition代わりにあなたが渡す新しい信号を発しますeditingFinished

クラスにシグナルを追加するには、次のようにクラスを変更します(クラスQ_OBJECTの最上部に宣言されていることを確認してください)。

signals:
    void mySignalName();

信号は保護されていることが保証されています。関数の本体は記述しません。それがMOCが行うことです。したがって、クラスでシグナルを呼び出したい場合は、次のように呼び出します。

emit mySignalName();

放出はコードの文書化のためだけのものです。#何も定義されていません。MOCは、mySignalNameQObject :: connectを使用して接続するスロットへの呼び出しの本体を生成し、要約します。

クラスに新しいスロットを追加するには、次を追加します。

private slots:
    void mySlotName();

スロットの本体を書き込む必要があることに注意してください。

void MainWindow::mySlotName()
{
    if(myLineEdit->text() == "1")
        emit mySignalName();
}
于 2013-01-17T23:21:09.630 に答える