Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vincent от Декабрь 02, 2009, 21:58



Название: Вызов одной формы из другой
Отправлено: vincent от Декабрь 02, 2009, 21:58
Прошу "не пинать" сильно, если вопрос не сложный - но поискав в интернете - ответ на него так и не нашел.
Суть вопроса: необходимо из главной формы (mainwindow) вызвать (создать) еще одну форму  (Form1). Делал все аналогично тому, что описано в справке, но при вызове второй формы (создается на основе QWidget) она появляется на доли секунды и исчезает, но в то же время, если форму сделать на основе QDialog и вызывать ее через exec() - то она появляется и все работает нормально. Такое чувство, что она исчезает тогда, когда завершается функция нажатия клавиши по событию которой она создается (я просто не понял еще точно всю модель сигналов и слотов QT, возможно тут как то по другому нужно работать). Подскажите где копать ну или киньте ссылкой где можно это почерпнуть, желательно с примером?

Коды:
mainwindow.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "form1.h"
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
   Form1 w2;
   w2.show();
 
}

form1.cpp
Код
C++ (Qt)
#include "form1.h"
#include "ui_form1.h"
 
Form1::Form1(QWidget *parent) :
   QWidget(parent),
   m_ui(new Ui::Form1)
{
   m_ui->setupUi(this);
}
 
Form1::~Form1()
{
   delete m_ui;
}
 
void Form1::changeEvent(QEvent *e)
{
   QWidget::changeEvent(e);
   switch (e->type()) {
   case QEvent::LanguageChange:
       m_ui->retranslateUi(this);
       break;
   default:
       break;
   }
}

P/s: если важно, Qt 4.5.3 на Windows платформе; все формы создаются в дизайнере.


Название: Re: Вызов одной формы из другой
Отправлено: MoPDoBoPoT от Декабрь 02, 2009, 22:27
Код
C++ (Qt)
...
void MainWindow::on_pushButton_clicked()
{
   Form1 w2;      <=
   w2.show();
 
}
...
 
Ты форму создаешь на стеке, поэтому при выходе из метода on_pushButton_clicked() объект разрушается. Чтобы форма дольше жила, надо создавать в куче, а чтобы не было утечки памяти, то и назначить ей родителя: Form1 w2 = new Form1(this);
Можно еще флаг поставить, чтобы удалять окно при его закрытии: w2->setAttribute(Qt::WA_DeleteOnClose);


Название: Re: Вызов одной формы из другой
Отправлено: vincent от Декабрь 02, 2009, 22:47

Ты форму создаешь на стеке, ...
Можно еще флаг поставить, чтобы удалять окно при его закрытии: w2->setAttribute(Qt::WA_DeleteOnClose);

Пробовал я и так сделать, вот еще раз повторил ... компилятор ругается:

Цитировать
e:/QT4/qt/include/QtGui/../../src/gui/kernel/qwidget.h:756: error: `QWidget::QWidget(const QWidget&)' is private
C:/qt/test/mainwindow.cpp:18: error: within this context
C:/qt/test/mainwindow.cpp:18: error:   initializing temporary from result of `Form1::Form1(QWidget*)'

Пропущен указатель был .. и я сразу не заметил ... но тем не менее - новая форма стала прямым потомком главной и соответственно за ее пределы выйти не может, а мне нужно малость другое - получить в итоге 2 формы к которым есть свободный доступ (при этом вторую форму вызывать по событию).

UPD
Спасибо MoPDoBoPoT сделал запуск
Код:
Form1 *w2 = new Form1();
и стало так как надо.


Название: Re: Вызов одной формы из другой
Отправлено: BRE от Декабрь 02, 2009, 23:07
а мне нужно малость другое - получить в итоге 2 формы к которым есть свободный доступ (при этом вторую форму вызывать по событию).
Ну так не указывай парента вообще или укажи нулевым.


Название: Re: Вызов одной формы из другой
Отправлено: vincent от Декабрь 02, 2009, 23:08
а мне нужно малость другое - получить в итоге 2 формы к которым есть свободный доступ (при этом вторую форму вызывать по событию).
Ну так не указывай парента вообще или укажи нулевым.

ага уже ))


Название: Re: Вызов одной формы из другой
Отправлено: panAlexey от Декабрь 02, 2009, 23:38
Классический вопрос-кандидат для фака по областям видимости и типу памяти..
хто там грозилсё его накидать?


Название: Re: Вызов одной формы из другой
Отправлено: MoPDoBoPoT от Декабрь 03, 2009, 13:09
Извиняюсь за *, пропустил. Как говорится, поспешишь - людей насмешишь.
А насчет
новая форма стала прямым потомком главной и соответственно за ее пределы выйти не может, а мне нужно малость другое - получить в итоге 2 формы к которым есть свободный доступ (при этом вторую форму вызывать по событию).
так можно с парентом, только надо указать тип виджета - "окно". Лучше всего это сделать в конструкторе класса Form1, добавив строку this->setWindowFlags(Qt::Window);