qt 消息发送的注意点

利用QT消息机制可以传递一些参数,例如要传递QImage形式的图像,可以这样写:

一种形式是:

emit send(QImage);

第一种方法由于QImage默认拷贝为浅拷贝,sender只复制传递指针,无需担心内存复制的消耗。

另一种形式是

emit send (const char*);

第二种方法需要注意如果sender和reciever分属于两个线程,connect的默认连接方式QueuedConnection。如果指针为栈指针,很有可能会变成无效指针。如果指针为堆指针,要记得手动释放防止内存泄漏。而第一种方法由于QImage采用Implicit Sharing使用较为简单安全。

在使用 Qt 框架开发 Windows 平台应用程序时,有时需要与底层操作系统进行更直接的交互,例如发送 Windows 消息。Windows 消息机制是 Windows 操作系统中窗口之间通信的基础,Qt 提供了一些机制来支持与 Windows API 的集成。 ### 使用 `SendMessage` 和 `PostMessage` 发送 Windows 消息Qt 中,可以通过调用 Windows API 函数 `SendMessage` 或 `PostMessage` 来发送消息。这两个函数的区别在于: - `SendMessage` 会等待消息处理完成后才返回,适用于需要立即得到结果的场景。 - `PostMessage` 则是将消息放入目标窗口的消息队列后立即返回,适用于异步消息发送。 在 Qt 中调用这些函数时,需要获取目标窗口的句柄(HWND),可以通过 `QWidget::winId()` 方法获得。 ```cpp #include <windows.h> #include <QWidget> void sendWindowsMessage(QWidget* targetWidget, UINT message, WPARAM wParam, LPARAM lParam) { HWND hwnd = reinterpret_cast<HWND>(targetWidget->winId()); if (hwnd != NULL) { SendMessage(hwnd, message, wParam, lParam); } } ``` 如果希望异步发送消息,则可以将 `SendMessage` 替换为 `PostMessage`。 ### 在 Qt 中捕获和处理 Windows 消息 为了处理来自 Windows 的原生消息Qt 提供了 `QAbstractNativeEventFilter` 接口。通过实现 `nativeEventFilter` 方法,可以捕获和处理原生消息。首先需要将自定义的事件过滤器安装到 `QCoreApplication` 上。 ```cpp class MyNativeEventFilter : public QAbstractNativeEventFilter { public: bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override { MSG* msg = static_cast<MSG*>(message); if (msg->message == WM_MOUSEMOVE) { // 处理鼠标移动消息 *result = 0; return true; } return false; } }; // 在 main 函数中或初始化阶段注册事件过滤器 MyNativeEventFilter* filter = new MyNativeEventFilter(); qApp->installNativeEventFilter(filter); ``` ### 注意事项 - 在使用 Windows API 时,需确保包含相应的头文件并链接到正确的库。 - 调用 `winId()` 获取的 HWND 是 Qt 内部使用的窗口句柄,不保证在整个应用程序生命周期中保持不变。 - 在跨平台开发中,应尽量避免直接依赖 Windows API,以保持代码的可移植性。如果必须使用平台相关功能,建议将这部分代码封装到平台相关的模块中。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值