Не понимаю, что не так делаю.
Вот код создания стейтов.
C++ (Qt)
void AnimationController::registerCommunityCards(QVector<SCard> &cards, QPointF deckpos, QObject *sender, const char *signal)
QState *state = new QState(communityCardsState), *initial;
{
for(int i = 0; i < 5; ++i)
{
state->assignProperty(cards[i].cardItem, "visible",false);
state->assignProperty(cards[i].cardItem,"pos",deckpos);
}
CommunityCardsTransition *trans = new CommunityCardsTransition(sender, signal);
state->addTransition(trans);
initial = state;
for(int c = 0; c < 5; ++c)
{
state = new QState(communityCardsState);
for(int i = 0; i < 5; ++i)
{
state->assignProperty(cards[i].cardItem, "visible",i <= c);
state->assignProperty(cards[i].cardItem,"pos", i <= c ? cards[i].pos : deckpos);
}
trans = new CommunityCardsTransition(sender, signal);
state->addTransition(trans);
}
communityCardsState->setInitialState(static_cast<QAbstractState *>(communityCardsState->children().at(0)));
}
Привожу код, чтобы не было вопросов, хотя там ничего особенного.
C++ (Qt)
class CommunityCardsTransition : public QSignalTransition
{
public:
CommunityCardsTransition(QObject *sender, const char *signal)
:QSignalTransition(sender,signal) {
}
virtual bool eventTest(QEvent *e)
{
// Сюда никак не попадаю. Но очень хочу!
QStateMachine::SignalEvent *se = dynamic_cast<QStateMachine::SignalEvent*>(e);
if (!QSignalTransition::eventTest(e))
return false;
return true;
}
};
Использование:
C++ (Qt)
animationController_->registerCommunityCards(communityCards_,layoutCfg_->getDealerDeckPos(),this,SIGNAL(communityCards(int)));
emit communityCards(3);
Так вот я никогда не попадаю в eventTest. Почему так может быть? Что делаю не так?
я нифига не понял :D
про наследование так и не осилил прочитать, но мне кажется, что раз
bool QSignalTransition::eventTest ( QEvent * event ) [virtual protected]
то и надо делать так:
C++ (Qt)
protected:
bool eventTest(QEvent *e)
{
// Сюда никак не попадаю. Но очень хочу!
QStateMachine::SignalEvent *se = dynamic_cast<QStateMachine::SignalEvent*>(e);
if (!QSignalTransition::eventTest(e))
return false;
return true;
}
а может и с паблик прокатит, если слово virtual убрать, я хз :)
http://developer.qt.nokia.com/doc/qt-4.8/qsignaltransition.html
C++ (Qt)
class CheckedTransition : public QSignalTransition
{
public:
CheckedTransition(QCheckBox *check)
: QSignalTransition(check, SIGNAL(stateChanged(int))) {}
protected:
bool eventTest(QEvent *e) {
if (!QSignalTransition::eventTest(e))
return false;
QStateMachine::SignalEvent *se = static_cast<QStateMachine::SignalEvent*>(e);
return (se->arguments().at(0).toInt() == Qt::Checked);
}
};
...
QCheckBox *check = new QCheckBox();
check->setTristate(true);
QState *s1 = new QState();
QState *s2 = new QState();
CheckedTransition *t1 = new CheckedTransition(check);
t1->setTargetState(s2);
s1->addTransition(t1);
виртуал пофиг, а вот разный доступ это скорее всего причина проблемы
Два аналогичных класса в тех же условиях работают прекрасно.
Но вообще косячок небольшой.