Created
March 30, 2018 23:16
-
-
Save mdrx-io/aad22fc485b0f288eeb1400ab3a6cd73 to your computer and use it in GitHub Desktop.
ros-in-qt-example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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