Skip to content

Instantly share code, notes, and snippets.

@mdrx-io
Created March 30, 2018 23:16
Show Gist options
  • Save mdrx-io/aad22fc485b0f288eeb1400ab3a6cd73 to your computer and use it in GitHub Desktop.
Save mdrx-io/aad22fc485b0f288eeb1400ab3a6cd73 to your computer and use it in GitHub Desktop.
ros-in-qt-example
#!/usr/bin/env python
import sys
from threading import Thread
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import (
QApplication,
QDialog,
QDialogButtonBox,
QFormLayout,
QGroupBox,
QLabel,
QLineEdit,
QMenu,
QMenuBar,
QVBoxLayout
)
import rospy
from std_msgs.msg import String
class RosManager(QThread):
def __init__(self, signals):
QThread.__init__(self)
self.signals = signals
def callback(self, msg):
print msg.data
if msg.data == "foo":
self.signals["foo"].emit(msg.data)
elif msg.data == "bar":
self.signals["bar"].emit(msg.data)
def run(self):
rospy.init_node("listener", anonymous=True, disable_signals=True)
rospy.Subscriber("chatter", String, self.callback)
while not rospy.is_shutdown():
pass
rospy.spin()
class Dialog(QDialog):
foo_signal = pyqtSignal(str)
bar_signal = pyqtSignal(str)
def __init__(self):
super(Dialog, self).__init__()
self.create_menu()
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(self.accept)
button_box.rejected.connect(self.reject)
self.create_foo_bar_group()
main_layout = QVBoxLayout()
main_layout.setMenuBar(self.menu_bar)
main_layout.addWidget(self.foo_bar_group)
main_layout.addWidget(button_box)
self.setLayout(main_layout)
self.setWindowTitle("ROS In QT Example")
self.foo_signal.connect(self.update_foo_line)
self.bar_signal.connect(self.update_bar_line)
def create_foo_bar_group(self):
self.foo_bar_group = QGroupBox("Foo Bar")
layout = QFormLayout()
self.foo_line = QLineEdit()
self.bar_line = QLineEdit()
layout.addRow(QLabel("Foo:"), self.foo_line)
layout.addRow(QLabel("Bar:"), self.bar_line)
self.foo_bar_group.setLayout(layout)
def create_menu(self):
self.menu_bar = QMenuBar()
self.file_menu = QMenu("&File", self)
self.exit_action = self.file_menu.addAction("E&xit")
self.menu_bar.addMenu(self.file_menu)
self.exit_action.triggered.connect(self.accept)
def update_foo_line(self, msg_data):
self.foo_line.setText(msg_data)
def update_bar_line(self, msg_data):
self.bar_line.setText(msg_data)
def get_signals(self):
return {'foo': self.foo_signal, 'bar': self.bar_signal}
if __name__ == '__main__':
app = QApplication(sys.argv)
dialog = Dialog()
signals = dialog.get_signals()
ros_mgr_thread = RosManager(signals)
ros_mgr_thread.start()
sys.exit(dialog.exec_())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment