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

Posted

技术标签:

【中文标题】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(qml) 应用程序无法订阅 ros 主题的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 Qt-Quick 测试

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

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

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

无法在 QML 中播放视频

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