-1

我想编写一个函数来显示我的 GUI 的基本流程,例如,如果我在插槽中调用该函数,它会以 FileMenu->Open(触发信号并启用与其连接的插槽)等状态开始转换。我尝试使用状态机:

d1->assignProperty(ui->menuFile,"visible",true);

d0->addTransition(d1);

d1->addTransition(ui->actionOpen,SIGNAL(triggered()),d0);

dem->addState(d0);
dem->addState(d1);

dem->setInitialState(d0);
dem->start();  

文件菜单未出现在该位置。此外,信号不会在状态转换时触发。我是新手QStateMachine。我不确定以这种方式触发信号是否可行。如果是,那么我的代码有什么问题,或者有没有更好的方法来做到这一点?


编辑:文件菜单更正:

QRect r0 =  this->geometry();
QRect tbar = ui->menuBar->geometry();
QRect r = ui->menuFile->geometry();
r.setCoords(r0.x(),r0.y()+tbar.height(),r0.x()+r.width(),r0.y()+r.height()+tbar.height());

ui->menuFile->setGeometry(r);
ui->menuFile->show();
4

1 回答 1

0

您说问题中给出的代码在一个函数中,并且您希望该函数开始转换以显示菜单。函数本身在插槽内调用。

在这个函数中重新创建状态机是不正确的,函数也没有必要存在。

你应该:

  1. 在小部件/对象构造函数中创建状态机,并且只执行一次。

  2. 添加一个QSignalTransition以触发过渡到d1.

您还应该验证代码是否正常工作。无需在函数中使用状态机,只需使用 . 显示菜单即可ui->menuFile->show()。在您尝试其他任何事情之前,这必须有效。

你说你的函数是从一个插槽调用的。显然,某处有一个信号触发了该插槽。那是您用来创建QSignalTransition.

于 2013-09-25T12:36:06.733 回答