将qt的子进程窗口嵌入qt的主进程主窗口中(方法二)

上一篇文章(将qt的子进程窗口嵌入qt的主进程主窗口中(方法一)_qprocess 可以传入窗口指针吗-CSDN博客),存在失去焦点问题,分析可能原因是直接将子进程的main函数中将当前窗口的父窗口设置为传过去的窗口句柄,而这个在子进程中处理的句柄,虽然与主进程中句柄一致,但是在键盘焦点处理的时候,可能就会产生歧义了。目前没有搞清楚怎么处理的.

下面这种方式也类似第一种方式,不同点在于处理窗口句柄的方式.

通过自定义一个QWindow的一个子类,在子类中通过window平台api将子进程窗口的句柄与子类对象形成父子关系.然后在将子类封装为QWidget供qt主进程的其他控件使用.这种方式的优点是不存在失去焦点问题.但是要处理win7下的其他问题.

笔者在win7下出现的问题:

1.当子进程非全屏模式时,当通过QProcess启动这个子进程窗口时,出现卡住的问题,并且不会显示该窗口. 只有将子进程的设置为 showFullScreen()后,就能正常启动了.分析可能原因时,window平台api设置窗口为无边框及工具窗口对于qt窗口无效,只能通过子进程内部设置好.

2.当主进程窗口是showFullScreen()状态时,子进程存在QDailog窗口,或者一些其他控件会使当前子进程窗口失去焦点的操作时,会出现window7桌面任务栏弹出的现象.win10下正常. 笔者通过判断当前操作系统版本,然后通过将任务栏的自动隐藏功能开启后,可通过软件层面技术性解决该问题.将任务栏自动隐藏功能开启后,即使存在弹出现象,也因为隐藏后,不会显示. 当软件退出时,再取消该功能.

代码1: 自定义一个QWindow子类

#include <windows.h>
#include <QWindow>


//创建子进程用的QWindow子类
class ChildWindowWrapper : public QWindow {

    Q_OBJECT
public:
    /// <summary>
    /// 构造一个Qwindow子类对象
    /// </summary>
    /// <param name="hwnd">子进程创建的窗口句柄</param>
    /// <param name="size">子进程窗口预设大小,这里设置为父窗口大小</param>
    /// <param name="parent">Qwindow对象的父对象,必须有</param>
    ChildWindowWrapper(HWND hwnd, QSize size, QWindow* parent = nullptr)
        : QWindow(parent)
        , m_hwnd(hwnd)
        , m_Size(size)
    {
        embedChildWindow();
    }
    ~Child
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值