Russian Qt Forum

Qt => Вопросы новичков => Тема начата: demaker от Декабрь 17, 2014, 15:20



Название: QWidget
Отправлено: demaker от Декабрь 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;
   }
}
 

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

Скажите в чем причина(что неправильно) ???


Название: Re: QWidget
Отправлено: kambala от Декабрь 17, 2014, 15:22
ты уже задолбал давать идиотские названия своим темам

виджет б у тебя не имеет родителя, поэтому автоматически он не закроется. попробуй принудительно close() ему делать перед удалением.


Название: Re: QWidget
Отправлено: gil9red от Декабрь 17, 2014, 15:26
Похоже, до деструктора вообще не доходит.

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

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


Название: Re: QWidget
Отправлено: demaker от Декабрь 17, 2014, 15:27
делала
Код:
Widget::~Widget(){
    if( widgetB != NULL){
      widgetB->close();
      delete widgetB;
    }
}

но увы...


Название: Re: QWidget
Отправлено: demaker от Декабрь 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);
}
 

но не помогло


Название: Re: QWidget
Отправлено: gil9red от Декабрь 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();
}
 


Название: Re: QWidget
Отправлено: demaker от Декабрь 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();
}
 


Название: Re: QWidget
Отправлено: Nidxogg от Декабрь 17, 2014, 20:39
сделал
делала
???