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 du e 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 Klasse Bullet ein Signal, welches dann von der Game (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 mit

    scene->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.


Log in to reply