qt-quick(qml) 应用程序无法订阅 ros 主题

     2023-02-16     285

关键词:

【中文标题】qt-quick(qml) 应用程序无法订阅 ros 主题【英文标题】:qt-quick(qml) application can't subscribe ros topic 【发布时间】:2016-03-14 08:39:02 【问题描述】:

看完下面的视频教程,

https://youtu.be/NG05o_SV1iw

我可以从“Qt Creator”学习如何打开 catkin 项目。 现在我需要让 Qt-Quick 应用程序订阅 ros 主题。 但是,我不知道怎么做。关于这个问题的一些事实是:

Qt-Quick 应用程序是使用 qmake 编译的 catkin项目使用cmake编译 (*在catkin项目中可以订阅ros主题。)

简而言之,请告诉我“如何使用 cmake 编译 qt-quick 应用程序。

【问题讨论】:

【参考方案1】:

这是一个示例 CMakeList.txt 文件,可用于在 ROS 中编译 QT 应用程序。它的QT5(ros qt包似乎只支持qt4)

要使其适用于您的项目,只需替换您的 CMakeList.txt 文件并更改所有路径/项目名称:

##############################################################################
# CMake
##############################################################################

cmake_minimum_required(VERSION 2.8.0)
project(gui)

##############################################################################
# Catkin
##############################################################################

# qt_build provides the qt cmake glue, roscpp the comms for a default talker
find_package(catkin REQUIRED COMPONENTS qt_build roscpp sensor_msgs image_transport)
set(QML_IMPORT_PATH "$QML_IMPORT_PATH;$CATKIN_GLOBAL_LIB_DESTINATION" )
set(QML_IMPORT_PATH2 "$QML_IMPORT_PATH;$CATKIN_GLOBAL_LIB_DESTINATION" )
include_directories($catkin_INCLUDE_DIRS)
# Use this to define what the package will export (e.g. libs, headers).
# Since the default here is to produce only a binary, we don't worry about
# exporting anything. 
catkin_package()

##############################################################################
# Qt Environment
##############################################################################

# this comes from qt_build's qt-ros.cmake which is automatically 
# included via the dependency ca ll in package.xml
#rosbuild_prepare_qt4(QtCore QtGui QtQml QtQuick) # Add the appropriate components to the component list here
find_package(Qt5 COMPONENTS Core Gui Qml Quick REQUIRED)

##############################################################################
# Sections
##############################################################################

