C++ QDialog派生类
我从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
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();
....