• 6693阅读
  • 5回复

请问QWidget如何在接到系统发来的kill信号(或者在window通过进程管理器直接将其干掉)时调用slot方法 [复制链接]

上一主题 下一主题
离线nikshuang
 

只看楼主 倒序阅读 楼主  发表于: 2009-11-18
RT, 程序要求在窗口退出之前调用一个slot方法,如果是点程序中的退出按钮退出或点窗口的X键退出都很好实现。 但如果用户在进程管理器中直接杀掉程序话,QWidget能捕获这个KILL信号吗,这个信号名是什么??如果不能的话有没有别的替代方法??

请高手帮忙看看,谢谢了
离线snailbing

只看该作者 1楼 发表于: 2009-11-18
在linux下接收系统信号 可以看一下 signal 函数。主要处理的是 SIGINT 和 SIGTERM 信号。
在windows下调用系统的API了,SetConsoleCtrlHandler 函数。
自己可以写一个函数来绑定这些信号或操作,当这个函数做触发时我可以发出一个 Qt 的 signal 让指定的 SLOT来接收。
离线nikshuang

只看该作者 2楼 发表于: 2009-11-18
非常感谢1楼的回复
离线nikshuang

只看该作者 3楼 发表于: 2009-11-18
引用第1楼snailbing于2009-11-18 16:13发表的  :
在linux下接收系统信号 可以看一下 signal 函数。主要处理的是 SIGINT 和 SIGTERM 信号。
在windows下调用系统的API了,SetConsoleCtrlHandler 函数。
自己可以写一个函数来绑定这些信号或操作,当这个函数做触发时我可以发出一个 Qt 的 signal 让指定的 SLOT来接收。


我在类文件中定义了SetConsoleCtrlHandler中绑定的handler函数,函数实现是发送一个qt信号,但代码如下,会出现错误:信号没有定义的情况。
......
#include <windows.h>    
......

BOOL WINAPI  tellColsePlayer(DWORD cEvent)
{
    emit    colsePlayer();      //closePlayer()是Core类中声明的一个信号
}

Core::Core()
{
         ......
         SetConsoleCtrlHandler(tellColsePlayer, TRUE);

         ........
}


如果改用
BOOL WINAPI  tellColsePlayer(DWORD cEvent)
{
    emit    Core::colsePlayer();      //closePlayer()是Core类中声明的一个信号
}
则报colsePlayer是受保护的错误信息。


我要怎样才能在外部函数给类发信号呢~~~~~~~~~?????

请高手帮忙看下
[ 此帖被nikshuang在2009-11-18 18:22重新编辑 ]
离线hiti_tony
只看该作者 4楼 发表于: 2009-11-18
你可以试下重载winevent,拦截WM_DESTROY
离线nikshuang

只看该作者 5楼 发表于: 2009-11-18
引用第4楼hiti_tony于2009-11-18 17:51发表的  :
你可以试下重载winevent,拦截WM_DESTROY


非常感谢,我试试
快速回复
限100 字节
 
上一个 下一个