2017-12-28 50 views
0

ich habe folgendes Problem in Qt, ich versuche, ein Schach-Spiel zu machen, und ich habe einige Probleme stoßen:Verwenden Variable in Mainwindow erklärt Qt

In der Klasse Hauptfenster Ich habe die folgende Funktion :

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    scene = new ChessBoard; 
    QGraphicsView *view = new QGraphicsView(scene); 
    setCentralWidget(view); 
    connect(scene,SIGNAL(clicked(int,int)),this,SLOT(clicked(int,int))); 

    //!!!!!!!!!! 
    scene->setInitialPositions(); 
} 

Ich habe eine variable Szene, Szene ist ein Objekt der Klasse ChessBoard. In der ganzen Klasse Hauptfenster Ich kann die Szene-Variable verwenden, um Funktionen in ChessBoard deklariert zu verwenden.

Examples of functions

Allerdings habe ich eine andere Klasse Spiel genannt. In Spiel ich diese Funktion

void game::setStartBord() { 
    scene->setInitialPositions(); 
} 

haben Sie braucht einfach scene->setInitialPositions();

jedoch zu starten, ich habe keinen Zugriff auf die ‚Szene-Variable‘ gibt. Ich habe versucht, die ChessBoard- und MainWindow-Klasse zu erben, habe versucht, die Szene global zu machen, aber keine war wirklich eine gute Lösung.

Wie würde ich das tun? Voller Code ist sichtbar hier: https://github.com/UA-Niel/chess

+0

Was ist der genaue Zweck der Klasse 'Spiel'? klingt wie Sie Ihre Klassen neu gestalten müssen ... – Mike

+1

Sie möchten SetInitialPositions() wahrscheinlich einen Steckplatz machen. Und benutze Singnals und Slots, um es auszuführen. – drescherjm

+1

mögliches Duplikat von https://stackoverflow.com/q/48006862/5366641. – scopchanov

Antwort

0

Sie können Signal- und Schlitztechnik verwenden. Verbinde dein Spielklassenobjekt mit dem Szenenobjekt.

connect(game, &Game::mySignal, scene, &ChessBoard::setInitialPositions); 

Definieren Sie in Ihrer Game-Klasse das Signal.

Definieren Sie dann setInitialPositions in Ihrer ChessBorard-Klasse in öffentlichen Slots. Dann

class ChessBoard { 

... 

public slots: 
    <datatype> setInitialPositions(); 

}; 

verwenden

emit mySignal(); from Game class 

setIntialPositions() in Ihrer ChessBoad Klasse auszuführen.

Sie müssen Ihren Code so entwerfen, dass Sie zu einem bestimmten Zeitpunkt Zugriff auf beide Objekte haben. Meistens ist dies MainWindow, weil Sie Klassen beim Programmstart initialisieren.

Wenn Ihr Code nicht von der initialisierten Klasse abhängt. Sie können einfach ein neues ChessBoard-Objekt in der Spielklasse

ChessBoard myObject; 
myObject.setIntialPositions(); 
Verwandte Themen