我可以在不使用其 UI 框架的情况下将 Qt 用作 C++ 库吗

Posted

技术标签:

【中文标题】我可以在不使用其 UI 框架的情况下将 Qt 用作 C++ 库吗【英文标题】:Can I use Qt as C++ Library without using its UI framework 【发布时间】:2009-12-25 22:35:53 【问题描述】:

在不实际使用 Qt 用户界面系统的情况下,使用 Qt 来提高 MFC 应用程序的工作效率是否有意义?

我目前正在为我的基于 MFC 的应用程序寻找一个很好的生产力库,其中包含有用的容器类、字符串算法、线程类、I/O 类等。在我看来,Qt API 非常好。但是,由于我不想将我的 UI 切换到 Qt(太费力了),我想知道 Qt 是否可以在没有任何 Qt UI 的 MFC 应用程序中很好地使用。

提前感谢您的意见。

法比安

【问题讨论】:

【参考方案1】:

Qt 分为几个模块(QtGui 就是其中之一)。您可以通过仅链接您需要的库来手动选择您的应用程序使用哪些模块。

我无法回答 Qt 是否可以与 MFC 互操作。但至少,QString 提供了到 std::string 和 char*/wchar 的转换,这应该对你有很大帮助。

Qt 文档在模块上提供了overview。

正如 daniel 在下面指出的,您必须了解事件循环。然而,可以在没有 GUI 模块的情况下使用事件循环。您可以在 QCoreApplication 上调用processEvents 来处理所有排队的事件,然后返回。延迟删除有一个警告,但文档描述了解决方法。

【讨论】:

这并不完全正确 - 如果没有事件循环,您将无法使用 Qt 中的每个类。见@deus-ex-machina399 答案:***.com/questions/1962103/… 谢谢丹尼尔,我将您的担忧纳入我的回答中。【参考方案2】:

您可以使用一些实用程序类,但有一个非常重要的警告。 Qt 非常依赖于它的事件循环。事件循环通过调用QApplication::exec() 启动。现在很多Qt类依赖的信号槽机制就是Qt了。信号和槽完全依赖于事件循环才能正常工作。

这对于 GUI 模块是完全正确的,但对于其他一些模块也是如此。可以期望从QObject 派生的每个类都使用信号和插槽,因此如果没有事件循环,将无法使用。

【讨论】:

嗯,很高兴知道。理论上可以在我的 MFC 应用程序中处理 Qt 事件循环非阻塞吗?或者这会导致更多的问题而不是好处? @F***:这将非常复杂和混乱,我认为主事件循环类 QApplication 和 QCoreApplication 假设它们代表了程序的整个状态。你应该做的是完全错过信号和插槽,这样更安全、更理智。没有它也可以使用 QtNetwork;只需使用阻塞调用。 +1 其他答案都没有解决事件循环——这是 Qt 的关键。【参考方案3】:

当然,您可以使用 QT 工具包而不使用它的 GUI 库。

根据您的需要,您可能需要考虑boost 库,它提供了一组有助于做很多事情的合理 API。我个人用它来做多平台的网络套接字,但它还有很多。

【讨论】:

【参考方案4】:

是的,您可以,您只需将 QtGui 模块从您的项目 (.pro) 中排除,因为它默认包含。

 QT -= gui 

像这样只使用核心模块。

【讨论】:

【参考方案5】:

Mumble project 将 Qt 用于客户端和服务器,而服务器根本没有任何 UI 代码,仍然广泛使用 Qt API 的其余部分。

【讨论】:

【参考方案6】:

如果您只希望它用于集合类,为什么不直接使用 std:: 库?

【讨论】:

嗯,我也在研究线程之类的东西。 Qt(和 Boost)具有 std 不提供的有用功能。 OP 最初说他们希望 Qt 替换 MFC 集合类

以上是关于我可以在不使用其 UI 框架的情况下将 Qt 用作 C++ 库吗的主要内容,如果未能解决你的问题,请参考以下文章

如何以非阻塞方式链接期货?也就是说,如何在不阻塞的情况下将一个future用作另一个future的输入?

如何使用 ROOM 库在不阻塞 UI 的情况下将数千条记录从本地数据库加载到 recyclerview

如何在不使用画布的情况下将整个 div 数据转换为图像并将其保存到目录中?

如何在不使用界面生成器的情况下将视图与控制器分离

如何在不为其分配内存的情况下将缓冲区传递给 write()

我应该如何在不使用 C++ 中的构造函数的情况下将值(不是指针)转换为子类?