gpt4 book ai didi

c++ - 如何从状态对象本身而不是外部改变状态?

转载 作者:行者123 更新时间:2023-11-30 02:38:14 25 4
gpt4 key购买 nike

    class ListenState : public QState
{
public:
ListenState();
~ListenState();

signals:
void nextState();

public slots:
void getSettings();
};

cpp文件是

ListenState::ListenState()
{
qDebug() << "Entering ListenState";
}

ListenState::~ListenState()
{
qDebug() << "Leaving ListenState";
}

void ListenState::getSettings()
{
Commands cmd;

cmd.getSettings();

emit exited( QEvent::None ); // i want to change state now
}

我想做的是当调用 getSettings() 时,我想将状态更改为下一个。我以为我会 emit exited() 但它没有构建。我尝试创建自己的信号 nextState() 但如果我在此函数中发出信号,它也不会编译。

上面的代码错误是:

ListenState.cpp:23: error: C2664: 'QAbstractState::exited' : cannot convert parameter 1 from 'QEvent::Type' to 'QAbstractState::QPrivateSignal' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

如果我用 emit nextState(); 发出我自己的信号,错误是:

ListenState.obj:-1: error: LNK2001: unresolved external symbol "public: void __thiscall ListenState::nextState(void)" (?nextState@ListenState@@QAEXXZ)

当我处于原始状态时,有没有办法触发从一种状态到另一种状态的转换?

最佳答案

首先,状态的生命周期与何时进入或退出状态关系不大。只要状态机存在,状态通常就存在,或者它们可以即时创建和销毁。您正在连接状态的构造函数和析构函数,并期望在进入或退出状态时调用它们。事实并非如此。

要检查何时进入或退出某个状态,您可以使用以下命令:

void exposeStateTransitions(QState * state, QString name) {
if (name.isEmpty()) name = state->objectName();
QObject::connect(state, &QState::entered, []{
qDebug() << "state" << name << "was entered";
});
QObject::connect(state, &QState::exited, []{
qDebug() << "state" << name << "was exited";
});
}

其次,状态只能通过使用转换对象来改变。您需要为所需的转换创建一个转换对象,并提供一个信号或事件来触发它:

class ListenState : public QState {
Q_OBJECT
QSignalTransition m_transition;
Q_SIGNAL void settingsTransition();
public:
ListenState(QState * settingsTarget, QState * parent = 0) :
QState(parent), m_transition(this, SIGNAL(settingsTransition())
{
m_transition.setTargetState(settingsTarget);
addTransition(&m_transition);
}
void getSettings() {
...
emit settingsTransition();
}
};

如果您愿意,您也可以即时触发转换:

class ListenState : public QState {
Q_OBJECT
QSignalTransition m_transition;
Q_SIGNAL void settingsTransition();
public:
ListenState(QState * parent = 0) :
QState(parent), m_transition(this, SIGNAL(settingsTransition())
{
addTransition(&m_transition);
}
void getSettings(QState * target) {
...
m_transition.setTargetState(target);
emit settingsTransition();
}
};

您可以使用事件代替信号:

class ListenState : public QState {
QEventTransition m_transition;
public:
ListenState(QState * parent = 0) :
QState(parent), m_transition(this, QEvent::Leave) {
addTransition(&m_transition);
}
void getSettings(QState * target) {
...
m_transition->setTargetState(target);
QCoreApplication::postEvent(this, new QEvent(QEvent::Leave));
}
};

关于c++ - 如何从状态对象本身而不是外部改变状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31008412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com