【发布时间】:2019-11-22 18:01:01
【问题描述】:
我正在使用 ROS 为多机器人系统开发 GUI,但我在界面中最不想做的事情是冻结:在我的应用程序中嵌入 RVIZ、GMAPPING 或其他屏幕。我已经在界面中放置了一个终端,但我无法解决如何将外部应用程序窗口添加到我的应用程序。我知道 PyQt5 有 createWindowContainer,它使用窗口 ID 来停靠外部应用程序,但我没有找到任何示例来帮助我。
如果可能,我想在我的应用程序的选项卡式框架内拖放一个外部窗口。但是,如果这是不可能的或太难了,我可以在单击按钮后仅在选项卡式框架内打开窗口。
我已经尝试打开类似于终端方法的窗口(参见下面的代码),但 RVIZ 窗口在我的应用程序之外打开。
已经尝试使用 wmctrl 命令将attaching/detaching code 代码翻译到 linux,但没有成功。见my code here。
也已经尝试过rviz Python Tutorial,但我收到了错误:
Traceback(最近一次调用最后一次): 文件“rvizTutorial.py”,第 23 行,在 导入rviz 文件“/opt/ros/indigo/lib/python2.7/dist-packages/rviz/init.py”,第 19 行,在 导入 librviz_shiboken ImportError:没有名为 librviz_shiboken 的模块
# Frame where i want to open the external Window embedded
self.Simulation = QtWidgets.QTabWidget(self.Base)
self.Simulation.setGeometry(QtCore.QRect(121, 95, 940, 367))
self.Simulation.setTabPosition(QtWidgets.QTabWidget.North)
self.Simulation.setObjectName("Simulation")
self.SimulationFrame = QtWidgets.QWidget()
self.SimulationFrame.setObjectName("SimulationFrame")
self.Simulation.addTab(rviz(), "rViz")
# Simulation Approach like Terminal
class rviz(QtWidgets.QWidget):
def __init__(self, parent=None):
super(rviz, self).__init__(parent)
self.process = QtCore.QProcess(self)
self.rvizProcess = QtWidgets.QWidget(self)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.rvizProcess)
# Works also with urxvt:
self.process.start('rViz', [str(int(self.winId()))])
self.setGeometry(121, 95, 940, 367)
【问题讨论】:
-
我曾将外来窗口嵌入到 Qt 小部件中,我不得不警告你:这是一团糟。您必须面对库版本、python 模块不一致以及最重要的窗口管理器 X11 实现问题;您还需要同时使用 Qt 和 GTK python 绑定。 但是。如果您的程序要在“受限”环境中运行(如“始终使用相同的 wm 和几乎相同的 python 模块配置”),那么有一条出路:您只需要弄清楚您的环境并确保它是持久的。如果您可以向我们提供更多相关信息,我很乐意为您提供帮助。
-
感谢您的回复!是的,我的程序将在“受限”环境中运行。我只会在 Ubuntu 14.04 和 ROS Indigo 上使用 Python 2.7。即使我换了电脑,模块配置也是一样的。您需要什么信息?
标签: python qt ubuntu pyqt5 ros