【问题标题】:QDialog derived classQDialog派生类
【发布时间】:2020-05-18 12:57:04
【问题描述】:

我从 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() 时,对话框关闭后出现错误 "Debug Assertion Failed, _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

【问题讨论】:

  • 请显示对话框的标题......
  • 我添加了头文件(为了更好的可读性,我删除了一些与我认为与问题无关的变量和方法)。

标签: c++ qt qdialog


【解决方案1】:

这可能与this 问题重复。

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

顺便说一句:那么你不必让你的对话框模式强制在 MainWindow 之前关闭它。

【讨论】:

    【解决方案2】:

    你需要看看 QDialog 的样子...

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

    class myplot : public QDialog
    {
        Q_OBJECT
        public:
            explicit myplot(QWidget *parent = nullptr);
             ~myplot();
        .... 
    

    【讨论】:

    • 我在你写的时候把它改了:改成 QWidget 并通过 exec() 调用。我还将 setModal 更改为 this->setModal(0);尽管如此,行为是相同的,并且对话框的行为就像是模态的。请问,如何改正?
    • 不要更改 modal 属性中的任何内容,删除 setModal 行并调用 exec,
    • 这也是我尝试过的——我删除了 setModal 并通过 exec() 调用。不幸的是,行为与我在问题中描述的相同。也许我仍然缺少一些东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多