2009-09-24 18 views
6

Używam Qt iw głównej metodzie muszę zadeklarować obiekt, którego potrzebuję użyć we wszystkich innych moich plikach. Jak mogę uzyskać dostęp do tego obiektu w innych plikach? (Muszę uczynić to globalnym ...)Zmienna globalna w Qt, jak?

Używam do rozwoju iPhone'a i tam mamy appDelegate, który możesz użyć w całej aplikacji, aby dotrzeć do obiektów, które zadeklarowałeś w metodzie applicationDidFinishLaunching. Jak mogę zrobić to samo w Qt?

Odpowiedz

8

global_objects.hpp

extern int myGlobalInt; 

global_objects.cpp

#include "global_objects.hpp" 

namespace 
{ 
    int myGlobalInt; 
} 

A potem #include "global_objects.hpp" w każdym miejscu trzeba myGlobalInt.

Powinieneś również przeczytać: C++ singleton vs. global static object i Initializing qt resources embedded in static library.

+0

Nie pamiętasz słowa kluczowego 'extern' w pliku .hpp - spowoduje to wstawienie' myGlobalInt' przy każdym dołączeniu hpp – bluebrother

+0

@bluebrother Thanks, fixed. –

1

Ogólnie nie powinieneś używać zmiennych globalnych w programowaniu obiektowym. W twoim przypadku możesz rozwiązać problem, udostępniając statyczne funkcje dostępu do zmiennej w głównej klasie. Należy jednak pamiętać, że jest to nieco sprzeczne z 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 
} 

Ponadto można czerpać swoją główną aplikację z QApplication i dodać tam funkcje dostępu, dostępu do głównego obiektu przez wskaźnik qApp dostarczonych przez Qt. Oprócz tego zawsze można użyć zmiennej globalnej w taki sam sposób, jak w C, jednak nie polecam tego.

+1

Mój pomysł na użycie obiektu globalnego wynikał z tego, że ten obiekt będzie przechowywać dane, które są mi potrzebne w prawie każdym widgetie, a dane są pobierane z bazy danych. Jeśli nie używam obiektu globalnego, potrzebuję uzyskać dostęp do bazy danych za każdym razem, gdy obiekt jest instancyjny. Pomyślałem, że lepiej po prostu raz to zrobić, czy to zły pomysł? – Martin

2

W Qt znajduje się singleton QApplication, z jego statyczną metodą QApplication :: instance(), która daje z powrotem jeden jedyny obiekt QApplication. Ma wiele innych statycznych funkcji składowych (w młodszym wieku były one nazywane „globalne”), dla MainWindow, aktywne okno itp

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

Można sublass go, jeśli chcesz dodać własną statyka.