Slot in einer Methode aufrufen
-
Hi, ich versuche schon etwas länger einen Slot in einer Methode aufzurufen.
Diese Methode wird jedoch wiederum in einer Methode einer anderen Klasse aufgerufen.
Ich verstehe nicht, warum der Slot nicht aufgerufen wird.
Ich weis, dass es andere und bessere Möglichleiten gibt mein Problem zu lösen,
aber ich versuche zu verstehen warum mein Slot nicht aufgerufen wird.
Hab auch schon das Problem eingekreist. Aber dieses Verhalten verstehe ich überhaupt nicht.
Vielleicht sieht es ja jemand. Hier die relevanten Ausschnitte:void Game::showExplosion(int X, int Y) //Dieser Methode übergebe ich die Koordinaten wo die Explosion "e" erscheinen soll { //Ich rufe sie dann in eine Klasse namens "Bullet" auf. Das funktioniert auch. Die Explosion wird angezeigt. e->show(); //In Bullet.cpp ist *game auch extern eingebunden: extern Game *game; e->setPos(X, Y); QTimer::singleShot(1000,this,SLOT(hideExplosion())); //Die Explosion sollte eigentlich nur für 1 Sekunde angezeigt werden. } //Sie wird aber so lange angezeigt, bis ein anderer Gegner getroffen wurde. //Dann verschwindet sie und erscheint dort wo sie erscheinen soll. void Game::hideExplosion() //Ist in Game.h unter public slots deklatiert. { //wird nur in der Methode showExplosion (siehe oben) aufgerufen. e->hide(); //Das Problem hängt unmittelbar mit diesem Slot zusammen. } //Der Slot wird gar nicht erst aufgerufen.
Ich vermute das Problem in Zeile 5
-
Ich muss hier noch ergänzen:
Ich habe die QGraphicsScene "scene" in "game":scene->addItem(e); //Im Konstruktor der Klasse "Game" füge ich der QGraphicsScene "scene" eine Explosion "e" hinzu e->hide(); //Die Explosion "e" mache ich anschließend sofort unsichtbar
-
Benutze ein Lambda statt Slots. Dann meldet der Compiler Fehler.
-
Danke!
So geht es:void Game::showExplosion(int X, int Y) { e->show(); e->setPos(X, Y); QTimer::singleShot(1000, [this]() {e->hide();}); }
-
Wo ist
e
denn definiert? Damit kannst du doch immer nur dann eine Explosion anzeigen und verstecken (sobald due
neu zuweist, würde immer nur die letzte Explosion verwendet werden können).PS: Außerdem ist die Verwendung von globalen Variablen wie
extern Game *game;
ganz schlechter Programmierstil.
Wenn du doch schon Signals und Slots verwendest, warum erzeugt denn dann nicht die KlasseBullet
ein Signal, welches dann von derGame
(oder einer anderen) dann mit einem Slot verbunden werden kann?
-
e ist eine Instanz der Klasse explosion:
explosion::explosion() { setPixmap(QPixmap(":/sounds_and_images/explosion.png")); }
Das ist einfach ein Bild.
Ich hab ja die QGraphicsScene "scene".
Hier kann ich natürlich mitscene->addItem();
beliebig viele Explosionen anzeigen die ich dann unabhängig voneinander mit
scene->removeItem()
wieder entfernen kann.
Das werde ich auch noch machen nachdem ich das Spiel etwas schneller gemacht habe.