Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] : открытие формы из другой формы, Немогу открыть вторую форму из первой 
:(
    Опции темы
brom
Дата 24.7.2007, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.7.2007
Где: Таганрог, Россия

Репутация: нет
Всего: нет



Всем доброго времени суток !
есть проблема: приложение (пишется на qt.4.2.3) имеет 2 формы; обе изначально писались в Designer; первую запускаю их main
Цитата

 Q_INIT_RESOURCE(mu_prog);
 QApplication app(argc, argv);
 FormMu1 form1;
 form1.show();
 return app.exec();

FormMu1 описано так 
Цитата

class FormMu1 : public QWidget
 {
 Q_OBJECT
 public:
     FormMu1(QWidget *parent = 0);
 private slots:
     void Cl_Open();
 private:
     QPushButton *B_Cl;
 };

и это работает. 
Но при попытке так же вызвать вторую форму выдается ошибка: переменные argc, argv не определены.
В книге нашел "обрезаный вызов":
Цитата

 Q_INIT_RESOURCE(mu_prog);
 FormMu1 form1;
 form1.show();

в этом случае форма показывается, но не остается на долго (показалась и закрылась).

Подскажите, пожалуйста, что я делаю не так.
PM MAIL WWW ICQ   Вверх
powerfox
Дата 24.7.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



brom, а можно весь код? Ведь ты даже инициализацию (конструктор) окон не показал.
Где "уинизирование" твоего виджета созданным в designer ui?


--------------------
user posted image
PM WWW   Вверх
powerfox
Дата 24.7.2007, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



form1.h:
Код

#ifndef FORM1_H
#define FORM1_H

#include<QWidget>
#include<QDialog>
#include<QtGui>
#include "ui_form1.h"
#include "ui_form2.h"


class Form1:public QWidget,public Ui::Form1
{
    public: 
        Form1(QWidget *parent = 0);
    Q_OBJECT
    public slots:
            void open_form2();
};

class Form2:public QDialog,public Ui::Form2{};
#endif


form1.cpp:
Код

#include "form1.h"

Form1::Form1 (QWidget *parent)
    :QWidget(parent)
{
    setupUi(this);
    connect(FindButton,SIGNAL(clicked()),this,SLOT(open_form2()));
}

void Form1::open_form2()
{
    Form2 *form2 = new Form2;
    form2->setupUi(form2);
    form2->show();
    form2->activateWindow();
}


main.cpp:
Код

#include<QApplication>
#include"form1.h"

int main (int argc, char *argv[])
{
    QApplication app(argc,argv);
    Form1 *form1 = new Form1;
    form1->show();
    return app.exec();
}


Ui::Form1 у меня QWidget.
Ui::Form2 - QDialog.


--------------------
user posted image
PM WWW   Вверх
brom
Дата 24.7.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.7.2007
Где: Таганрог, Россия

Репутация: нет
Всего: нет



Цитата(powerfox @  24.7.2007,  13:39 Найти цитируемый пост)
form1.cpp:
Код

#include "form1.h"
Form1::Form1 (QWidget *parent)
    :QWidget(parent)
{
    setupUi(this);
    connect(FindButton,SIGNAL(clicked()),this,SLOT(open_form2()));
}
void Form1::open_form2()
{
    Form2 *form2 = new Form2;
    form2->setupUi(form2);
    form2->show();
    form2->activateWindow();
}



работает. спасибо!
а кто удаляет form2 ? Утечки памяти не будет ?

Добавлено через 5 минут и 12 секунд
и еще 2 вопросика: 
1) Как сделать, чтобы form2 было модальным ?
2) Если я после 13 строки записываю еще что то, то оно выполняется до открытия формы2, а как сделать что бы после ее закрытия ?

заранее спасибо

Это сообщение отредактировал(а) brom - 24.7.2007, 15:16
PM MAIL WWW ICQ   Вверх
powerfox
Дата 24.7.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



Цитата(brom @  24.7.2007,  16:16 Найти цитируемый пост)
а кто удаляет form2 ? Утечки памяти не будет ?

Никто. Я по привычке сделал в виде указателся. Самое лучшее в данном лучае прописать form2 в стэк.
Ещё 1 способ смотри ниже.

Цитата(brom @  24.7.2007,  16:16 Найти цитируемый пост)
1) Как сделать, чтобы form2 было модальным ?

Во-первых, можно указать при проектировании в Designer (в свойствах объекта QDialog). (+ смотри новый код).


Цитата(brom @  24.7.2007,  16:16 Найти цитируемый пост)
2) Если я после 13 строки записываю еще что то, то оно выполняется до открытия формы2, а как сделать что бы после ее закрытия ?

