Russian Qt Forum
Июня 30, 2025, 00:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удалить виджет с формы  (Прочитано 9076 раз)
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);
 
Аналогичный код создает другой виджет, удаляя старый, и показывает новый.  Однако я вижу два виджета. Как правильно удалить ненужный виджет?
Записан
BRE
Гость
« Ответ #1 : Июня 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?
« Последнее редактирование: Июня 23, 2011, 12:28 от BRE » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #2 : Июня 23, 2011, 12:27 »

dynamic_cast -> qobject_cast
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
braboar
Гость
« Ответ #3 : Июня 23, 2011, 12:37 »

BRE, curWidget определен в соответствующем *.h

Пантер, не помогло.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #4 : Июня 23, 2011, 12:43 »

Побольше бы кода.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Июня 23, 2011, 12:53 »

Показывай первичное присвоение curWidget.
Записан

Qt 5.11/4.8.7 (X11/Win)
braboar
Гость
« Ответ #6 : Июня 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);
 
« Последнее редактирование: Июня 23, 2011, 13:34 от braboar » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Июня 23, 2011, 14:21 »

поскольку все создаваемые виджеты имеют родителя, то они будут удалены автоматически - нет нужды делать это руками. и при присвоении в curWidget достаточно просто curWidget = wgt.

да, и указателям надо присваивать 0, а не NULL Улыбающийся
Записан

Изучением 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
braboar
Гость
« Ответ #8 : Июня 23, 2011, 14:58 »

kambala, спасибо. Удаление delete curWidget - было перестраховкой, а NULL - наследство от MFC. BTW, google не помог: всплывающая подсказка показала, что:
Код
C++ (Qt)
#define NULL __null
 
а что такое __null - не ясно, не нашел.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Июня 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
Записан

Изучением 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
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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