C++ QDialog派生类

C++ QDialog派生类,c++,qt,qdialog,C++,Qt,Qdialog,我从QDialog派生了一个类,用于显示图表。构造函数如下所示: myplot::myplot(QDialog *parent) : QDialog(parent) { chartView = new QChartView(); chart = new QChart(); Qt::WindowFlags flags = 0; flags |= Qt::WindowMaximizeButtonHint; flags |= Qt::WindowCloseBu

我从QDialog派生了一个类,用于显示图表。构造函数如下所示:

myplot::myplot(QDialog *parent) : QDialog(parent)
{
    chartView = new QChartView();
    chart = new QChart();

    Qt::WindowFlags flags = 0;
    flags |= Qt::WindowMaximizeButtonHint;
    flags |= Qt::WindowCloseButtonHint;
    setWindowFlags(flags);

    this->setLayout(new QVBoxLayout);
    this->layout()->addWidget(chartView);

    this->setModal(1);
    chartView->setChart(chart);
}
我从Mainwindow.cpp调用我的类,但在应用程序退出后对话框不会关闭:

myplot* plot = new myplot();        //does not close after app exit
plot->do_something();
plot->show();
我想我可以通过这个方法来纠正问题,但它不起作用:

myplot* plot = new myplot(this);    //does not work
当我使用此选项时,对话框立即关闭

myplot plot;                //immediatelly close
plot.do_something();
plot.show();
当我使用exec而不是
.show()
时,我在对话框关闭后得到错误“调试断言失败,_-CtrlIsValidHeapPointer(块)”

plot.exec();

            //work but after exiting dialog error
请问,如何正确处理我的派生类在应用程序退出后关闭?我还想让
myplot
类成为非模态类(现在我将其设置为模态类,以便用户在退出应用程序之前手动关闭它)

添加的头文件:

#ifndef MYPLOT_H
#define MYPLOT_H

class myplot : public QDialog
{
    Q_OBJECT

private:
public:
    explicit myplot(QDialog *parent = nullptr);
signals:

};


#endif // MYPLOT_H

这可能是问题的重复

答案是您必须自己编写该功能。如果将
myplot
对象作为
MainWindow
类的成员变量,则可以在
MainWindow::closeEvent
中正确关闭它。有关如何实现此功能的提示,请参见上面的链接答案


顺便说一句:这样你就不必在主窗口前强制关闭对话框了。

你需要看看QDialog是什么样子的

do:将QWidget而不是QDialog传递给构造函数,将析构函数添加到对话框中,并在其中删除myplot实例创建的所有内容(如果有),调用exec()而不是show()


请显示对话框的标题…我添加了标题文件(为了更好的可读性,我删除了一些我认为与问题无关的变量和方法)。我在您编写时将其更改为:QWidget并通过exec()调用。我还将setModal更改为this->setModal(0);尽管如此,行为还是一样的,对话框的行为就像是模态对话框。请,如何更正此问题?不要更改模态属性中的任何内容,删除setModal行,然后只调用exec,这是我也尝试过的-我删除了setModal并通过exec()调用。不幸的是,这种行为和我在问题中描述的一样。也许我还缺少什么
class myplot : public QDialog
{
    Q_OBJECT
    public:
        explicit myplot(QWidget *parent = nullptr);
         ~myplot();
    ....