• 6159阅读
  • 5回复

如何在没有显示主窗口之前退出进程 [复制链接]

上一主题 下一主题
离线sbtree
 
只看楼主 倒序阅读 楼主  发表于: 2008-10-29
— 本帖被 XChinux 执行加亮操作(2008-11-02) —
如题,在启动主窗口之前根据一些条件进行判断是否显示主窗口(通过show()函数),如果条件不满足,直接使用一个模态对话框,也就是调用对话框的exec()函数提示用户并等待用户关闭对话框,然后结束程序。调试的时候发现,关闭了对话框之后进程不能结束,不知道怎么退出进程,请高人指点。

尝试用信号槽连接,好像信号根本到达不了
    QApplication a(argc, argv);

    TLKProductMgr w; //从QWidget继承的一个类,里面有一个对话框,和一个信号abort
    QObject::connect(&w,SIGNAL(abort()),&a,SLOT(quit()));

    w.start(); //启动并判断当前条件,如果条件满足show()用来显示自身,否则调用对话框exec(),在对话框即将关闭的时候发出信号,希望退出整个程序程序
    return a.exec();

实际上的运行没有达到期望的效果,不知道哪里错了。一个有疑问的地方就是,在对话框exec()返回的Accepted的时候,文档中说对话框只是被隐藏了,我想这里当然就没有window closed信号发生了,QApplication a当然收不到lastWindowClosed()信号了,所以试图在TLKProductMgr 中自己做一个abort信号,信号发送完毕之后,从w.start返回,这里总是感觉有点别扭,却不知道错在哪里

[ 此贴被sbtree在2008-10-29 16:05重新编辑 ]
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 1楼 发表于: 2008-10-29
尝试在对话框调用exec()完成之后,用close()关闭窗口,也不起作用,估计此时对话框被隐藏的原因
windows 7 + VC++2008 + Qt4.5.2
离线duduqq

只看该作者 2楼 发表于: 2008-10-29
用qApp->quit()
离线sbtree
只看该作者 3楼 发表于: 2008-10-29
又仔细看了一下文档,原因似乎清楚了,在QApplication的exec()被调用之前,根本无法处理任何事件。quit()函数实际上是调用exit(0)来退出程序的,如果应用程序的事件循环没有被启动,也就是exec()没有被调用,尽管他也能接受信号,但是exit()将不做任何操作,上面的代码最终还是停在应用程序的事件循环中

怎么解决这个问题呢? 继续研究中。。。。。。
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 4楼 发表于: 2008-10-29
引用第2楼duduqq于2008-10-29 16:49发表的  :
用qApp->quit()


这样也是不行的,见上面我自己的回帖
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 5楼 发表于: 2008-10-29
发现一个很简单的解决办法,就是给w.start()一个返回值
    if (w.start() == Abort)
        return 0;

    return a.exec();
这样避免调用应用程序的时间循环。

呵呵,自己结贴,有点老王卖瓜的感觉,不过我也是在不断学习啊,跟大家分享,共同进步
小结一下: exec()截获了系统的事件循环,某些跟事件相关的槽要仔细参考文档,还有一点,emit 信号是堵塞,直到接受该信号的所有的槽返回才能执行下面的代码,这一点对于实现某些异步的操作不适用,希望以后的qt能出现异步的信号和槽机制。
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个