qt当通过子进程的方式嵌入窗口后,键盘按键响应不了怎么办?

案例问题:当通过QProcess类,创建了一个子线程后,再将该子线程中的窗口封装到QWidget后嵌入当前主窗口中后,当在操作主进程窗口后,再去操作子进程窗口时,这时出现子进程窗口无法获取到键盘消息。或者先操作子进程中的窗口后,再切换到主进程窗口中的编辑框也会失去键盘消息。

分析:当在主进程中操作编辑框后,会将键盘事件捕获,而这时候去操作子进程的编辑框时,这个键盘事件已经被主进程独占了!也就导致了键盘失效。那能不能用释放键盘事件去实现了,经测试也不行。只在同一个进程中时有效。在不同进程中这种方式不行。

解决方案:

通过将主进程窗口在切换到子进程窗口时,通过进程间通讯的方式,告诉子进程,让子进程自己将自己的窗口做再次激活处理。来保证当子进程窗口进入后处于激活状态。这样自然而然键盘事件就能响应了。当从子进程窗口切换到主进程中时,也通过类似的方式来操作。

但是当在操作子进程窗口时,同时还需要操作主进程中的一些快捷方式时(比如F1-F12按键),就需要通过系统级别的消息事件,在window下,采用window的hook的方式捕获键盘事件,然后在封装为键盘事件发送到主进程中。因为在qt的工作机制下,当应用处于失去焦点的状态时,键盘事件是失效的。通过注册键盘事件,及过滤器是无法捕抓到键盘事件的。所以只能采用系统级别的hook方式。

你可能感兴趣的:(QT,qt,c++,开发语言)