aboutsummaryrefslogtreecommitdiffstats
path: root/examples/serialport/terminal/mainwindow.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/serialport/terminal/mainwindow.py')
-rw-r--r--examples/serialport/terminal/mainwindow.py108
1 files changed, 108 insertions, 0 deletions
diff --git a/examples/serialport/terminal/mainwindow.py b/examples/serialport/terminal/mainwindow.py
new file mode 100644
index 000000000..bdfb0fb0e
--- /dev/null
+++ b/examples/serialport/terminal/mainwindow.py
@@ -0,0 +1,108 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import QIODeviceBase, Slot
+from PySide6.QtWidgets import QLabel, QMainWindow, QMessageBox
+from PySide6.QtSerialPort import QSerialPort
+
+from ui_mainwindow import Ui_MainWindow
+from console import Console
+from settingsdialog import SettingsDialog
+
+
+HELP = """The <b>Simple Terminal</b> example demonstrates how to
+ use the Qt Serial Port module in modern GUI applications
+ using Qt, with a menu bar, toolbars, and a status bar."""
+
+
+def description(s):
+ return (f"Connected to {s.name} : {s.string_baud_rate}, "
+ f"{s.string_data_bits}, {s.string_parity}, {s.string_stop_bits}, "
+ f"{s.string_flow_control}")
+
+
+class MainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.m_ui = Ui_MainWindow()
+ self.m_status = QLabel()
+ self.m_console = Console()
+ self.m_settings = SettingsDialog(self)
+ self.m_serial = QSerialPort(self)
+ self.m_ui.setupUi(self)
+ self.m_console.setEnabled(False)
+ self.setCentralWidget(self.m_console)
+
+ self.m_ui.actionConnect.setEnabled(True)
+ self.m_ui.actionDisconnect.setEnabled(False)
+ self.m_ui.actionQuit.setEnabled(True)
+ self.m_ui.actionConfigure.setEnabled(True)
+
+ self.m_ui.statusBar.addWidget(self.m_status)
+
+ self.m_ui.actionConnect.triggered.connect(self.open_serial_port)
+ self.m_ui.actionDisconnect.triggered.connect(self.close_serial_port)
+ self.m_ui.actionQuit.triggered.connect(self.close)
+ self.m_ui.actionConfigure.triggered.connect(self.m_settings.show)
+ self.m_ui.actionClear.triggered.connect(self.m_console.clear)
+ self.m_ui.actionAbout.triggered.connect(self.about)
+ self.m_ui.actionAboutQt.triggered.connect(qApp.aboutQt) # noqa: F821
+
+ self.m_serial.errorOccurred.connect(self.handle_error)
+ self.m_serial.readyRead.connect(self.read_data)
+ self.m_console.get_data.connect(self.write_data)
+
+ @Slot()
+ def open_serial_port(self):
+ s = self.m_settings.settings()
+ self.m_serial.setPortName(s.name)
+ self.m_serial.setBaudRate(s.baud_rate)
+ self.m_serial.setDataBits(s.data_bits)
+ self.m_serial.setParity(s.parity)
+ self.m_serial.setStopBits(s.stop_bits)
+ self.m_serial.setFlowControl(s.flow_control)
+ if self.m_serial.open(QIODeviceBase.ReadWrite):
+ self.m_console.setEnabled(True)
+ self.m_console.set_local_echo_enabled(s.local_echo_enabled)
+ self.m_ui.actionConnect.setEnabled(False)
+ self.m_ui.actionDisconnect.setEnabled(True)
+ self.m_ui.actionConfigure.setEnabled(False)
+ self.show_status_message(description(s))
+ else:
+ QMessageBox.critical(self, "Error", self.m_serial.errorString())
+ self.show_status_message("Open error")
+
+ @Slot()
+ def close_serial_port(self):
+ if self.m_serial.isOpen():
+ self.m_serial.close()
+ self.m_console.setEnabled(False)
+ self.m_ui.actionConnect.setEnabled(True)
+ self.m_ui.actionDisconnect.setEnabled(False)
+ self.m_ui.actionConfigure.setEnabled(True)
+ self.show_status_message("Disconnected")
+
+ @Slot()
+ def about(self):
+ QMessageBox.about(self, "About Simple Terminal", HELP)
+
+ @Slot(bytearray)
+ def write_data(self, data):
+ self.m_serial.write(data)
+
+ @Slot()
+ def read_data(self):
+ data = self.m_serial.readAll()
+ self.m_console.put_data(data.data())
+
+ @Slot(QSerialPort.SerialPortError)
+ def handle_error(self, error):
+ if error == QSerialPort.ResourceError:
+ QMessageBox.critical(self, "Critical Error",
+ self.m_serial.errorString())
+ self.close_serial_port()
+
+ @Slot(str)
+ def show_status_message(self, message):
+ self.m_status.setText(message)