2013-09-12 4 views
-1

У меня есть диалог QT, который должен иметь доступ из любой точки программы. В принципе, мне нужно сделать что-то вроде создания статического экземпляра его где-то в моей программе, что-то вроде:Как я могу глобально получить доступ к диалоговому окну QT из любого класса

'' 'Note' '': Это просто пример того, что я пытаюсь сделать, а не фактический код (который слишком долго, чтобы разместить здесь)

class Core 
{ 
    public: 
    static DialogType *MyDialog; 
}; 

DialogType *Core::MyDialog = NULL; 

// later in main.cpp 

int main(int argc, char *argv[]) 
{ 
    try 
    { 
     Core::Init(); 
     QApplication a(argc, argv); 
     Core::MyDialog = new DialogType(); 
     ... 

Однако, несмотря на это будет работать для любого другого типа, он просто не работает для классов, наследуемых от QDialog. Компилятор просто возвращает: DialogType не называет тип (и да, я делаю #include, что .h файл с объявлением DialogType)

Что я делаю неправильно? Почему QT этого не позволяет? Как я могу позволить получить доступ к одному экземпляру моего диалога из любого класса в любом месте программы?

+1

Я не понимаю, почему он не компилируется, но он, безусловно, не работает во время выполнения: вы не можете создавать виджеты перед экземпляром QApplication, поэтому инициализация не будет работать. Создание по требованию с использованием функции доступа должно работать, хотя (хотя и ужасный дизайн) –

+0

Ну, это был просто пример, ведь в моем коде я определяю его как NULL, позже в моем коде инициализирую его, однако он не работает ни – Petr

+0

@FrankOsterfeld Я обновил код, чтобы он больше отражал то, что у меня есть, кроме того, я не понимаю причину downvote, что не так на вопрос? Я сомневаюсь, что я единственный, кому это нужно – Petr

ответ

2

Если вы получаете сообщение об ошибке, что компилятор не знает, какой тип вы используете, тогда вы должны либо вставить объявление вперед, либо #include заголовочный файл, содержащий либо декларацию вперед, либо определение.

Допустимое объявление достаточно, если ваш тип элемента является указателем или ссылкой, но если это какой-либо другой ADT, то требуется #include.

В коде вы в курсе, вы могли бы:

Core.h:

class DialogType; // forward declaration. 

class Core 
{ 
    public: 
    static DialogType *MyDialog; 
}; 

В исходном файле, вы могли бы иметь:

Core.cpp:

#include "Core.h" 
#include "DialogType.h" 

DialogType *Core::MyDialog = new DialogType(); 
+0

Вот что я имею в своем коде, как я уже говорил. Он не работает ни – Petr

+0

Хорошо, я забираю его, передняя декларация отсутствует ... – Petr

2

Если вам действительно нужен только один единственный, всегда доступный экземпляр этого конкретного класса, тогда вы можете создать его из шаблона Singleton, чтобы он либо создавал указатель и возвращал его, либо просто возвращал указатель, если он создан. Синглтоны часто рекомендуются, так как с ними много недостатков, но для чего-то в этом направлении это, вероятно, проще, чем установка статической ссылки на унаследованный класс QDialog.

Смежные вопросы