Qt 中的 Win32 API
Posted
技术标签:
【中文标题】Qt 中的 Win32 API【英文标题】:Win 32 API in Qt 【发布时间】:2014-04-25 23:16:14 【问题描述】:我有一个使用 MFC 编写的程序,用于通过以太网与设备进行通信。我需要重写它并将其转换为 Qt。
MFC 程序使用 Win API 函数,如 CreateFile、ReadFile(获取网络数据包)和 DeviceIOControl(与用于促进通信的协议对话)
如果我包含 Windows.h,我可以直接在我的 Qt 代码中使用这些函数 - CreateFile、ReadFile 和 DeviceIOControl 吗?
WaitForSingleObject 和 Mutex 等用于并发的 Win API 函数怎么样? Win API 的哪些部分在 Qt 中可用/不可用?
是否有将 MFC 代码转换为 Qt 的标准机制?
【问题讨论】:
您可以使用来自 Qt 应用程序的任何 Windows API 函数(当然是为 Windows 编译的)。 Qt 与 Windows 同步原语的协作程度如何是您必须调查的。将 MFC 转换为 Qt 的标准机制:不要这样做。没有任何收获。 @IInspectable "整个 GUI 渲染都是在软件中实现的" 这是一件好事,因为如果你愿意,你可以并行化它。似乎你没有意识到所有遗留的 GDI/GDI+ 也完全在软件中完成,只是 Qt 的渲染有时比 Windows 的更快:) @IInspectable “Qt 需要额外的预处理阶段,增加了设置构建系统的复杂性” 不是预处理,而是代码生成。当然,真正了解他们的编程技巧的人会意识到代码生成器是一件好事。它们使您免于一遍又一遍地输入相同的无聊内容。他们节省的时间是在构建系统中设置 moc 的单一“支出”无法比拟的。 @IInspectable "你不能实现 Q_OBJECT 模板。"这是一个次要的挑剔,不是一个非常准确的挑剔——你当然可以拥有从QObject
基类派生的模板参数化类。如果你坚持,只要稍微调整一下moc
,你仍然可以做到。
@IInspectable 在 MFC 中写入 this,然后我们会谈谈 :)
【参考方案1】:
如果我包含 Windows.h,我可以直接在我的 Qt 代码中使用这些函数 - CreateFile、ReadFile 和 DeviceIOControl 吗?
是的。
WaitForSingleObject 和 Mutex 等用于并发的 Win API 函数怎么样? Qt 中 Win API 的哪些部分可用/不可用?
您可以使用 Win API 的任何部分。
是否有将 MFC 代码转换为 Qt 的标准机制?
没有标准机制。但是,对于上述功能,您确实需要研究 Qt 替代方案,例如 QMutex 等。
此外,您还需要考虑转换是否值得。毕竟,Qt 会在后台使用 Windows 上的 Windows API。
假设您希望使您的代码跨平台,您真的希望从直接使用 Windows API 迁移,否则您的代码最终将充满编译时预处理器指令。
【讨论】:
我不打算让我的应用程序跨平台。我只是想用更好的应用框架。 我在想我会以当前形式保留使用 Windows API 的代码部分,并随着时间的推移逐步淘汰它。因为,我不担心支持跨平台兼容性,所以我有能力花时间使用它。 哦不,不,我在回复“假设您希望使您的代码跨平台”。我只是让你知道,对于这个应用程序,我不知道。 好吧,你比我更了解你的项目。 :) 鉴于 IInspectable 的评论,你认为我的前提是 Qt 是一个比 MFC 更好的应用程序框架是正确的吗?我想做实时图像采集和处理,大量数据,大量实时处理。以上是关于Qt 中的 Win32 API的主要内容,如果未能解决你的问题,请参考以下文章
当前 Windows 版本中的 Win32 API 是不是仍然“原生”?