1

我正在尝试创建一个程序,等待用户将某些内容输入到行编辑小部件中,当他们按下回车键时,我想将该值与某个预定义的值(例如“1”)进行比较。我似乎遇到的问题是我找不到使用 QStateMachine 进行这项工作的方法。目前,它会等待用户按下回车键,它只是切换到下一个状态,但我希望它只有在输入为“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();

emit 仅用于代码文档。它的#defined 什么都没有。MOC 将生成的主体mySignalName并归结为对您使用 QObject::connect 连接到的插槽的调用。

要为您的班级添加新插槽,请添加以下内容:

private slots:
    void mySlotName();

请注意,您必须编写插槽的主体。

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