【问题标题】:QStatemachine to trigger signal: connected slots not called触发信号的QStatemachine:未调用连接的插槽
【发布时间】:2013-09-25 12:08:32
【问题描述】:

我想编写一个函数来显示我的 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();

【问题讨论】:

    标签: qt qt4 qstatemachine


    【解决方案1】:

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

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

    你应该:

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

    2. 添加QSignalTransition 以触发到d1 的转换。

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

    您说您的函数是从插槽调用的。显然,某处有一个信号触发了该插槽。这就是您用来创建QSignalTransition 的对象和信号。

    【讨论】:

    • 请再看一遍问题。
    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 2015-03-14
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多