【问题标题】:How to know child Window is destroyed form parent Window如何知道子窗口从父窗口被破坏
【发布时间】:2018-03-06 06:45:24
【问题描述】:

我的 Qt 应用程序中有一个父子窗口。父类是QDialog,名为A,子类是QMainWindow,名为B。现在我希望每当通过“X”按钮关闭B时,都会发出一个信号,该信号可以被A类中的插槽捕获到我希望实现某些功能。我可以使用 Qt 中的预定义信号吗?

我想要这样的东西:

B *b=new B;
//some code
connect(b,SIGNAL(destroyed()),this,&A::doSomething);

B 还有一个QWidget,我可以用它来检测被破坏的信号。我该如何实施?我需要从~B() 发出自定义信号吗?

编辑:我不想销毁对象b,因为当我想从A 重新创建窗口B 并且我想保留b 的参数。

【问题讨论】:

标签: c++ qt


【解决方案1】:

你的解决方案只有在你 set a Qt::WA_DeleteOnClose attribute 到你的 B 小部件时才有效:

b->setAttribute(Qt::WA_DeleteOnClose);

另一种选择是重新实现 close event 并在那里发出自定义信号。

【讨论】:

  • 那么当窗口被破坏时,没有内置信号会发出?
  • 我的代码中的行在构建时给了我编译错误
  • 您正在将新的连接语法与旧的混合。
  • QObject::destroyed 就是这样的信号。但默认情况下,当您关闭小部件时,它们不会被销毁。这就是您需要Qt::WA_DeleteOnClose 属性的原因。
  • 所以这基本上会破坏对象b?如果我仍然想保持对象 b 完好无损,有什么办法吗?
【解决方案2】:

像这样连接你的对象:

widget = new QWidget();
//widget->show(); //optional using
connect(widget, &QWidget::destroyed, this, &MainWindow::widgetDestroy);
widget->setAttribute(Qt::WA_DeleteOnClose);

.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButtonNew_clicked()
{
    widget = new QWidget();
    widget->show();
    connect(widget, &QWidget::destroyed, this, &MainWindow::widgetDestroy);
    widget->setAttribute(Qt::WA_DeleteOnClose);
}

void MainWindow::on_pushButtonDel_clicked()
{
    delete widget;
}

void MainWindow::widgetDestroy()
{
    qDebug()<< "deleted."; //after destroy widget this function calling.
}

.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


private slots:

    void widgetDestroy();

    void on_pushButtonNew_clicked();

    void on_pushButtonDel_clicked();

private:
    Ui::MainWindow *ui;
    QWidget *widget;
};

#endif // MAINWINDOW_H

.ui:

【讨论】:

  • @AbhishekAgarwal 在此处下载示例应用程序:mediafire.com/file/7f0434k0qdsv1pz/DestroyWidget.rar
  • 这在添加@thuga 答案中给出的setAttribute 命令后有效。请将此添加到答案中。
  • @AbhishekAgarwal 我只是测试它,它在没有setAttribute 的情况下工作我用delete widget; 删除它
  • 我在我的系统中对其进行了测试,它也与您的应用程序一起工作。但它没有通过我的应用程序发出信号。也许Qt版本可能是问题?我在 Qt 5.9
  • 奇怪,我也是Qt 5.9.0
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
相关资源
最近更新 更多