Если нужно проверить, что нажал пользователь (Ok или cancel), то можно использовать QDialog::exec().
То есть код будет приблизительно такой:

form1.cpp
Код

#include "form1.h"
Form1::Form1 (QWidget *parent)
    :QWidget(parent)
{
    setupUi(this);
    connect(FindButton,SIGNAL(clicked()),this,SLOT(open_form2()));
}
void Form1::open_form2()
{
    Form2 *form2 = new Form2;
    form2->setupUi(form2);
    /*form2->show();
    form2->activateWindow();*/  не делается, если окно модальное.
    if(form2->exec() )    //exec, кроме того, делаеть окно модальным
        {
         //Здесь код, выполняемый после закрытия окна (обработка результата работы)
         }
       //можно вставить else
     delete form2;  // для избежания утечки памяти
     
    // Код после закрытия окна

}



--------------------
user posted image
PM WWW   Вверх
brom
Дата 24.7.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.7.2007
Где: Таганрог, Россия

Репутация: нет
Всего: нет



Цитата(powerfox @  24.7.2007,  16:11 Найти цитируемый пост)

Код

#include "form1.h"
Form1::Form1 (QWidget *parent)
    :QWidget(parent)
{
    setupUi(this);
    connect(FindButton,SIGNAL(clicked()),this,SLOT(open_form2()));
}
void Form1::open_form2()
{
    Form2 *form2 = new Form2;
    form2->setupUi(form2);
    /*form2->show();
    form2->activateWindow();*/  не делается, если окно модальное.
    if(form2->exec() )    //exec, кроме того, делаеть окно модальным
        {
         //Здесь код, выполняемый после закрытия окна (обработка результата работы)
         }
       //можно вставить else
     delete form2;  // для избежания утечки памяти
     
    // Код после закрытия окна[/quote]



я не использую преобразование ui-файла в СИшный, я его непосредственно использую:
Код
QUiLoader loader;
 QFile file("file.ui");
 file.open(QFile::ReadOnly);
 QWidget *formFWidget = loader.load(&file, this);
 file.close();

ui_Button = qFindChild<QPushButton*>(this, "Button");

QVBoxLayout *Flayout = new QVBoxLayout;
 Flayout->addWidget(formFWidget);
 setLayout(Flayout);

и мне помпилятор маты выдает: 
Цитата

error: 'class MuForm' has no member named 'setupUi'
error: 'class MuForm' has no member named 'exec'

как быть ?

Это сообщение отредактировал(а) brom - 24.7.2007, 16:45
PM MAIL WWW ICQ   Вверх
powerfox
Дата 24.7.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



brom, пожалуйста, не цитируй весь код (всё сообщение). Очень тяжело тему читать.

Цитата(brom @  24.7.2007,  17:44 Найти цитируемый пост)
я не использую преобразование ui-файла в СИшный, я его непосредственно использую:

Вся разница будет только в том, что может потребоваться найти нужные виджеты (в твоём случае кнопка) и, если есть пользовательские слоты, приконнектить их специальным вызовом.
Хороший пример: /usr/share/doc/qt4-doc/html/designer-calculatorbuilder.html  (там без открытия форм).

Цитата(brom @  24.7.2007,  17:44 Найти цитируемый пост)
error: 'class MuForm' has no member named 'setupUi'
error: 'class MuForm' has no member named 'exec'

Покажи весь код, в том, что ты привёл такого класса вообще нет.




--------------------
user posted image
PM WWW   Вверх
brom
Дата 25.7.2007, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.7.2007
Где: Таганрог, Россия

Репутация: нет
Всего: нет



main.cpp
Код
#include <QApplication>
#include "tests.h"

int main(int argc, char *argv[])
 {
 Q_INIT_RESOURCE(tests);
 QApplication app(argc, argv);
 FormMu tt;
 tt.show();
 return app.exec();
 }

tests.cpp
Код
#include <QtUiTools/QtUiTools>
#include <QtGui>

#include "tests.h"
#include "test2.h"
//----------------------------------------------------------------------
FormMu::FormMu(QWidget *parent): QWidget(parent)
 {
 form2 = NULL;

 QUiLoader loader;
 QFile file("tests.ui");
 file.open(QFile::ReadOnly);
 QWidget *formWidget = loader.load(&file, this);
 file.close();

 B1 = qFindChild<QPushButton*>(this, "Button1");

 QVBoxLayout *layout = new QVBoxLayout;
 layout->addWidget(formWidget);
 setLayout(layout);

  QObject::connect(
    B1,
    SIGNAL(clicked()),
    this,
    SLOT( Open_form_2()) );
 }
//----------------------------------------------------------------------
void FormMu::Open_form_2()
 {
 Q_INIT_RESOURCE(ui_form2);
 form2 = new Form2;
 form2->show();

 // здесь выполняется до открытия form2

 // form2->exec();   // выдает ошибку error: " 'class form2' has no member named 'exec' "
 }
//----------------------------------------------------------------------

tests.h
Код
#ifndef TESTS_H
#define TESTS_H

#include <QWidget>

class QPushButton;
class Form2;

class FormMu : public QWidget
 {
 Q_OBJECT

 public:
     FormMu(QWidget *parent = 0);

 private slots:
     void Open_form_2();

 private:
     QPushButton *B1;
     Form2 *form2;
 };

#endif

test2.cpp
Код
#include <QtUiTools/QtUiTools>
#include <QtGui>

#include "test2.h"
//----------------------------------------------------------------------
Form2::Form2(QWidget *parent): QWidget(parent)
 {
 QUiLoader loader;
 QFile file("Ui_file2.ui");
 file.open(QFile::ReadOnly);
 QWidget *formWidget = loader.load(&file, this);
 file.close();

 Label1 = qFindChild<QLabel*>(this, "label");

 QVBoxLayout *layout = new QVBoxLayout;
 layout->addWidget(formWidget);
 setLayout(layout);
 }
//----------------------------------------------------------------------

test2.h
Код
#ifndef TEST2_H
#define TEST2_H

#include <QWidget>

class QLabel;

class Form2 : public QWidget
 {
 Q_OBJECT

 public:
     Form2(QWidget *parent = 0);

 private slots:

 private:
     QLabel *Label1;
 };
#endif


пока упрощал код, что бы показать, мне кажется, я понял почему ошибка: у меня не QDialog , а QWidget, для которого нет вызова exec(). Но попробовал переделать все под Dialog - не видит моей формы, а генерит свою, чистую. :(
"ничего не понимаю", как сказали бы братья пилоты.
PM MAIL WWW ICQ   Вверх
brom
Дата 25.7.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 24.7.2007
Где: Таганрог, Россия

Репутация: нет
Всего: нет



у меня такое ощущение, что не показывается моя форма , т.к. в test2.cpp в 11 строке я не меняю QWidget на QDialog, т.к. функция load() возвращает тип QWidget.
Может его нужно приобразовать ?
или есть что-то подобное , что возвращает QDialog ?
PM MAIL WWW ICQ   Вверх
powerfox
Дата 25.7.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 97



Если кинешь весь проект, то смогу поковырять (с ui файлами и полными исходниками). Я Qt4 люблю.

Из того, что я у тебя посмотрел:
1. 
Цитата(brom @  25.7.2007,  09:37 Найти цитируемый пост)
 QObject::connect(
    B1,
    SIGNAL(clicked()),
    this,
    SLOT( Open_form_2()) );
 }

Коннектим сигнал ui-го виджета к нашему слоту. Но нигде нет вызова:
Код

QMetaObject::connectSlotsByName(this);


2. По идее, раз QWidget является базовым классом для QDialog, то вполне можно присвоить QDialog объект QWidget. Преобразовывать ничего не надо.
2*.
Цитата(brom @  25.7.2007,  09:37 Найти цитируемый пост)
class Form2 : public QWidget

Цитата(brom @  25.7.2007,  09:37 Найти цитируемый пост)
// form2->exec();   // выдает ошибку error: " 'class form2' has no member named 'exec' "

Цитата(brom @  25.7.2007,  09:37 Найти цитируемый пост)
я понял почему ошибка: у меня не QDialog , а QWidget, для которого нет вызова exec().




--------------------
user posted image
PM WWW   Вверх
ZurZur
Дата 28.2.2013, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.2.2013

Репутация: нет
Всего: 0



Добрый день!
Наконец-то смог писать на форум: никак не мог зарегестрировать. Мне очень интересен этот topic. Я сам никогда раньше на qt не программировал, хотя на С писал довольно много. В основном на Builder. Так вот, решил в качестве обучения попробовать перенести некоторые старые программы на qt. Споткнулся уже вначале: никак не могу создать казалось бы элементарный проект с двумя формами. Идея совсем проста: по нажатию кнопки на одной форме появляется другая. Знаю, что должно реализоваться как-то совсем просто, в builder на это ушло бы меньше минуты работы. 
Не могли бы Вы мне помочь? В идеале расписать подробно, как добавляется вторая форма. Тему прочитал много раз, но мне это не помогло.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.