2016-06-09 7 views
1

ich zwei verschiedene Klassen in zwei Dateien:wie Funktion zwischen zwei Klassen verbinden

class Game: public QGraphicsView() 

class Window: public QMainWindow() 
{ 
public: Window(); 
       Game *game; 

public slots: void test() {game = new Game();}; 
} 

in Window.cpp ich ein neues Spiel mit Test() Funktion starten:

Window::Window() {test();} 

jetzt in Game.cpp I erstellen QMessageBox mit zwei QPushButton

QMessageBox *box= new QMessageBox(); 

    QPushButton *btYES = box->addButton(tr("YES"),QMessageBox::ActionRole); 
    QPushButton *btNO = box->addButton(tr("NO"),QMessageBox::ActionRole); 

    box->exec(); 

    if (box->clickedButton() == btYES) {Window::test();} 
    if (box->clickedButton() == btNO) {close();} 

Wie Sie sehen können, möchte ich die Funktion test() mit btYES innerhalb der Game.cpp verbinden, aber diese Funktion ist innerhalb Window.cpp und ihre Funktion ist es, ein neues Spiel zu starten.

Es ist möglich, dies zu tun?

+1

Scheint, wie Sie erstellen möchten 'static' Funktion. Wenn ja, dann ist das die Lösung: 'static void test() {/*...*/}' – PcAF

+0

'Window :: Window() {Spiel * Spiel = neues Spiel();}' <= Du erschaffst ein neue lokale Variable namens 'Spiel'. 'void test() {game = new Game();};' <= Du initialisierst eine Membervariable namens 'game'. Sieht potenziell gefährlich aus, ist das absichtlich? – thuga

+0

Ok Entschuldigung, ich habe einen Fehler gemacht. Ich habe {Game * game} in der Klasse Window.h öffentlich erklärt: –

Antwort

1

QPushButton emittiert Ereignisse, wenn es seine gedrückt/

freigegeben

So könnte man das verbinden, kann sagen, Signal zu einem Schlitz-Freigabe:

connect(button, SIGNAL(released()), windowClass, SLOT(handleButton())); 

In Ihrem Fall, dass Sie es für Klassen senden müssen, also müssen Sie es vielleicht in zwei Schritten tun.

In Spiel:

// connect the button to a local slot 
connect(btYES, SIGNAL(released()), this, SLOT(handleYesButton())); 

// in the slot emit a signal - declare the signal in the header 
game::handleYesButton() 
{ 
    emit userChoiceYes(); 
} 

Im Fenster

// connect the signal in game to a your slot: 
connect(game, SIGNAL(userChoiceYes()), this, SLOT(test())); 

Dann, wenn btnYes gedrückt/freigegeben freigegeben das Signal ausgesendet wird - Sie, dass in handleYesButton abholen() und Ihr eigenes Signal aussenden, das Ihre Fensterklasse ist verbunden mit und handhabt es im Test()

0

Basiert auf @code_fodder Antwort, aber Sie brauchen nicht einmal einen anderen Schlitz, plus das grundlegende Signal für einen QPushButt an ist clicked(). Hier ist die documentation:

Ein Druckknopf sendet das Signal geklickt(), wenn es durch die Maus, die Leer- oder durch eine Tastenkombination aktiviert wird. Verbinden Sie sich mit diesem Signal , um die Aktion der Schaltfläche durchzuführen. Drucktasten bieten auch weniger gemeinsame Signale, zum Beispiel gedrückt() und freigegeben().

zu starten, statt einen anderen Steckplatz in Ihrer Klasse Hinzufügen Game, nur verbinden das Signal der Taste clicked() auf ein anderes Signal:

connect(btYES, SIGNAL(clicked()), this, SIGNAL(btYesClicked())); 

Das Signal aus der Klasse Game jetzt ausgegeben wird, wenn Sie die Taste der Knopf btYes.Nun, man muss nur an haben verbinden dieses Signal an einen Schlitz test() in Ihrer Klasse Window:

connect(game, SIGNAL(btYesClicked()), this, SLOT(test()));