将 Java 应用程序移植到 C++ (qt)
Porting Java application to C++ (qt)
我已经使用 Swing 用 Java 编写了应用程序,现在我正在尝试用 C++ 重写它。Java中的程序具有控制器,该控制器引用了事件的Model,View和BlockingQueue。当视图中发生某些事情时,新事件被放入 BlockingQueue 并由控制器和模型处理。然后一些操作由 SwingUtilities.invokeLater() 在 Swing 中调用。
如何使用Qt在C++中做这样的事情?我已经编写了模型,但我不知道如何通过Java的BlockingQueue之类的东西将其与Qt编写的UI连接起来。
如果可能的话,我会避免使用线程。在您方面没有任何进一步的澄清的情况下,我建议您查看信号和插槽的Qt文档。简而言之,信号和插槽是Qt中事件处理的默认方式,与小部件交互会导致信号被触发。您的类可以将自己连接到这样的信号并对其做出反应。
我意识到这个答案很模糊。如果您添加有关您想要完成的更多详细信息,我很乐意将其更新:)
相当于 BlockingQueue 是每个QObject
固有的。在QObject的Qt文档中没有明确说明(应该是这样!),但是每个QObject都有一个有效的事件队列。您可以使用静态QCoreApplication::postEvent
方法从任何线程将事件发布到任何 QObject - 只要您有一个指向 QObject 的指针,您就可以将事件发布到它。
Qt::QueuedConnection
类型的信号槽连接使用相同的事件队列来发布内部QMetaCallEvent
事件。这些事件由QObject::event()
拾取,并导致对相关槽的调用。当控制返回到线程的事件循环时,后者查看事件队列并将事件传递给QObject::event()
方法。
这些内置事件队列非常有用,因为它们本质上允许您序列化对 QObject 的访问,因此您不必添加额外的同步原语,并且避免将自己设置为死锁。不幸的是,使用临时同步会导致麻烦,甚至Java在设计上也出错了。请参阅Herb Sutter关于此主题的出色阐述:死锁的多面性,并避免在关键部分中调用未知代码。他有很多关于这个和相关主题的其他出版物,这是一个真正的知识宝库。他还解释了如何设计运行到完成、简短而甜蜜的异步应用程序以获得良好的性能。
如果你的设计基于QObjects以及使用信号槽和事件发布在它们之间的连接,那么你已经准备好将这些QObjects中的任何一个移动到专用的QThread,如果你的分析/基准测试表明需要这样做。但是,任何派生自 QWidget 的东西都不能离开 GUI 线程。
听起来你想用QThread创建一个worker类。看看Qt'Mandelbrot在响应GUI事件的线程中完成的工作示例:http://doc.qt.io/qt-4.8/qt-threads-mandelbrot-example.html
- Qt VTK交互风格的信号到小部件
- QT在错误的班级中寻找空位
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 如何在Qt C++中更改光标
- 如何在MS Visual Studio 2019中运行QT UI
- QT通过C++添加映射QML项目
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用Qt C++计算类似Git的SHA1哈希
- Qt focusObjectChanged example?
- 如何在cpp文件之间切换窗口?在Qt中
- Qt和C++:将QLineEdit添加到QTabWidget中
- 从数据库实时显示QT c++中的数据
- Qt Quick-如何仅从c++代码与qml属性交互
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 如何在Qt中取消捕获字符串
- Qt SQLite没有查询或参数计数不匹配
- Qt SQlite无法创建表