qt ×掉子窗口后,进程还没有停止的问题

×掉子窗口后,子窗口还在接受数据的问题

  • 当子窗口显示时,先关闭父窗口,调用的先后顺序为:
    请添加图片描述

  • 当子窗口显示时,先关闭子窗口,调用的先后顺序为:
    请添加图片描述
    找到原因:此时子窗口的析构函数没有执行
    解决方案:
    先说解决方案:给子窗口设置以下属性:

setAttribute(Qt::WA_QuitOnClose,  true); //关闭此窗口,会立即执行析构函数

这时会出现关闭父窗口后,子窗口需要手动关闭的问题

我们需要关闭父窗口后,子窗口会一起关闭
解决方案:
给父窗口也设置以下属性:

setAttribute(Qt::WA_QuitOnClose,  true); //关闭此窗口,会立即执行析构函数

然后在父窗口的析构函数中先调用子窗口的析构函数

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,可以使用QProcess进行子进程的创建和管理。然而,QProcess本身并不提供获取窗口句柄的功能。要获取子进程窗口句柄,可以借助一些底层操作系统的API。 首先,在Qt中启动子进程之后,可以使用QProcess的pid()函数获取子进程进程ID。然后,可以使用操作系统相关的API来获取子进程窗口句柄。以下以Windows操作系统为例,介绍如何实现: 1. 使用QProcess启动子进程。 ``` QProcess process; process.start("your_executable_file"); ``` 2. 获取子进程进程ID。 ``` qint64 pid = process.pid(); ``` 3. 使用Windows API函数EnumWindows()遍历所有顶级窗口,并查找与子进程进程ID对应的窗口。 ```cpp #include <windows.h> HWND childWindow = nullptr; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { DWORD pid; GetWindowThreadProcessId(hwnd, &pid); if (pid == static_cast<DWORD>(lParam)) { childWindow = hwnd; return FALSE; // 找到目标窗口后,终止遍历 } return TRUE; } EnumWindows(EnumWindowsProc, static_cast<LPARAM>(pid)); ``` 4. 最后,可以使用获取到的窗口句柄进行后续操作,例如设置窗口属性、发送消息等。 ```cpp // 设置窗口标题 QString title = "New Window Title"; SetWindowText(childWindow, title.toStdWString().c_str()); // 发送消息到子进程窗口 std::wstring message = L"Hello from Parent"; SendMessage(childWindow, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(message.c_str())); ``` 需要注意的是,获取窗口句柄是操作系统相关的操作,不同平台可能有不同的实现方式。因此,上述代码只适用于Windows平台。在其他平台上,可能需要使用不同的API函数或方法来获取窗口句柄。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值