Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Henior от Октябрь 25, 2011, 12:22



Название: Проблемы при вызове формы
Отправлено: Henior от Октябрь 25, 2011, 12:22
Всем привет! Сделал вызов формы из главной формы при нажатии на кнопку, но создается новая форма, а не вызыватся нужная. В чем может быть проблема?
Заголовочный файл основной формы formgen.h
Код
C++ (Qt)
#ifndef FORMGEN_H
#define FORMGEN_H
#include <QWidget>
#include <QtGui/QDialog>
#include <ui_formgen.h>
#include <ui_formhelp.h>
namespace Ui {
   class FormGen;
}
class FormGen : public QWidget, Ui::FormGen
{
   Q_OBJECT
public:
   explicit FormGen(QWidget *parent = 0);
   ~FormGen();
private:
   Ui::FormGen *ui;
public slots:
   void button_click_help();
};
class FormHelp : public QDialog, Ui::FormHelp{};
#endif // FORMGEN_H

Файл основной формы formgen.cpp

Код
C++ (Qt)
#include "formgen.h"
#include "ui_formgen.h"
#include <Qt>
FormGen::FormGen(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::FormGen)
{
   ui->setupUi(this);
   /*Заполнение ComboBox CBOS*/
   ui->CBOS->addItem(QString("Debian"), 1);
   ui->CBOS->addItem(QString("Fedora"), 2);
   ui->CBOS->addItem(QString("Ubuntu"), 3);
   /*Кнопка вызова справки*/
   QObject::connect(ui->HButton, SIGNAL(clicked()), this, SLOT(button_click_help()));
   /*Кнопка Выход*/
   QObject::connect(ui->QButton, SIGNAL(clicked()), this, SLOT(close()));
}
FormGen::~FormGen()
{
   delete ui;
}
void FormGen::button_click_help()
{
   FormHelp *formh = new FormHelp();
   formh->show();
   formh->activateWindow();
//    formh->setAttribute(QT::WA_DeleteOnClose);
}


Название: Re: Проблемы при вызове формы
Отправлено: Nimbus от Октябрь 25, 2011, 12:42
создается новая форма, а не вызыватся нужная.
Не понятно чего вы хотите


Название: Re: Проблемы при вызове формы
Отправлено: Henior от Октябрь 25, 2011, 12:46
Есть две формы, одна нлавная, вторая дочерняя, я хочу, чтобы при нажатии кнопки на главной форме вызывалась дочерняя. Сейчас у меня при нажатии кнопки на главной форме создается новая форма, а не вызывается дочерняя. Я хочу понять в чем я ошибся?


Название: Re: Проблемы при вызове формы
Отправлено: kambala от Октябрь 25, 2011, 12:52
для начала надо определиться как связывать элементы UI с классом - через член-указатель или множественное наследование, а у тебя и то и то одновременно. судя по коду в реализации, используется именно первый подход, так что из class FormGen : public QWidget, Ui::FormGen надо выкинуть Ui::FormGen. да и Ui:: не нужно писать для FormGen т.к. у тебя в начале объявлен namespace.

а что такое "нужная форма"? какого она должна быть класса? сейчас код написан нормально и так.

в цпп #include "ui_formgen.h" абсолютно не нужно (а вот в заголовочном файлы ui_*.h как раз лучше писать в кавычках а не в угловых скобках). да и #include <Qt> - тоже плохой подход, лучше включать непосредственно используемые классы (в текущем случае дополнительно подключать ничего не нужно, по крайней мере сейчас).


Название: Re: Проблемы при вызове формы
Отправлено: Янковский Александр от Октябрь 25, 2011, 13:05
Цитировать
void FormGen::button_click_help()
{
    FormHelp *formh = new FormHelp();
    formh->show();
    formh->activateWindow();
//    formh->setAttribute(QT::WA_DeleteOnClose);
}

А что тут непонятного?
Каждый раз создается новая форма!

Нужно ее при первом вхождении в слот создать и запомнить указатель на нее!
Указатель на форму объявить в качестве закрытого члена класса, по умолчанию в конструкторе выставить в 0. А в данном слоте запомнить!
Ну и естественно при вхождении проверять на 0.

Примерно такой рецепт


