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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов одной формы из другой  (Прочитано 12444 раз)
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 платформе; все формы создаются в дизайнере.
« Последнее редактирование: Декабрь 02, 2009, 22:14 от vincent » Записан
MoPDoBoPoT
Гость
« Ответ #1 : Декабрь 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);
Записан
vincent
Гость
« Ответ #2 : Декабрь 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();
и стало так как надо.
« Последнее редактирование: Декабрь 02, 2009, 23:08 от vincent » Записан
BRE
Гость
« Ответ #3 : Декабрь 02, 2009, 23:07 »

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

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

ага уже ))
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #5 : Декабрь 02, 2009, 23:38 »

Классический вопрос-кандидат для фака по областям видимости и типу памяти..
хто там грозилсё его накидать?
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
MoPDoBoPoT
Гость
« Ответ #6 : Декабрь 03, 2009, 13:09 »

Извиняюсь за *, пропустил. Как говорится, поспешишь - людей насмешишь.
А насчет
новая форма стала прямым потомком главной и соответственно за ее пределы выйти не может, а мне нужно малость другое - получить в итоге 2 формы к которым есть свободный доступ (при этом вторую форму вызывать по событию).
так можно с парентом, только надо указать тип виджета - "окно". Лучше всего это сделать в конструкторе класса Form1, добавив строку this->setWindowFlags(Qt::Window);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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