2009-09-24 19 views
6

Sto usando Qt e nel metodo principale ho bisogno di dichiarare un oggetto che ho bisogno di usare in tutti i miei altri file. Come posso accedere a quell'oggetto negli altri file? (Devo renderlo globale ..)Variabile globale in Qt, come?

Sono abituato allo sviluppo di iPhone e lì abbiamo l'appDelegate che è possibile utilizzare in tutta l'applicazione per raggiungere gli oggetti dichiarati nel metodo applicationDidFinishLaunching. Come posso fare lo stesso in Qt?

risposta

8

global_objects.hpp

extern int myGlobalInt; 

global_objects.cpp

#include "global_objects.hpp" 

namespace 
{ 
    int myGlobalInt; 
} 

E poi #include "global_objects.hpp" in ogni luogo è necessario myGlobalInt.

Si consiglia di leggere C++ singleton vs. global static object e Initializing qt resources embedded in static library pure.

+0

Hai dimenticato la parola chiave 'extern' nel file .hpp - questo instanciate' myGlobalInt' ogni volta che l'hpp è incluso – bluebrother

+0

@bluebrother Grazie, corretto. –

1

In generale, non è necessario utilizzare variabili globali nella programmazione orientata agli oggetti. Nel tuo caso, puoi risolvere il problema fornendo funzioni di accesso statico alla variabile nella tua classe principale. Dovresti essere consapevole, tuttavia, che questo è in qualche modo contrario a OOP.

class MainClass 
{ 
    public: 
     static int mySharedValue(void) { return m_mySharedValue; } 
     static void setMySharedValue(int value) { m_mySharedValue = value; } 
    private: 
     static int m_mySharedValue; 
} 

Foo::myOtherClassFunction(void) 
{ 
    // do something 
    int bar = MainClass::mySharedValue(); 
    // do some more 
} 

Inoltre, è possibile derivare l'applicazione principale da QApplication e aggiungere le funzioni di accesso lì, accesso all'oggetto principale attraverso il puntatore qApp fornito da Qt. Inoltre, puoi sempre usare una variabile globale nello stesso modo in cui puoi farlo in C, anche se non lo consiglierei.

+1

La mia idea di utilizzare l'oggetto globale era perché questo oggetto conservasse i dati di cui ho bisogno in quasi ogni widget e che i dati vengano recuperati dal database. Se non utilizzo un oggetto globale, ho bisogno di accedere al database ogni volta che viene istanziato l'oggetto. Ho pensato che fosse meglio prenderlo una volta sola, è un'idea sbagliata? – Martin

2

In Qt c'è il singleton QApplication, con il suo metodo statico QApplication :: instance() che restituisce l'unico oggetto QApplication. Ha molte altre funzioni membro statiche (in un'età più giovane sono stati chiamati "globali"), per il MainWindow, la finestra attiva ecc

http://doc.trolltech.com/4.5/qapplication.html

Potete sublass se si desidera aggiungere la tua statica.