欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

cad中ar命令不弹出对话框,qt 弹出对话框

墨初 知识笔记 59阅读
在stack区创建对话框对象

模态对话框不可以对其他窗口进行操作。 模态窗口用dlg.exec()显示窗口。


问题代码1:

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    //点击新建按钮弹出一个对话框    connect(ui->actionNew, &QAction::triggered, [this](){        // 阻塞态对话框只能有一个        QDialog dlg(this);// 在stack区创建 dlg        dlg.resize(200,100);                //dlg.exec();// 让窗口对象卡住点击关闭关闭窗口。        qDebug() << 模态对话框弹出了;    });        }

对象dlg在stack区被创建。dlg 的生命周期在Lambda表达式内当箭头函数结束时会自动销毁 stack 区内存窗口一闪即逝。


正确写法设置exec()函数

    connect(ui->actionNew, &QAction::triggered, [this](){        // 阻塞态对话框只能有一个        QDialog dlg(this);// 在stack区创建 dlg        dlg.resize(200,100);         dlg.exec();// 让窗口对象卡住点击关闭关闭窗口。        qDebug() << 模态对话框弹出了;    });

dlg.exec()相当于 while(1)让窗口对象持续存在。当手动叉掉对话框时箭头函数就会结束并自动销毁 stack 区内存不会出现内存泄漏。




在堆区创建对话框对象

非模态对话框可以对其他窗口进行操作。非模态窗口用dlg->show()显示窗口。


问题代码2:

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    //点击新建按钮弹出一个对话框    connect(ui->actionNew, &QAction::triggered, [this](){        // 非模态对话框        QDialog *dlg2  new QDialog(this);        dlg2->resize(200,100);        dlg2->show();                qDebug() << 非模态对话框弹出了;    });}

程序不会报错运行结果和上图差不多。

但是由于dlg2在堆区创建当箭头函数结束时堆区内存不会被自动释放。因此对话框会持续保留不需要exec()函数卡住程序。

又因为dlg2非模态对话框可以无限创建。理论上讲只要用户无限点击几天时间就会占用大量堆区的内存。只要主程序没有结束对象树的自动析构就不会起作用即使叉掉对话框也不会释放。这是一个重大的安全隐患。


正确写法设置Qt::WA_DeleteOnClose属性

    connect(ui->actionNew, &QAction::triggered, [this](){        // 非模态对话框        QDialog *dlg2  new QDialog(this);        dlg2->resize(200,100);        dlg2->show();                dlg2->setAttribute(Qt::WA_DeleteOnClose);  //55号属性                qDebug() << 非模态对话框弹出了;    });

未设置该属性时你去关闭窗口窗口资源不会立即释放窗口只是隐藏了。当调用析构函数时窗口资源才会真正释放。设置该属性后我们关闭窗口窗口资源会立即释放。



完整的示例代码
MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent)    , ui(new Ui::MainWindow){    ui->setupUi(this);    //点击新建按钮弹出一个对话框    connect(ui->actionNew, &QAction::triggered, [this](){        // 阻塞态对话框        QDialog dlg(this);        dlg.resize(200,100);        dlg.exec();        qDebug() << 模态对话框弹出了;        // 非模态对话框        QDialog *dlg2  new QDialog(this);        dlg2->resize(200,100);        dlg2->show();        dlg2->setAttribute(Qt::WA_DeleteOnClose);  //55号属性        qDebug() << 非模态对话框弹出了;    });}




参考连接

setAttribute(Qt::WA_DeleteOnClose) 导致程序崩溃问题

标签:
声明:无特别说明,转载请标明本文来源!