Russian Qt Forum

Qt => Вопросы новичков => Тема начата: lexflax от Декабря 30, 2013, 03:55



Название: вызов второй формы
Отправлено: lexflax от Декабря 30, 2013, 03:55
Доброго времени суток.
Я новичек в qt, решил изучить работу с формами... создал проэкт Gui , веделил проэкт и вызвал на нем контекстное меню чтоб добавить новую форму "Добавить новый->qt-> форма qt designer.
Появилась вторая форма с именем mainwindow2.ui, хочу вызвать ее после нажатия кнопки расположенной на первой форме... как это можно сделать?


Название: Re: вызов второй формы
Отправлено: kambala от Декабря 30, 2013, 13:11
тебе еще нужен класс, «подкрепляющий» новую форму. проще всего это сделать, добавив GUI класс, иначе сейчас тебе придется самому связывать форму с классом.

потом в обработчике кнопки пишешь например
Код
C++ (Qt)
MyWidget2 *w = new MyWidget2;
w->show();

вообще лучше читай книжку или хотя бы туториалы в документации — методом тыка разбираться будет ой как непросто.


Название: Re: вызов второй формы
Отправлено: lexflax от Декабря 30, 2013, 16:24
добавил форму выбрав графу "класс формы qt widget"
содежимое form.h
Код:
#ifndef FORM_H
#define FORM_H

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT
   
public:
    explicit Form(QWidget *parent = 0);
    ~Form();
   
private:
    Ui::Form *ui;
};

#endif // FORM_H

Содержимое mainwindow.cpp
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
   Form *w = new Form ; тут много ошибок выдает... что не правильно прописываю тут? вроде название класса Form как я понимаю
    w->show();
}


Название: Re: вызов второй формы
Отправлено: lexflax от Декабря 30, 2013, 16:38
добавил две строчки
Код:
#include "ui_form.h"
#include "form.h"
и запустилось...


Название: Re: вызов второй формы
Отправлено: lexflax от Декабря 30, 2013, 16:43
а как можно настроить чтоб форма выходила допустим в разных местах экрана какой укажем в настройках, и с определенным размером, есть код где можно такие настройки прописать?


Название: Re: вызов второй формы
Отправлено: Alex Custov от Декабря 30, 2013, 16:50
Методы move() и resize() в QWidget


Название: Re: вызов второй формы
Отправлено: lexflax от Декабря 31, 2013, 03:18
еще вопрос подскажите пожалуйста, вторая форма вызывается...
После нажатия кнопки надо чтоб форма закрывалась и пользователь снова видел основное меню


Название: Re: вызов второй формы
Отправлено: lexflax от Декабря 31, 2013, 03:25
Добавил такую строчку и форма стала закрыватся и возвращатся к основной
Код:
this->hide();


Название: Re: вызов второй формы
Отправлено: kambala от Декабря 31, 2013, 12:22
название метода как бы говорит нам, что форма просто прячется, а не закрывается. для закрытия есть метод close().

открой-ка справку по QWidget и почитай какие есть методы у него.


Название: Re: вызов второй формы
Отправлено: lexflax от Января 01, 2014, 15:12
kambala, спасибо что всегда отвечаете, редко на форумах встречается...
hide на close заменил, теперь немного другая задача, при вызове новой формы надо чтоб старая форма на время работы в новой блокировалась, не подскажите как это сделать? пытался скрыть ее просто, но даже скрыть не получилось, а вообще нужна именно блокировка формы на любые действия...


Название: Re: вызов второй формы
Отправлено: lexflax от Января 01, 2014, 15:14
а скрыть пытался так, новую форму показать , основную скрыть
Код:
void MainWindow::on_action_activated()
{
    Form *w = new Form ;
     w->show();
MainWindow *a = new MainWindow;
a->hide();

}


Название: Re: вызов второй формы
Отправлено: lexflax от Января 02, 2014, 06:31
Блокрую так форму после вызова второй формыКод C++ (QT)
void MainWindow::on_action_activated()
Код:
{
    Form *w = new Form ;
     w->show();
 this->setEnabled(false);
}


Но проблема разблокировать теперь ее после закрытия формы Form.
 в файле form.cpp
 прописать Код C++ (QT)
Код:
this->setEnabled(true);


Нельзя, так как эту команду она отнесет не к первой форме mainwindow а к форме form, а форма mainwindow так и останется заблокированной((( как можно обратно после закрытия формы ее разблокировать?


Название: Re: вызов второй формы
Отправлено: Bepec от Января 02, 2014, 13:29
Вот тут уже начинается необходимость в системе сигнал-слотов или диалогов.

Самый простой выход - не блокировать основную форму так как вы, а просто делать дочернее окно модальным
Код:
setWindowModality ( Qt::WindowModality windowModality )

Или же создать сигнал у дочерней формы и связать его со слотом материнской :)

Или же использовать форму, наследованную от диалога.


Название: Re: вызов второй формы
Отправлено: lexflax от Января 02, 2014, 14:19
Да, форма наследованная от Диалого стала хорошим выходом из ситуации
И вызов формы стал таким
Код:
Form *w = new Form ;
     w->exec();