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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QWidget  (Прочитано 3402 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Декабрь 17, 2014, 15:20 »

Есть виджет А, при нажатии кнопки создается еще
один виджет В.

Код
C++ (Qt)
void Widget::clickPushButton(){
   if( widgetB == NULL){
     widgetB = new QWidget;
     widgetB->show();
   }
}
 

при закрытии(удалении) виджета A,
должен закрыться(удалиться) виджет В.

Код
C++ (Qt)
Widget::~Widget(){
   if( widgetB != NULL){
     delete widgetB;
   }
}
 

но этого не происходит.

Скажите в чем причина(что неправильно) Непонимающий
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Декабрь 17, 2014, 15:22 »

ты уже задолбал давать идиотские названия своим темам

виджет б у тебя не имеет родителя, поэтому автоматически он не закроется. попробуй принудительно close() ему делать перед удалением.
« Последнее редактирование: Декабрь 17, 2014, 15:24 от 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
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Декабрь 17, 2014, 15:26 »

Похоже, до деструктора вообще не доходит.

Установите виджету флаг Qt::WA_DeleteOnClose.

Цитировать
Qt::WA_DeleteOnClose
Указывает Qt удалять этот виджет, когда он получает сообщение о закрытии (см. QWidget::closeEvent()).
Записан

demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #3 : Декабрь 17, 2014, 15:27 »

делала
Код:
Widget::~Widget(){
    if( widgetB != NULL){
      widgetB->close();
      delete widgetB;
    }
}

но увы...
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #4 : Декабрь 17, 2014, 15:35 »

Похоже, до деструктора вообще не доходит.

Установите виджету флаг Qt::WA_DeleteOnClose.

Цитировать
Qt::WA_DeleteOnClose
Указывает Qt удалять этот виджет, когда он получает сообщение о закрытии (см. QWidget::closeEvent()).

сделал
Код
C++ (Qt)
WidgetB::WidgetB(QWidget *parent):
         QWidget(parent)
{
  setAttribute(Qt::WA_DeleteOnClose);
}
 

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Декабрь 17, 2014, 15:48 »

Все работает Улыбающийся

Код
C++ (Qt)
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private slots:
   void on_pushButton_clicked();
 
private:
   Ui::MainWindow *ui;
   QWidget * w;
};
 

Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow),
   w(0)
{
   ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
   qDebug() << "~";
   if (w)
       w->deleteLater();
 
   delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
   qDebug() << "+";
   if (!w)
       w = new QWidget();
 
   w->show();
}
 
Записан

demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #6 : Декабрь 17, 2014, 16:34 »

А что тогда не так???
Код
C++ (Qt)
void Widget::createBKTWidget(bool flag)
{
   if(flag && (bktWidget == NULL)){
       bktWidget = new BKTWidget;
       bktWidget->show();
       connect(bktWidget,SIGNAL(closeBKT(bool)),ui->chbBKT,SLOT(setChecked(bool)));
   }
   else if(!flag && (bktWidget != NULL)){
       bktWidget->deleteLater();
       bktWidget = NULL;
   }
}
 
Widget::~Widget()
{              
 
 
   qDebug()<<"bktWidget = "<<bktWidget;
   if(bktWidget != NULL){
       qDebug()<<" ~ Widget bktWidget";
       bktWidget->deleteLater();
       bktWidget = NULL;
   }
 
   delete ui;
}
 
BKTWidget::BKTWidget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::BKTWidget)
{
   setAttribute(Qt::WA_DeleteOnClose);
   ui->setupUi(this);
   qDebug()<<"new";
}
 
BKTWidget::~BKTWidget()
{
   delete ui;
   qDebug()<<"delete";
}
 
void BKTWidget::closeEvent(QCloseEvent *event){
   Q_EMIT closeBKT(false);
   event->accept();
}
 
Записан
Nidxogg
Гость
« Ответ #7 : Декабрь 17, 2014, 20:39 »

сделал
делала
Непонимающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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