file(GLOB QT_RESOURCES RELATIVE $CMAKE_CURRENT_SOURCE_DIR resources/*.qrc)
file(GLOB_RECURSE QT_MOC RELATIVE $CMAKE_CURRENT_SOURCE_DIR FOLLOW_SYMLINKS include/gui/*.hpp)

QT5_ADD_RESOURCES(QT_RESOURCES_CPP $QT_RESOURCES)
QT5_WRAP_CPP(QT_MOC_HPP $QT_MOC)

##############################################################################
# Sources
##############################################################################

file(GLOB_RECURSE QT_SOURCES RELATIVE $CMAKE_CURRENT_SOURCE_DIR FOLLOW_SYMLINKS src/*.cpp)

##############################################################################
# Binaries
##############################################################################

add_executable(gui $QT_SOURCES $QT_RESOURCES_CPP $QT_FORMS_HPP $QT_MOC_HPP)
qt5_use_modules(gui Quick Core)
target_link_libraries(gui $QT_LIBRARIES $catkin_LIBRARIES)
target_include_directories(gui PUBLIC include)
install(TARGETS gui RUNTIME DESTINATION $CATKIN_PACKAGE_BIN_DESTINATION)

source article有更详细的解释。但基本上重要的部分是:

find_package(Qt5 COMPONENTS Core Qml Quick REQUIRED)

其中导入 Qt5 核心、qml 和快速组件。如果您不使用 qml,您可以安全地删除该部分。您还应该可以在此处添加其他 qml 组件。

cmake 列表中的其他 qt5 函数确实像在头文件上运行 qt5 prepossessor。

【讨论】:

【参考方案2】:

如果您正在尝试连接 Qt GUI 界面并与 ROS 通信,您可以查看这个ROS Qt 包。 它有一个关于如何实现这一目标的教程和模板。它也可以作为您项目的起点。

此外,它还附带一个 ros_create_qt_package 命令,该命令创建一个 Qt GUI 模板和已经准备好的 ROS 包,因此您只需按照自己的意愿定制它。

最后,只需要一个普通的 catkin_make,这样您就不会迷失在所有不同的 make 命令之间(感谢 CMakeLists !)。

干杯,

【讨论】:

值得提醒人们ros_create_qt_package创建了一个Qt 4包,所以你不能将它与QML一起使用,你也不能链接到最新版本的rqt、qviz 或其他使用 Qt 5 的工具。

如何创建 Qt-Quick 测试

】如何创建Qt-Quick测试【英文标题】:HowtocreateaQt-QuickTest【发布时间】:2015-10-1908:45:37【问题描述】:我必须创建一个单元测试。但首先,我必须弄清楚该怎么做。编写了一个QtQuick2-App,现在我想用GUI进行单元测试。使用GUI进行... 查看详情

无法在 QML 中播放视频

...在使用Qt5.8开发ubuntu14.04,并尝试使用Qt多媒体模块在我的应用程序中播放视频。我把“QT+=快速多媒体”放在“.pro”中。ContentVideo.qmlimportQtQuick2.1importQtMultimedia5.0Rectanglewidth:400heig 查看详情

无法使用 QML 远程对象连接错误:“connectionToSource 为空”

...描述】:我正在尝试使用Qt远程对象来创建客户端服务器应用程序。但是遇到了一个问题,说“connectionToSource为空”。 查看详情

将 QObject 指针从 QML 对象传递给 C++

...2018-02-0910:50:12【问题描述】:我在Qt/C++中有一个发布者/订阅者键值数据库类。订阅者可以通过传递键(字符串)、他们的QObject指针和属性来连接。每当订阅键的值改变时,订阅的QObject的属性就会改变为新值。在Qt/C++中运行良好... 查看详情

QML在被MouseArea拖动时无法更改项目的位置

...使用QML创建平铺地图而不使用QtLocation。我正在尝试设计应用程序,以便只加载基本的图块。这是我想出的策略。每个图块为256x256像素。瓦片放置在具有嵌套中继器的G 查看详情

QML 组件“视频”无法播放 Qt 资源文件中的视频文件

...在这里找到整个项目:QMLVideoTestProject我制作了一个示例应用程序,其中包含三个按钮、一个图像和一个视频播放器。按下按钮时,应该播放视频。这就是按钮的区别:访问与应用程序 查看详情

使用多个视图在 QML 中查看、编辑和更新数据(来自 C++),而数据保留在 C++ 中(订阅数据)

...查看、编辑和更新数据(来自C++),而数据保留在C++中(订阅数据)【英文标题】:View,editandupdatedata(fromC++)inQMLwithmultipleviews,whiletheDatastaysinC++(subscribetodata)【发布时间】:2013-11-0716:30:04【问题描述】:我有一些数据存储在C++类(Da... 查看详情

如何声明多个 QML 属性而不单独处理每个属性?

...布时间】:2016-07-0717:17:47【问题描述】:我有一个玩具QML应用程序(Qt5.7),它由以下QML页面和一些C++代码组成,这些代码允许QML订阅音频设备上的某些状态并在QMLGUI中反映该状态。玩具QML看起来像这样:i 查看详情

无法锚定到不是父项或同级 QML QtQuick 的项目

...0-1910:32:18【问题描述】:我正在使用QML开发一个Python桌面应用程序。我的QML文件中有这个:SplitViewanchors.fill:parentorientation:Qt.HorizontalRectangle 查看详情

WebView qml 在 iOS 11 上无法正常工作

...:2017-10-2414:33:50【问题描述】:我有一个问题,我需要在应用程序中打开url,我使用了WebView,但无法正常工作。导入这个:importQtWebView1.0我的代码:Rectanglewidth:Screen.widthheight:Screen.heightco 查看详情

无法将 Qml 信号连接到 C++ 插槽

】无法将Qml信号连接到C++插槽【英文标题】:FailToConnectQmlsignaltoC++Slot【发布时间】:2018-06-0701:54:53【问题描述】:我一直在尝试在Qml文件和c++之间连接信号,但c++中的公共插槽似乎没有接收到信号。我的程序可能有什么问题?ma... 查看详情

无法在服务器上验证 android 应用内订阅

...以从我的测试设备购买订阅,但无法验证purchaseToken我从应用程序中获得的服务器上的购买状态A 查看详情

无法在我的反应本机应用程序中清理订阅

】无法在我的反应本机应用程序中清理订阅【英文标题】:Unabletocleanupsubscriptioninmyreactnativeapp【发布时间】:2022-01-2102:09:54【问题描述】:在我的react本机应用程序中,我在useEffect挂钩中订阅了CartProduct数据模型,并使用返回函... 查看详情

iOS 应用内订阅 - “此应用无法提供营销选择加入激励”[关闭]

...【发布时间】:2012-10-0208:47:27【问题描述】:我们的一个应用程序提供IAP、一些消耗品和一些自动续订订阅。当尝试添加(或修改现有的)自动更新订阅时,iTunesC 查看详情

IBM Workilght 6.0 - 注销后无法订阅推送通知

...09:06:06【问题描述】:我在使用Android环境的基于Worklight的应用程序中遇到订阅问题。第一次,当应用程序进行订阅时,一切正常,但是当取消订阅并注销然后尝试再次登录并再次订阅用户时,事情就出错了。通 查看详情

在 Relay Modern 中使用订阅时,“更新程序”无法正常工作

...ern【发布时间】:2017-11-2620:42:52【问题描述】:我在我的应用程序中使用RelayModern,并已使用requestSubscription函数成功集成订阅。一切正常,我用来更新缓存的updater函数会被正确的订阅负载 查看详情

QML 通过 Stackview 导航;信号槽可以吗?

...间】:2019-12-0215:08:24【问题描述】:我想构建一个简单的应用程序,我可以在其中通过SignalSlot切换表单(或页面)。我将Stackview用于我的应用程序的框架。我无法将ui.qml(或.qml文件)中的信号连接到main.qml中的插槽main.q 查看详情

无法访问位于同一目录中的 QML 单例

】无法访问位于同一目录中的QML单例【英文标题】:CannotaccessQMLsingletonresidinginsamedir【发布时间】:2017-07-0606:24:52【问题描述】:我收到此错误:qrc:/qml/Accessor.qml:5:ReferenceError:MySingleton未定义我的项目结构:|main.cpp|main.qml|qml/+---Ac... 查看详情