Название: Re: Проблемы при вызове формы
Отправлено: Bepec от Октябрь 25, 2011, 13:07
Эх вы, знатоки, тут же человек простого хочет.

По теме:
Теперь объясняю:

строка

Код:
  FormHelp *formh = new FormHelp();

создает у тебя новый экземпляр дочернего окна. Ты же хочешь, чтобы оно было одно, так и надо создавать его только 1 раз - в конструкторе, и потом обращаться к нему по указателю.

Код:
#ifndef FORMGEN_H
#define FORMGEN_H
#include <QWidget>
#include <QtGui/QDialog>
#include <ui_formgen.h>
#include <ui_formhelp.h>
namespace Ui {
    class FormGen;
}
class FormGen : public QWidget, Ui::FormGen
{
    Q_OBJECT
public:
    explicit FormGen(QWidget *parent = 0);
    ~FormGen();
private:
    Ui::FormGen *ui;
    //--------------------------------------------------------------------
    // здесь создаешь указатель на дочернюю форму (он тут еще пустой)
    FormHelp *formh;

public slots:
    void button_click_help();
};
class FormHelp : public QDialog, Ui::FormHelp{};
#endif // FORMGEN_H

Код:
#include "formgen.h"
#include "ui_formgen.h"
#include <Qt>
FormGen::FormGen(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::FormGen)
{
    ui->setupUi(this);

    //--------------------------------------------------------------------
    // здесь создаешь 1(ОДНО) дочернее окно и присваиваешь его адрес указателю.
    // теперь в любом месте этого файла ты можешь по этому указателю обращаться к дочернему окну
    formh = new FormHelp();

    /*Заполнение ComboBox CBOS*/
    ui->CBOS->addItem(QString("Debian"), 1);
    ui->CBOS->addItem(QString("Fedora"), 2);
    ui->CBOS->addItem(QString("Ubuntu"), 3);
    /*Кнопка вызова справки*/
    QObject::connect(ui->HButton, SIGNAL(clicked()), this, SLOT(button_click_help()));
    /*Кнопка Выход*/
    QObject::connect(ui->QButton, SIGNAL(clicked()), this, SLOT(close()));
}
FormGen::~FormGen()
{
    delete ui;
}
void FormGen::button_click_help()
{
    //-------------------------------------------------------
    // тут ничего создавать ненадо, у тебя окно уже создано, но еще спрятано и команда show его показывает пользователю :)
    formh->show();
    formh->activateWindow();
//    formh->setAttribute(QT::WA_DeleteOnClose);
}

Изменены 3 строчки, попробуй и все получится! ;)


Название: Re: Проблемы при вызове формы
Отправлено: Bepec от Октябрь 25, 2011, 13:08
Мудрецы блин, человек только изучать начал, а вы его уже грузите.

to Henior - пользуй мой пример и разбирайся потихоньку.


Название: Re: Проблемы при вызове формы
Отправлено: Янковский Александр от Октябрь 25, 2011, 13:12
Мудрецы блин, человек только изучать начал, а вы его уже грузите.

to Henior - пользуй мой пример и разбирайся потихоньку.

Есть и в твоих словах, Bepec, смысл.  :)


Название: Re: Проблемы при вызове формы
Отправлено: Henior от Октябрь 25, 2011, 14:12
Почти заработало) Только теперь ругается на строчку FormHelp *formh(
ошибка: ‘FormHelp’ не является именем типа


Название: Re: Проблемы при вызове формы
Отправлено: Henior от Октябрь 25, 2011, 14:39
Разобрался с этой проблемой, но вернулась проблема №1, создается новая форма при нажатии кнопки на главной форме.


Название: Re: Проблемы при вызове формы
Отправлено: Bepec от Октябрь 25, 2011, 14:44
Henior. я тебе написал работоспособный пример, вызывающий 1(одну (одну одинешенькую)) форму. Ты его компилил?


Название: Re: Проблемы при вызове формы
Отправлено: loneybibi от Октябрь 25, 2011, 15:03
Вот еще один пример который создает и вызывает одну и туже (даже при следующем вызове форму) которая сохраняет свое состояние.


Название: Re: Проблемы при вызове формы
Отправлено: Henior от Октябрь 25, 2011, 15:13
Все заработало) Всем спасибо) Особенно Верес)