Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: braboar от Июня 23, 2011, 12:06



Название: Удалить виджет с формы
Отправлено: braboar от Июня 23, 2011, 12:06
Добрый день!

Есть приложение, сделанное в Designer'е, в том же designer'e сделаны еще виджеты, которые будут по разным событиям отображаться на  форме.  В обработчике такого события:

Код
C++ (Qt)
delete curWidget;
curWidget = NULL;
 
MyWidget* wgt = new MyWidget(this);
wgt->show();
curWidget = dynamic_cast<MyWidget*>(wgt);
 
Аналогичный код создает другой виджет, удаляя старый, и показывает новый.  Однако я вижу два виджета. Как правильно удалить ненужный виджет?


Название: Re: Удалить виджет с формы
Отправлено: BRE от Июня 23, 2011, 12:24
А после dynamic_cast переменая curWidget точно не 0?
Проверь:
Код
C++ (Qt)
delete curWidget;
curWidget = 0;
 
MyWidget* wgt = new MyWidget(this);
wgt->show();
curWidget = dynamic_cast<MyWidget*>(wgt);
Q_ASSERT( curWidget );
 
Хотя вряд ли кастинг может не получиться...

Где определена переменная curWidget?


Название: Re: Удалить виджет с формы
Отправлено: Пантер от Июня 23, 2011, 12:27
dynamic_cast -> qobject_cast


Название: Re: Удалить виджет с формы
Отправлено: braboar от Июня 23, 2011, 12:37
BRE, curWidget определен в соответствующем *.h

Пантер, не помогло.


Название: Re: Удалить виджет с формы
Отправлено: Пантер от Июня 23, 2011, 12:43
Побольше бы кода.


Название: Re: Удалить виджет с формы
Отправлено: GreatSnake от Июня 23, 2011, 12:53
Показывай первичное присвоение curWidget.


Название: Re: Удалить виджет с формы
Отправлено: braboar от Июня 23, 2011, 13:23
GreatSnake,
Код
C++ (Qt)
Dialog::Dialog(QWidget *parent)
   : QDialog(parent)
   , ui(new Ui::Dialog)
   , curWidget(NULL)
{
   ui->setupUi(this);
   setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
}
 

и далее:

Код
C++ (Qt)
void Dialog::system()
{
   if (curWidget)
   {
       curWidget->close();
       delete curWidget;
       curWidget = NULL;
   }
 
   CSystemWidget* wgt = new CSystemWidget(this);
   if (wgt)
   {
       curWidget = qobject_cast<CWidget*>(wgt);
       wgt->setGeometry(5, 48, 790, 475);
       wgt->show();
   }
}
 
аналогично - другие обработчики, только виджеты меняются, CWidget - базовый класс для них, в его конструкторе:
Код
C++ (Qt)
setAttribute(Qt::WA_DeleteOnClose);
 


Название: Re: Удалить виджет с формы
Отправлено: kambala от Июня 23, 2011, 14:21
поскольку все создаваемые виджеты имеют родителя, то они будут удалены автоматически - нет нужды делать это руками. и при присвоении в curWidget достаточно просто curWidget = wgt.

да, и указателям надо присваивать 0, а не NULL :)


Название: Re: Удалить виджет с формы
Отправлено: braboar от Июня 23, 2011, 14:58
kambala, спасибо. Удаление delete curWidget - было перестраховкой, а NULL - наследство от MFC. BTW, google не помог: всплывающая подсказка показала, что:
Код
C++ (Qt)
#define NULL __null
 
а что такое __null - не ясно, не нашел.


Название: Re: Удалить виджет с формы
Отправлено: kambala от Июня 23, 2011, 15:01
stddef.h, msvs 2008
Код
C++ (Qt)
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

и http://www.prog.org.ru/topic_7458_0.html