如何从QLineEdit小部件获取文本并在状态机中使用它?

时间:2013-01-17 23:02:02

标签: c++ qt qt4 qt-creator

我正在尝试创建一个程序,等待用户将某些内容输入到行编辑窗口小部件中,当他们按Enter键时,我想将该值与某些预定义的值进行比较(例如“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:我意识到信号没有达到我想要的水平,但我无法弄清楚要使用哪种信号。

1 个答案:

答案 0 :(得分: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();
}