• 4832阅读
  • 5回复

[提问]【求助】关于QDialog问题 [复制链接]

上一主题 下一主题
离线ichliebedich
 

只看楼主 倒序阅读 楼主  发表于: 2015-07-08
我的客户端程序退出时,会弹出对话框,代码如下:

void MyClass::SlotExit()
{
    MyExitDlg myExitDlg (this);//退出的对话框
    int res = myExitDlg .exec();
    if ( QDialog::Accepted == res )//点击确定,退出
    {
        qApp->quit();
    }
}
这时,不点击确认,对话框弹出状态。我的服务器程序退出时,会通知客户端,我在客户端接收到通知后,再另一个控制类中通过信号槽来处理。主要槽处理代码如下:

void MyControl::SlotClose()
{
    if ( m_pMyClass == NULL )
    {
        return;
    }

    disconnect(m_pMyClass );
    m_pMyClass ->hide();
    delete m_pMyClass;
}
调试的运行结果,delete m_pMyClass;就会出错。那个弹出的退出对话框所在的槽函数还没有运行完,应该如何正确处理?
离线dbzhang800

只看该作者 1楼 发表于: 2015-07-08
你的问题是 使用了事件循环嵌套(QApplication::exec()中嵌套了QDialog::exec()),但没有按次序退出引起的。

要避免这种问题:
Qt官方和KDE社区 推荐的方式是:不要使用QDialog::exec()/QMenu::exec() 等造成嵌套的函数!
使用对应的 QDialog::open()/QMenu::open() 等函数。
离线ichliebedich

只看该作者 2楼 发表于: 2015-07-08
回 dbzhang800 的帖子
dbzhang800:你的问题是 使用了事件循环嵌套(QApplication::exec()中嵌套了QDialog::exec()),但没有按次序退出引起的。
要避免这种问题:
Qt官方和KDE社区 推荐的方式是:不要使用QDialog::exec()/QMenu::exec() 等造成嵌套的函数!
使用对应的 QDialog::open()/QMenu::open() 等函数。 (2015-07-08 12:19) 

感谢你的回复,刚才我使用QDialog::open()试了一下,可发现对话框都不弹出来了。。。
离线ichliebedich

只看该作者 3楼 发表于: 2015-07-08
回 dbzhang800 的帖子
dbzhang800:你的问题是 使用了事件循环嵌套(QApplication::exec()中嵌套了QDialog::exec()),但没有按次序退出引起的。
要避免这种问题:
Qt官方和KDE社区 推荐的方式是:不要使用QDialog::exec()/QMenu::exec() 等造成嵌套的函数!
使用对应的 QDialog::open()/QMenu::open() 等函数。 (2015-07-08 12:19) 

我用new的方式,使用open后是显示了,但使用open后,如何再去销毁new出来的对话框?请指教,谢谢
离线dbzhang800

只看该作者 4楼 发表于: 2015-07-08
如何delete的事情,用open() 和 用 show() 的用法是一样的。比如:你可以用一个类成员来保存指针

http://blog.qt.io/blog/2010/02/23/unpredictable-exec/
离线ichliebedich

只看该作者 5楼 发表于: 2015-07-08
回 dbzhang800 的帖子
dbzhang800:如何delete的事情,用open() 和 用 show() 的用法是一样的。比如:你可以用一个类成员来保存指针
http://blog.qt.io/blog/2010/02/23/unpredictable-exec/ (2015-07-08 14:15) 

已经知道如何解决问题了,十分感谢
快速回复
限100 字节
 
上一个 下一个