我正在构建一个 QtQuick 应用程序,我需要一个 TCPSocket 来轮询设备并填充我想要显示的数据结构。我发现了很多关于套接字和 Qt 5 小部件的示例,但是我无法将套接字创建为不是从 QObject 派生的 C++ 类。
我的理解是,如果我想与我的 QML 视图交换数据,我只需要从 QObject 派生。我编写了一个额外的类来执行此操作,因此我的套接字类不需要将任何数据传递给我的 QML 代码。
这个问题似乎几乎不是 Qt 问题,而是 C++ 网络编程问题。我收集到您基本上不喜欢明确使用自定义QObject
派生类,因为您不想moc
作为构建过程的一部分运行。虽然有人可能会争论它有什么不好,因为在 Qt 本身的构建过程moc
中运行了很多,让我们来看看目前的要求。
如果您正在寻找非基于 Qt 的纯 C++ 网络,那么Boost ASIO是一个非常可靠的解决方案。
如果您希望在没有自定义QObject
派生类的情况下使用 Qt 网络,那么您可以在单独的线程中运行代码并且只使用阻塞QTCPSocket
调用。毕竟,它是一个QIODevice
并提供阻塞接口。
最终,您会得到一些已填充的数据结构,并且应该传递给 QML。
从逻辑上讲,您的数据是一个数据模型,视图位于 QML 代码中。您可以使用QStandardItemModel
它 - 也就是说,如果您正在编写真正的模型视图代码,就像数据会随着时间而变化一样。同样,您正在重用现有的 -QObject
派生类,而无需派生您自己的类,也无需编写任何自定义信号或插槽。
一个真正穷人的解决方法是QObject
使用动态属性系统通过QObject::setProperty
. 我不记得如果通过 QML 引擎看到动态属性更改,您需要验证或简单地将此类对象视为常量。
对于相当愚蠢的预订,所有这些似乎都是很多变通方法。代码生成器很好,它们可以节省时间。一个复杂的基于 C++ 的产品的构建过程可能会使用几种不同的代码生成器,例如词法分析器/解析器生成器、状态机生成器、远程过程调用生成器、表生成器、测试用例生成器等。随着 C++ 的成熟,找到了一些方法来诱使编译器替换其中的一些生成器,但这只是将问题推向不同的可执行文件,有时还会将其推过一个非常小的针孔。