frage zu QTimer aus QT
-
hallo,
ich bin mit dem code (siehe unten) am verzweifeln:
ich habe folgende klasse, wobei fuer meine Frage nur die methodenShowHand()
HideHand()
ShowCard(ushort)
und
HideCard(ushort)relevant sind.
// ********************************************************** class GUI_MainWnd : public QMainWindow // ********************************************************** { Q_OBJECT // ////////////////////////////////////////////////////////// public: GUI_MainWnd(QWidget *pParent=NULL); void ShuffleDeck(); void GiveHand(); // ////////////////////////////////////////////////////////// public slots: void Test(); void ShowHand(); void HideHand(); void ShowCard( ushort idx ); void HideCard( ushort idx ); private: CARD m_deck[DECKSIZE]; GUI_CardWdg *m_pCardWdgs[HANDSIZE]; }; // **********************************************************
Die ausimplementierung dieser 4 methoden sieht so aus:
// ////////////////////////////////////////////////////////// void GUI_MainWnd::ShowCard( ushort idx ) // ////////////////////////////////////////////////////////// { if( idx >= HANDSIZE ) return; m_pCardWdgs[idx]->Show(); } // ////////////////////////////////////////////////////////// void GUI_MainWnd::HideCard( ushort idx ) // ////////////////////////////////////////////////////////// { if( idx >= HANDSIZE ) return; m_pCardWdgs[idx]->Hide(); } // ////////////////////////////////////////////////////////// void GUI_MainWnd::ShowHand() // ////////////////////////////////////////////////////////// { for(ushort i=0; i<HANDSIZE; i++) { QTimer *pTimer = new QTimer(this); pTimer->setSingleShot(true); connect(pTimer, SIGNAL(timeout()), this, SLOT(ShowCard(i))); pTimer->start(1000); } } // ////////////////////////////////////////////////////////// void GUI_MainWnd::HideHand() // ////////////////////////////////////////////////////////// { for(ushort i=0; i<HANDSIZE; i++) { QTimer *pTimer = new QTimer(this); pTimer->setSingleShot(true); connect(pTimer, SIGNAL(timeout()), this, SLOT(HideCard(i))); pTimer->start(1000); } }
Das Problem ist, dass der Timer weder ShowCard(i) noch HideCard(i) aufruft (laesst sich aber alles glatt uebersetzen).
entferne ich die parameter aus der deklaration von ShowCard(..) und HideCard(..) und gebe als Slot fuer den Timer die Parameterlosen Varianten an, so werden diese aufgerufen.
Ich moechte aber die Parameter beibehalten.Wieso ruft der Timer den Slot ShowCard(ushort) nicht auf !?!?!
Vielen Dank.
-
das ist so einfach nicht möglich
über dieconnect
-Syntax kannst du keine Parameter übergeben... das macht das Signal... daher darf die Parameterliste des Slots nicht länger sein, als die des Signals... außerdem notierst du dort nur die Signatur..was möglich wäre (u.a.)
// ********************************************************** class GUI_MainWnd : public QMainWindow // ********************************************************** { Q_OBJECT // ... signals: ShowCardSignal( ushort ); HideCardSignal( ushort ); }; // ////////////////////////////////////////////////////////// void GUI_MainWnd::GUI_MainWnd(QWidget *pParent) : QMainWindow( pParent ) // ////////////////////////////////////////////////////////// { connect( this, SIGNAL( ShowCardSignal( ushort ) ), this, SLOT( ShowCard( ushort ) ) ); connect( this, SIGNAL( HideCardSignal( ushort ) ), this, SLOT( HideCard( ushort ) ) ); // ... } // ////////////////////////////////////////////////////////// void GUI_MainWnd::ShowHand() // ////////////////////////////////////////////////////////// { for(ushort i=0; i<HANDSIZE; i++) { QTimer *pTimer = new QTimer(this); pTimer->setSingleShot(true); emit ShowCardSignal(i); pTimer->start(1000); } } // ////////////////////////////////////////////////////////// void GUI_MainWnd::HideHand() // ////////////////////////////////////////////////////////// { for(ushort i=0; i<HANDSIZE; i++) { QTimer *pTimer = new QTimer(this); pTimer->setSingleShot(true); emit HideCardSignal(i); pTimer->start(1000); } }
wobei es sicherlich auch eleganter gehen würde (beispielsweise den HideHand/ShowHand-Slot zeitgesteuert aufrufen)
-
ok habs begriffen und ne loesung gefunden.
vielen dank fuer die infos.
gruss.