Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Две формы в QT 
:(
    Опции темы
Aline
Дата 10.6.2013, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Начинаю изучать QT. Есть задание: создать 2 произвольных *.ui файла, т.е. две формы. В каждой из них расположить по кнопке, при нажатию на которую происходит переход к другой форме. Т.е. из первой формы можно вызвать вторую,а из второй первую. 

Проблема пока даже не в том , чтобы создать или вызвать форму,а в том, чтобы подключить к проекту. Т.е. я создала проет, там у меня уже есть одна форма (класс Widget), добавляю вторую форму, но добавляется только *.ui файл, никакого хедера и исходника не вижу для второй формы.

Как правильно добавить вторую форму в проект и как их связать? Если даже при попытке обработки события clicked() по кнопке на второй форме, мне пишет, что не удалось найти документы соответствующие "ui_form.h".

Можно пошагово объяснить как это сделать? Единственное, что я поняла, это надо объявить переменную типа этой формы и для вызова формы написать вот так:

       f2 = new form(this);
       this->hide();
       f2->show();



PM MAIL   Вверх
Aline
Дата 10.6.2013, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Уже нашла ответ на свой вопрос: казывается при добавлении формы в проект, надо выбирать не просто форму,а класс формы
PM MAIL   Вверх
Aline
Дата 10.6.2013, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, всё таки не до конца решила проблему: из первой формы я могу вызвать вторую и даже могу скрыть первую:
Код

    Form *f2 = new Form();
    f2->show();
    this->hide();


но как теперь из второй формы снова вызвать первую и при этом закрыть вторую? Т.е. мне надо переключать интерфейс с формы 1 на форму 2 и обратно
PM MAIL   Вверх
math64
Дата 10.6.2013, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Создай свой класс Application:
Код

class Application : public QApplication {
...
public slots:
void showForm1() {
  if (form1 == NULL) {
     form1 = new Form1();
     connect(form1->ui->button1, SIGNAL(clicked()), this, SLOT(showForm2()));
  }
  form1->show();
  if (form2 != NULL)
    form2->hide();
}
void showForm2(); // Аналогично
private:
Form1* form1;
Form2* form2;
};

то же самое можно сделать в MainWindow

Это сообщение отредактировал(а) math64 - 10.6.2013, 11:34
PM   Вверх
Aline
Дата 10.6.2013, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



math64, спасибо конечно, но еще бы знать как создавать свой класс и самое главное где smile
Должно быть как то проще всё, т.к. это задание по первому дню курсов, мне дали видео с этого курса. там объяснялось только как вызвать диалог из формы и я так понимаю,что задание надо выполнить основываясь на то,что объясняли. Про создание класса там не было ничего. С другой стороны узнать как создается класс - мне совсем не помешает
PM MAIL   Вверх
ilyuha
Дата 10.6.2013, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Aline, Ну, например, можно в классе второй формы определить  сигнал:
Код

class Form: QWidget
{
....
signals:
        void closed();
......
};

Испускать его при закрытии:
Код

void Form::closeEvent(QCloseEvent* event)
{
        emit closed();
        QWidget::closeEvent(event);
}

Ловить в первой форме:
Код

    Form *f2 = new Form();
    connect(f2, SIGNAL(closed()), this, SLOT(onForm2Closed()));
    f2->show();
    this->hide();

И обрабатываете как  хотите в onForm2Closed()
PM MAIL   Вверх
math64
Дата 10.6.2013, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Проще - делай мой код в MainWindow. Как создавать класс формы, как я понял, ты научилась.
Код

class MainWindow : public QMainWindow {
...
public:
  MainWindow(QWidget *parent = 0) : QMainWindow(parent), ui(new Ui::MainWindow), form1(NULL), form2(NULL) {
    ui->setupUi(this);
    connect(ui->button1,SIGNAL(clicked()), this, SLOT(showForm1()));
    connect(ui->button2,SIGNAL(clicked()), this, SLOT(showForm2()));
  }
public slots:
void showForm1() {
  if (form1 == NULL) {
     form1 = new Form1(this);
     connect(form1->ui->button1, SIGNAL(clicked()), this, SLOT(showForm2()));
  }
  form1->show();
  if (form2 != NULL)
    form2->hide();
}
void showForm2(); // Аналогично
private:
    Ui::MainWindow *ui;
    Form1* form1;
    Form2* form2;
};

ЗЫ: form1->ui по умочанию в секции private.
Поэтому нужно либо объявить MainWindow другом, либо добавить в Form1 метод getButton1() (лучший вариант), либо перенести connect() кнопки со слотом в конструктор Form1. В этом случае тип parent для Form1 нужно поменять на MainWindow, чтобы получить доступ к слоту.


Это сообщение отредактировал(а) math64 - 10.6.2013, 12:25
PM   Вверх
Aline
Дата 10.6.2013, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



что то я окончательно во всем запуталась, надо делать всё сначала и постепенно smile Что то я упускаю из вида и не доделываю, в общем не получается ничего
PM MAIL   Вверх
math64
Дата 10.6.2013, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



1. В главной форме две кнопки - button1 и button2, открывающие Form1 и Form2 соответственно. При повтоном нажатии открывается форма, созданная в первый раз. Для этого создаются поля form1 и form2. Для Form1 и Form2 задается родителем MainWindow, поэтому они будут удалены автоматически при закрытии MainWindow.
2. В Form1 при нажатии на button1 нужно открыть Form2. Для этого нужно соединить её со слотом главной формы. Если это сделать в своём слоте, формы будут множится (хотя и видна буден только одна из них).
3. Аналогично для кнопки в Form2.

Или я не правильно понял задачу?

Добавлено @ 14:01
Вот так можно делать connect() сигнала кнопки в диалоге со слотом главного окна, если не понятно:
Код

Form1::Form1(MainWindow* parent) : QDialog(parent), ui(new Ui::Form1) {
    ui->setupUi(this);
    connect(ui->button1,SIGNAL(clicked()), parent, SLOT(showForm1()));
}


Это сообщение отредактировал(а) math64 - 10.6.2013, 14:03
PM   Вверх
ilyuha
Дата 10.6.2013, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



math64, Как я понял, на каждой форме по одной кнопке, каждая из которых должна скрывать текущую форму и открвать другую.
Поэтому, я и предложил тупо ловить сигнал закрытия второй формы
PM MAIL   Вверх
math64
Дата 10.6.2013, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

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



Если главной формы нет, тогда
Код

class Form2;
class Form1 : public QDialog {
public:
Form1(QWidget* parent) : QDialog(parent), ui(new Ui::Form1), form2(NULL) {
    ui->setupUi(this);
    connect(ui->button1,SIGNAL(clicked()), this, SLOT(showForm2()));
}
~Form1() { delete form2; }
public slots:
void showForm2() {
  if (form2 == NULL)
     form2 = new Form2(this);
  form2->show();
  hide();
}
private:
Ui::Form1 *ui;
Form2* form2;
};

class Form2 : public QDialog {
public:
Form2(Form1* parent) : QDialog(NULL), ui(new Ui::Form2), form1(parent) {
    ui->setupUi(this);
    connect(ui->button1,SIGNAL(clicked()), this, SLOT(showForm1()));
}
public slots:
void showForm1() {
  form1->show();
  hide();
}
private:
Ui::Form2 *ui;
Form1* form1;
};

(коды методов нужно вынести в cpp файл, объявления классов о отдельные h файлы)
PM   Вверх
Aline
Дата 11.6.2013, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



math64, да, главной формы вроде нет, задание звучит так, что формы по нажатию на кнопку должны переключаться между собой.
Вот здесь можно посмотреть задание: http://www.zmartzoft.ru/projects/qtincepti.../hometask_1.pdf
Задание №5
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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