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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы при вызове формы  (Прочитано 4907 раз)
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);
}
Записан
Nimbus
Гость
« Ответ #1 : Октябрь 25, 2011, 12:42 »

создается новая форма, а не вызыватся нужная.
Не понятно чего вы хотите
Записан
Henior
Гость
« Ответ #2 : Октябрь 25, 2011, 12:46 »

Есть две формы, одна нлавная, вторая дочерняя, я хочу, чтобы при нажатии кнопки на главной форме вызывалась дочерняя. Сейчас у меня при нажатии кнопки на главной форме создается новая форма, а не вызывается дочерняя. Я хочу понять в чем я ошибся?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Октябрь 25, 2011, 12:52 »

для начала надо определиться как связывать элементы UI с классом - через член-указатель или множественное наследование, а у тебя и то и то одновременно. судя по коду в реализации, используется именно первый подход, так что из class FormGen : public QWidget, Ui::FormGen надо выкинуть Ui::FormGen. да и Ui:: не нужно писать для FormGen т.к. у тебя в начале объявлен namespace.

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

в цпп #include "ui_formgen.h" абсолютно не нужно (а вот в заголовочном файлы ui_*.h как раз лучше писать в кавычках а не в угловых скобках). да и #include <Qt> - тоже плохой подход, лучше включать непосредственно используемые классы (в текущем случае дополнительно подключать ничего не нужно, по крайней мере сейчас).
« Последнее редактирование: Октябрь 25, 2011, 12:56 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Янковский Александр
Гость
« Ответ #4 : Октябрь 25, 2011, 13:05 »

Цитировать
void FormGen::button_click_help()
{
    FormHelp *formh = new FormHelp();
    formh->show();
    formh->activateWindow();
//    formh->setAttribute(QT::WA_DeleteOnClose);
}

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

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

Примерно такой рецепт
Записан
Bepec
Гость
« Ответ #5 : Октябрь 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 строчки, попробуй и все получится! Подмигивающий
Записан
Bepec
Гость
« Ответ #6 : Октябрь 25, 2011, 13:08 »

Мудрецы блин, человек только изучать начал, а вы его уже грузите.

to Henior - пользуй мой пример и разбирайся потихоньку.
Записан
Янковский Александр
Гость
« Ответ #7 : Октябрь 25, 2011, 13:12 »

Мудрецы блин, человек только изучать начал, а вы его уже грузите.

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

Есть и в твоих словах, Bepec, смысл.  Улыбающийся
Записан
Henior
Гость
« Ответ #8 : Октябрь 25, 2011, 14:12 »

Почти заработало) Только теперь ругается на строчку FormHelp *formh(
ошибка: ‘FormHelp’ не является именем типа
Записан
Henior
Гость
« Ответ #9 : Октябрь 25, 2011, 14:39 »

Разобрался с этой проблемой, но вернулась проблема №1, создается новая форма при нажатии кнопки на главной форме.
Записан
Bepec
Гость
« Ответ #10 : Октябрь 25, 2011, 14:44 »

Henior. я тебе написал работоспособный пример, вызывающий 1(одну (одну одинешенькую)) форму. Ты его компилил?
Записан
loneybibi
Гость
« Ответ #11 : Октябрь 25, 2011, 15:03 »

Вот еще один пример который создает и вызывает одну и туже (даже при следующем вызове форму) которая сохраняет свое состояние.
Записан
Henior
Гость
« Ответ #12 : Октябрь 25, 2011, 15:13 »

Все заработало) Всем спасибо) Особенно Верес)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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