我有一个从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中调用了我的类,但是在App退出后对话框没有关闭。
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(block)" 关机后
plot.exec();
//work but after exiting dialog error
请问,如何正确处理我的派生类在App退出后被关闭?我也想有 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
. 关于如何实现这个功能,请看上面的链接答案。
BTW: 那你就不必让你的对话框变成模态,在MainWindow之前强制关闭它。
你需要看看QDialog的样子......
你需要看看QDialog是什么样子的......这样做:在构造函数中传递一个QWidget而不是QDialog,在对话框中添加一个destructor并删除所有由myplot实例创建的东西(如果有的话),调用exec()而不是show()......。
class myplot : public QDialog
{
Q_OBJECT
public:
explicit myplot(QWidget *parent = nullptr);
~myplot();
....