Russian Qt Forum

Qt => Общие вопросы => Тема начата: andrew.k от Февраль 15, 2012, 10:22



Название: не работает QSignalTransition
Отправлено: andrew.k от Февраль 15, 2012, 10:22
Не понимаю, что не так делаю.

Вот код создания стейтов.
Код
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. Почему так может быть? Что делаю не так?


Название: Re: не работает QSignalTransition
Отправлено: thechicho от Февраль 15, 2012, 12:39
я нифига не понял :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 убрать, я хз :)


Название: Re: не работает QSignalTransition
Отправлено: thechicho от Февраль 15, 2012, 12:44
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);


Название: Re: не работает QSignalTransition
Отправлено: mutineer от Февраль 15, 2012, 12:46
виртуал пофиг, а вот разный доступ это скорее всего причина проблемы


Название: Re: не работает QSignalTransition
Отправлено: andrew.k от Февраль 15, 2012, 12:55
виртуал пофиг, а вот разный доступ это скорее всего причина проблемы
Два аналогичных класса в тех же условиях работают прекрасно.
Но вообще косячок небольшой.