我正在尝试创建一个程序,等待用户将某些内容输入到行编辑窗口小部件中,当他们按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:我意识到信号没有达到我想要的水平,但我无法弄清楚要使用哪种信号。
答案 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();
}