Название: [решено] Указатель на существующий MainWindow Отправлено: maybe78 от Сентября 28, 2009, 09:13 Ситуация следующая:
В классе главного окна есть функция, отслуживающая состояния виджетов диалога. (чекбоксов и прочих). Эту функцию мне нужно вызвать из собственного, свеженаписанного класса, для чего необходимо получить указатель на уже существующее главное окно (с отмеченными виджетами). я использую: Код
и дальше работаю с nw, но программа от этого начинает вылетать. С ног уже сбился. Есть ли безопасные способы получить указатель? Название: Re: Указатель на сущетсвующий MainWindow Отправлено: spirit от Сентября 28, 2009, 09:18 ну если в дочернем видждете указан парент (MainWindow), то можно парент привести к нужному типу.
Название: Re: Указатель на сущетсвующий MainWindow Отправлено: BRE от Сентября 28, 2009, 09:24 я использую: Так это и так безопасно, только нужно проверять nw на 0:Код
и дальше работаю с nw, но программа от этого начинает вылетать. С ног уже сбился. Есть ли безопасные способы получить указатель? Код Если nw == 0, то это означает что: * главное окно не создано или * оно не является объектом класса MainWindow. Покажи как создаешь и как используешь... Название: Re: Указатель на сущетсвующий MainWindow Отправлено: maybe78 от Сентября 28, 2009, 09:32 В конструкторе своего класса вызывается процедура refresh(), которая обновляет таблицу, составляя SQL запрос с учетом расстановок галочек на главном окне. в процедуре refresh:
Код
Свой класс, из которого refresh вызывается написан для задания SQLQueryModel. Но вообще мне еще много где придется эту процедуру главного окна. Название: Re: Указатель на сущетсвующий MainWindow Отправлено: maybe78 от Сентября 28, 2009, 09:37 ну если в дочернем видждете указан парент (MainWindow), то можно парент привести к нужному типу. дочернего виджета не существует, это класс, наследованный от QSqlQueryModel Название: Re: Указатель на сущетсвующий MainWindow Отправлено: BRE от Сентября 28, 2009, 10:00 Если главное окно и диалог настройки являются topLevel-виджетами, то можно сохранять указатель на MainWidget в статическом члене класса MainWindow:
Код
Или передавать в свой класс указатель на объект MainWindow. Название: Re: Указатель на сущетсвующий MainWindow Отправлено: Igors от Сентября 28, 2009, 13:25 Еще один стандартный способ
Код: class MainWindow : public QMainWindow { Edit: пардон, прочитал невнимательно, это то же что BRE уже предложил :) Название: Re: Указатель на сущетсвующий MainWindow Отправлено: maybe78 от Сентября 29, 2009, 09:33 Спасибо, конечно, друзья. Чувствую что должно получиться, только он мне выдает
Код Присваивание вставляю в конструктор и деструктор класса MainWindow в cpp файле. static переменные типа MainWindow у меня в public в хедере Название: Re: Указатель на сущетсвующий MainWindow Отправлено: BRE от Сентября 29, 2009, 09:39 Спасибо, конечно, друзья. Чувствую что должно получиться, только он мне выдает В файле реализации (cpp) добавь строку:Код Присваивание вставляю в конструктор и деструктор класса MainWindow в cpp файле. static переменные типа MainWindow у меня в public в хедере MainWindow *MainWindow::theMainWindow = 0; А переменную в хедере спрячь в private. Название: Re: Указатель на сущетсвующий MainWindow Отправлено: ildar от Сентября 29, 2009, 09:50 если MainWindow создаешь сам, то имхо лучше:
1. сделать конструктор protected, чтобы гарантировать создание окна только через метод Instance 2. static MainWindow * theMainWindow объявить в Instance и создавать экземпляр класса там же т.е. реализовать стандартный синглтон Название: Re: Указатель на сущетсвующий MainWindow Отправлено: maybe78 от Сентября 29, 2009, 09:53 В файле реализации (cpp) добавь строку: MainWindow *MainWindow::theMainWindow = 0; А переменную в хедере спрячь в private. Спасибо, BRE! Все заработало. Самостоятельно бы не разобрался. Название: Re: Указатель на сущетсвующий MainWindow Отправлено: JFrum от Ноября 04, 2009, 01:42 Спасибо, конечно, друзья. Чувствую что должно получиться, только он мне выдает В файле реализации (cpp) добавь строку:Код Присваивание вставляю в конструктор и деструктор класса MainWindow в cpp файле. static переменные типа MainWindow у меня в public в хедере MainWindow *MainWindow::theMainWindow = 0; А переменную в хедере спрячь в private. И у меня все работает, всем спасибо. ;) Только не хватает фантазии, чтобы понять " MainWindow *MainWindow::theMainWindow = 0; ". Может, кто нибудь подскажет, к каким источникам обращаться? Название: Re: Указатель на сущетсвующий MainWindow Отправлено: Alex Custov от Ноября 04, 2009, 02:08 Только не хватает фантазии, чтобы понять " MainWindow *MainWindow::theMainWindow = 0; ". Может, кто нибудь подскажет, к каким источникам обращаться? К хорошей книге, к стандарту. Запись "static Bla bla;" в членах класса - это declaration, описание того, что в этом классе есть статичная переменная. Позже эту переменную нужно явным образом определить (создать). Поэтому в .cpp файле её определяют вне контекста методов. Гуглить по теме "с++ static member declaration definition". Сама запись означает "инициализация нулём" = 0; "переменной-члена 'theMainWindow' класса MainWindow" MainWindow::theMainWindow "которая является указателем на объект класса MainWindow" MainWindow * Название: Re: [решено] Указатель на существующий MainWindow Отправлено: JFrum от Ноября 13, 2009, 17:07 Спасибо
|