Russian Qt Forum
Ноябрь 26, 2024, 13:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Указатель на существующий MainWindow  (Прочитано 12649 раз)
maybe78
Гость
« : Сентябрь 28, 2009, 09:13 »

Ситуация следующая:
В классе главного окна есть функция, отслуживающая состояния виджетов диалога. (чекбоксов и прочих). Эту функцию мне нужно вызвать из собственного, свеженаписанного класса, для чего необходимо получить указатель на уже существующее главное окно (с отмеченными виджетами).

я использую:
Код
C++ (Qt)
MainWindow *nw = qobject_cast<MainWindow*>( QApplication::topLevelWidgets()[ 0 ] );

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



« Последнее редактирование: Сентябрь 29, 2009, 09:54 от maybe78 » Записан
spirit
Гость
« Ответ #1 : Сентябрь 28, 2009, 09:18 »

ну если в дочернем видждете указан парент (MainWindow), то можно парент привести к нужному типу.
Записан
BRE
Гость
« Ответ #2 : Сентябрь 28, 2009, 09:24 »

я использую:
Код
C++ (Qt)
MainWindow *nw = qobject_cast<MainWindow*>( QApplication::topLevelWidgets()[ 0 ] );

и дальше работаю с nw, но программа от этого начинает вылетать.
С ног уже сбился. Есть ли безопасные способы получить указатель?
Так это и так безопасно, только нужно проверять nw на 0:
Код
C++ (Qt)
MainWindow *nw = qobject_cast<MainWindow*>( QApplication::topLevelWidgets()[ 0 ] );
Q_ASSERT( nw );
// Используем....
 
Если nw == 0, то это означает что:
* главное окно не создано
или
* оно не является объектом класса MainWindow.

Покажи как создаешь и как используешь...
Записан
maybe78
Гость
« Ответ #3 : Сентябрь 28, 2009, 09:32 »

В конструкторе своего класса вызывается процедура refresh(), которая обновляет таблицу, составляя SQL запрос с учетом расстановок галочек на главном окне. в процедуре refresh:

Код
C++ (Qt)
   MainWindow  *nw = qobject_cast<MainWindow*>(QApplication::topLevelWidgets()[1]);
   QString query2 = nw->formReloadQuery();

Свой класс, из которого refresh вызывается написан для задания SQLQueryModel. Но вообще мне еще много где придется эту процедуру главного окна.
« Последнее редактирование: Сентябрь 28, 2009, 09:39 от maybe78 » Записан
maybe78
Гость
« Ответ #4 : Сентябрь 28, 2009, 09:37 »

ну если в дочернем видждете указан парент (MainWindow), то можно парент привести к нужному типу.

дочернего виджета не существует, это класс, наследованный от QSqlQueryModel
Записан
BRE
Гость
« Ответ #5 : Сентябрь 28, 2009, 10:00 »

Если главное окно и диалог настройки являются topLevel-виджетами, то можно сохранять указатель на MainWidget в статическом члене класса MainWindow:
Код
C++ (Qt)
class MainWindow : public QMainWindow
{
public:
MainWindow(...)
{
Q_ASSERT_X( !m_mainWindow, "Повторное создание объекта MainWindow" )
m_mainWindow = this;
...
}
 
static MainWindow *mainWindow()
{
Q_ASSERT_X( m_mainWindow, "Объект MainWindow не создан" );
return m_mainWindow;
}
 
private:
static MainWindow *m_mainWindow;
};
 

Или передавать в свой класс указатель на объект MainWindow.
« Последнее редактирование: Сентябрь 28, 2009, 10:03 от BRE » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 28, 2009, 13:25 »

Еще один стандартный способ

Код:
class MainWindow : public QMainWindow {
  ...
  static MainWindow * Instance( void ) { return theMainWindow; }
  static MainWindow * theMainWindow;
};

MainWindow::MainWindow( .. )
{
  theMainWindow = this;
  ...
}

MainWindow::~MainWindow( void )
{
  ...
  theMainWindow = 0;
}
И используете MainWindow::Instance();

Edit: пардон, прочитал невнимательно, это то же что BRE уже предложил  Улыбающийся
« Последнее редактирование: Сентябрь 28, 2009, 13:27 от Igors » Записан
maybe78
Гость
« Ответ #7 : Сентябрь 29, 2009, 09:33 »

Спасибо, конечно, друзья. Чувствую что должно получиться, только он мне выдает
Код
C++ (Qt)
undefined reference to MainWindow::theMainWindow;
Присваивание вставляю в конструктор и деструктор класса MainWindow в cpp файле.

static переменные типа MainWindow у меня в public в хедере
Записан
BRE
Гость
« Ответ #8 : Сентябрь 29, 2009, 09:39 »

Спасибо, конечно, друзья. Чувствую что должно получиться, только он мне выдает
Код
C++ (Qt)
undefined reference to MainWindow::theMainWindow;
Присваивание вставляю в конструктор и деструктор класса MainWindow в cpp файле.

static переменные типа MainWindow у меня в public в хедере
В файле реализации (cpp) добавь строку:
MainWindow *MainWindow::theMainWindow = 0;

А переменную в хедере спрячь в private.
Записан
ildar
Гость
« Ответ #9 : Сентябрь 29, 2009, 09:50 »

если MainWindow создаешь сам, то имхо лучше:
1. сделать конструктор protected, чтобы гарантировать создание окна только через метод Instance
2. static MainWindow * theMainWindow объявить в Instance и создавать экземпляр класса там же

т.е. реализовать стандартный синглтон
Записан
maybe78
Гость
« Ответ #10 : Сентябрь 29, 2009, 09:53 »


В файле реализации (cpp) добавь строку:
MainWindow *MainWindow::theMainWindow = 0;

А переменную в хедере спрячь в private.

Спасибо, BRE! Все заработало.
Самостоятельно бы не разобрался.
Записан
JFrum
Гость
« Ответ #11 : Ноябрь 04, 2009, 01:42 »

Спасибо, конечно, друзья. Чувствую что должно получиться, только он мне выдает
Код
C++ (Qt)
undefined reference to MainWindow::theMainWindow;
Присваивание вставляю в конструктор и деструктор класса MainWindow в cpp файле.

static переменные типа MainWindow у меня в public в хедере
В файле реализации (cpp) добавь строку:
MainWindow *MainWindow::theMainWindow = 0;

А переменную в хедере спрячь в private.

И у меня все работает, всем спасибо.  Подмигивающий

Только не хватает фантазии, чтобы понять " MainWindow *MainWindow::theMainWindow = 0; ". Может, кто нибудь подскажет, к каким источникам обращаться?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #12 : Ноябрь 04, 2009, 02:08 »

Только не хватает фантазии, чтобы понять " MainWindow *MainWindow::theMainWindow = 0; ". Может, кто нибудь подскажет, к каким источникам обращаться?

К хорошей книге, к стандарту. Запись "static Bla bla;" в членах класса - это declaration, описание того, что в этом классе есть статичная переменная. Позже эту переменную нужно явным образом определить (создать). Поэтому в .cpp файле её определяют вне контекста методов. Гуглить по теме "с++ static member declaration definition".

Сама запись означает

"инициализация нулём"
= 0;

"переменной-члена 'theMainWindow' класса MainWindow"
MainWindow::theMainWindow

"которая является указателем на объект класса MainWindow"
MainWindow *
« Последнее редактирование: Ноябрь 04, 2009, 02:11 от Alex Custov » Записан
JFrum
Гость
« Ответ #13 : Ноябрь 13, 2009, 17:07 »

Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.29 секунд. Запросов: 23.