Отображение двух окон в Qt4

Мой друг и я создали части графического интерфейса, используя Qt 4. Они оба работают независимо, и я пытаюсь интегрировать его форму с моим главным окном. На данный момент это код, который я использую, чтобы попытаться загрузить его форму:

//connect buttons and such
connect(exitbtn, SIGNAL(triggered()),this,SLOT(terminated()));
connect(add, SIGNAL(triggered()),this,SLOT(add_rec()));

void MainWindowImpl::add_rec()
{
  //form quits as soon as it loads...?
  DialogImpl dia;//name of his form
  dia.show();
}

Я включил его заголовочный файл. Программа компилируется, но когда я нажимаю триггер, его форма загружается примерно на полсекунды, а затем закрывается. Кто-нибудь знает, что я делаю неправильно?


person Piratebill    schedule 10.11.2009    source источник
comment
Что происходит с dia в конце add_rec? Когда очищаются локальные переменные?   -  person Bill    schedule 11.11.2009
comment
Чтобы расширить этот ответ, вас привело сюда ваше знакомство с C++, а не с Qt. Я бы посоветовал приобрести хорошую книгу, которая охватывает основы C++ для таких случаев.   -  person Samuel Harmer    schedule 30.01.2012


Ответы (3)


Вы почти поняли правильно. Это связано с тем, что RAII языка C++. Если вы разместите диалог в стеке, он будет уничтожен, как только функция вернется.

person J-16 SDiZ    schedule 10.11.2009
comment
Установите dia в качестве переменной-члена MainWindowImpl и просто покажите ее в функции add_rec. - person Patrice Bernassola; 10.11.2009

Предполагая, что MainWindowImpl публично наследуется от QWidget, вы ищете это:

void MainWindowImpl::add_rec() 
{
  // passing "this" to the constructor makes sure dialog will be cleaned up.
  // Note that DialogImpl will need a constructor that takes a
  // QObject* parent parameter.
  DialogImpl* dialog = new DialogImpl(this);

  dialog->show(); 
}

Посмотрите документацию Qt, где приведены примеры того, как должны выглядеть конструкторы.

person Bill    schedule 11.11.2009

По-видимому, QT4 допускает только один экземпляр объекта за раз, однако указатели - это другое дело. Измените как main.cpp , так и любое ваше главное окно, чтобы оно выглядело примерно так:

DialogImpl *dia=new DialogImpl;
dia->show();
person Piratebill    schedule 10.11.2009
comment
Это не правильно. Проблема в том, что dia уничтожается в конце функции. (Qt4 определенно позволяет вам иметь несколько экземпляров класса одновременно.) - person Bill; 11.11.2009