Gtk::Window::show() funktioniert nicht



  • Hidhiho!
    Ich habe ein seltsames Problem mit einem selbsterstellten Window. Dieses überlädt die Gtk::Window::show() Funktion, was auch soweit funktioniert:

    void MessageWindow::show()
    {
    	std::cout << "MessageWindow::show()\n";
    
    	this->Gtk::Window::show();
    }
    
    void MessageWindow::show(Glib::ustring labeltext, Glib::ustring imagepath)
    {
    	std::cout << "MessageWindow::show() " << labeltext << std::endl;
    
    	this->label->set_text(labeltext);
    	this->image->set(imagepath);
    
    	this->show();
    }
    
    void MessageWindow::show(Glib::ustring labeltext, Glib::ustring imagepath, Glib::ustring okbuttonlabel, Glib::ustring closebuttonlabel)
    {
    	std::cout << "MessageWindow::show() " << okbuttonlabel << std::endl;
    	this->okbutton->set_label(okbuttonlabel);
    	this->closebutton->set_label(closebuttonlabel);
    
    	this->show(labeltext, imagepath);
    }
    

    Nun greife ich von einem anderen Window über einen Pointer auf ein MessageWindow Objekt zu und möchte dieses anzeigen:

    void FightWindow::playerSurrenders()
    {
    	if( enemy.getSurrenderable() == true && player->getMoney() >= enemy.getSurrenderCosts() )
    	{
    		player->setMoney( player->getMoney() - enemy.getSurrenderCosts() );
    
    		messagewindow->show("You surrendered.", fightsurrenderimage, "OK", "Close");
    
    		this->fightEnded();
    		this->hide();
    	}
    	else
    		messagewindow->show("You can't surrender.", fightsurrenderimage, "OK", "Close");
    }
    

    Das funktioniert soweit auch richtig, das MessageWindow wird angezeigt. Nun aber mein Problem:

    void FightWindow::fleeBeforeFight()
    {
    	std::cout << "FightWIndow::fleeBeforeFight()\n";
    	this->okConnectionIterator.disconnect();
    	this->closeConnectionIterator.disconnect();
    
    	if( this->canEscape(horses[player->getHorse()][eha_speed], horses[enemy.getHorse()][eha_speed]) == true )
    	{
    		this->okConnectionIterator = messagewindow->signal_ok_clicked().connect( sigc::mem_fun(*this, &FightWindow::fightEnded) );
    		this->closeConnectionIterator = messagewindow->signal_close_clicked().connect( sigc::mem_fun(*this, &FightWindow::fightEnded) );	
    
    		messagewindow->show("Your flight was successful, coward!", fightfleeimage, "OK", "Close");
    		std::cout << "FightWindow::fleeBeforFight()  Was a message shown?\n";
    	}
    	else
    	{
    		messagewindow->show("You failed to flee. Now stand your man!", fightflightfailed, "OK", "Attack");
    
    		this->okConnectionIterator = messagewindow->signal_ok_clicked().connect( sigc::mem_fun(*this, &FightWindow::startFight) );
    		this->closeConnectionIterator = messagewindow->signal_close_clicked().connect( sigc::mem_fun(*this, &FightWindow::startFight) );
    	}
    }
    

    Hier wird das Fenster nicht angezeigt. Das kuriose: Die Funktion wird aufgerufen (mit gdb drübergegangen) und ich erhalte auch meine Kommandozeilenausgaben:

    FightWIndow::fleeBeforeFight()
    MessageWindow::show() OK
    MessageWindow::show() Your flight was successful, coward!
    MessageWindow::show()
    FightWindow::fleeBeforFight() Was a message shown?

    Dieses Problem tritt aber nicht nur bei mir auf. Ich ließ zwei andere Personen meinen Code Compilieren. Bei einer wird das MessageWindow nicht angezeigt, bei der anderen schon. Beide dieser benutzen den gcc 4.3.3, ich nur die 4.2.4er Version, daran kann es also nicht liegen.
    Weis von euch wer, woran dieses Problem liegt?

    mfG
    PDF



  • Aus dem Stand kann ich nicht sagen, woran das liegt. Aber dass es bei jemand anders funktioniert, das macht mich stutzig. Könnte direkt an gtkmm liegen. Hast du schonmal geschaut, ob ihr alle drei die gleiche Version von gtkmm habt?



  • Ist zwar jetzt schon etwas her, aber vielleicht kann ich ja anderen damit helfen:
    Das Problem lag daran, dass ich zuerst ein signal auslöste, dass MessageWindow::show() aufruft und danach MessageWindow::hide() aufgerufen habe.
    Was für ein schöner Noob-Fehler 😋


Anmelden zum Antworten