Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Boris от Сентябрь 06, 2009, 10:02



Название: Получить указатель главного окна
Отправлено: Boris от Сентябрь 06, 2009, 10:02
Товарищи у кого есть подскажите как лучше быть с главным окном приложения
1. Таскать за собой на него указатель (в переменной типа MainWindow *mw объявленной глобально).
2. Или же его как-то элегантно можно получить

Код:
qApp->mainWidget()
не работает в Qt4

Код:
qApp->desktop();
//и
qApp->findChild<MainWindow*>() или qApp->findChild<MainWindow*>("MainWindow");
возвращают мусор
в main у меня
Код:
    QApplication a(argc, argv);
    QTextCodec *incodec = QTextCodec::codecForLocale();
    QTextCodec::setCodecForTr(incodec);
    QTextCodec::setCodecForCStrings(incodec);
    MainWindow w;
    w.hide();
    mw = &w;//это присваиваю глобальной переменной
    return a.exec();


Название: Re: Получить указатель главного окна
Отправлено: BRE от Сентябрь 06, 2009, 10:33
QWidgetList QApplication::topLevelWidgets ()   [static]
Возвращает список окон верхнего уровня, если у тебя такое окно одно, то можно сделать что-то типа:
Код
C++ (Qt)
MainWindow *nw = qobject_cast<MainWindow*>( QApplication::topLevelWidgets()[ 0 ] );

Можно самому сохранять указатель на главное окно:
Код
C++ (Qt)
class MainWindow : public QMainWindow
{
public:
MainWindow(...)
{
Q_ASSERT_X( !m_instance, "Build MainWindow", "Объект главного окна уже создан" );
m_instance = this;
}
 
static MainWindow *instance()
{
Q_ASSERT_X( m_instance, "Get instance MainWindow", "Объект главного окна не создан" );
return m_instance;
}
 
private:
static MainWindow *m_instance = 0;
};
 

Думаю еще много чего можно придумать.


Название: Re: Получить указатель главного окна
Отправлено: Boris от Сентябрь 06, 2009, 11:06
Спасибо, topLevelWidgets помогло


Название: Re: Получить указатель главного окна
Отправлено: vdann от Сентябрь 06, 2009, 19:35
...второй вариант конечно предпочтительней, называется Singleton...
...такой прием удобно использовать для объектов, которые должны существовать в одном экземпляре в пределах одного приложения...


Название: Re: Получить указатель главного окна
Отправлено: set от Сентябрь 07, 2009, 07:05
...второй вариант конечно предпочтительней, называется Singleton...
...такой прием удобно использовать для объектов, которые должны существовать в одном экземпляре в пределах одного приложения...

не везде и не всегда... синглетоны можно использовать только там где ничего другого не остается... в бльшинстве случаев проблему можно решить куда более естественным способом...

к тому же если вы так обожаете синглетоны то надо вам сказать что в первом способе скорее всего применяеся уже написаный шаблон Реестр, который является частным случаем синглетона