summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorDenis Shienkov <scapig@yandex.ru>2012-03-29 18:28:35 +0400
committerDenis Shienkov <scapig@yandex.ru>2012-03-29 18:41:06 +0200
commit87d58ae911d8e24e8b8f5c97c76b05071a725e7b (patch)
treea960c020fb71511970bcc076a43d7aab6a4997c2 /examples
parent28cc50d4f4af43114a05a543b6ce7326ea0c0c1a (diff)
Added simple GUI terminal example.
Change-Id: Ic68be9d0c007dfd142deef37ab931f4b68f1f692 Reviewed-by: Sergey Belyashov <Sergey.Belyashov@gmail.com> Reviewed-by: Denis Shienkov <scapig@yandex.ru>
Diffstat (limited to 'examples')
-rw-r--r--examples/EMPTYFILE0
-rw-r--r--examples/examples.pro3
-rw-r--r--examples/terminal/console.cpp56
-rw-r--r--examples/terminal/console.h26
-rw-r--r--examples/terminal/images/clear.pngbin0 -> 12543 bytes
-rw-r--r--examples/terminal/images/connect.pngbin0 -> 15374 bytes
-rw-r--r--examples/terminal/images/disconnect.pngbin0 -> 15092 bytes
-rw-r--r--examples/terminal/images/settings.pngbin0 -> 16039 bytes
-rw-r--r--examples/terminal/main.cpp10
-rw-r--r--examples/terminal/mainwindow.cpp111
-rw-r--r--examples/terminal/mainwindow.h46
-rw-r--r--examples/terminal/mainwindow.ui133
-rw-r--r--examples/terminal/settingsdialog.cpp125
-rw-r--r--examples/terminal/settingsdialog.h51
-rw-r--r--examples/terminal/settingsdialog.ui151
-rw-r--r--examples/terminal/terminal.pro23
-rw-r--r--examples/terminal/terminal.qrc8
17 files changed, 743 insertions, 0 deletions
diff --git a/examples/EMPTYFILE b/examples/EMPTYFILE
deleted file mode 100644
index e69de29b..00000000
--- a/examples/EMPTYFILE
+++ /dev/null
diff --git a/examples/examples.pro b/examples/examples.pro
new file mode 100644
index 00000000..9a207e52
--- /dev/null
+++ b/examples/examples.pro
@@ -0,0 +1,3 @@
+TEMPLATE = subdirs
+CONFIG += ordered
+SUBDIRS = terminal
diff --git a/examples/terminal/console.cpp b/examples/terminal/console.cpp
new file mode 100644
index 00000000..a813687b
--- /dev/null
+++ b/examples/terminal/console.cpp
@@ -0,0 +1,56 @@
+#include "console.h"
+
+#include <QtWidgets/QScrollBar>
+
+#include <QtCore/QDebug>
+
+Console::Console(QWidget *parent) :
+ QPlainTextEdit(parent)
+{
+ document()->setMaximumBlockCount(100);
+ QPalette p = palette();
+ p.setColor(QPalette::Base, Qt::black);
+ p.setColor(QPalette::Text, Qt::green);
+ setPalette(p);
+
+}
+
+void Console::putData(const QByteArray &data)
+{
+ insertPlainText(QString(data));
+
+ QScrollBar *bar = verticalScrollBar();
+ bar->setValue(bar->maximum());
+}
+
+void Console::keyPressEvent(QKeyEvent *e)
+{
+ switch (e->key()) {
+ case Qt::Key_Backspace:
+ case Qt::Key_Left:
+ case Qt::Key_Right:
+ case Qt::Key_Up:
+ case Qt::Key_Down:
+ // skip processing
+ break;
+ default:
+ QPlainTextEdit::keyPressEvent(e);
+ emit getData(e->text().toLocal8Bit());
+ }
+}
+
+void Console::mousePressEvent(QMouseEvent *e)
+{
+ Q_UNUSED(e)
+ setFocus();
+}
+
+void Console::mouseDoubleClickEvent(QMouseEvent *e)
+{
+ Q_UNUSED(e)
+}
+
+void Console::contextMenuEvent(QContextMenuEvent *e)
+{
+ Q_UNUSED(e)
+}
diff --git a/examples/terminal/console.h b/examples/terminal/console.h
new file mode 100644
index 00000000..92100b1a
--- /dev/null
+++ b/examples/terminal/console.h
@@ -0,0 +1,26 @@
+#ifndef CONSOLE_H
+#define CONSOLE_H
+
+#include <QtWidgets/QPlainTextEdit>
+
+class Console : public QPlainTextEdit
+{
+ Q_OBJECT
+
+signals:
+ void getData(const QByteArray &data);
+
+public:
+ explicit Console(QWidget *parent = 0);
+
+ void putData(const QByteArray &data);
+
+protected:
+ virtual void keyPressEvent(QKeyEvent *e);
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseDoubleClickEvent(QMouseEvent *e);
+ virtual void contextMenuEvent(QContextMenuEvent *e);
+
+};
+
+#endif // CONSOLE_H
diff --git a/examples/terminal/images/clear.png b/examples/terminal/images/clear.png
new file mode 100644
index 00000000..aa612f1f
--- /dev/null
+++ b/examples/terminal/images/clear.png
Binary files differ
diff --git a/examples/terminal/images/connect.png b/examples/terminal/images/connect.png
new file mode 100644
index 00000000..dd5a51e9
--- /dev/null
+++ b/examples/terminal/images/connect.png
Binary files differ
diff --git a/examples/terminal/images/disconnect.png b/examples/terminal/images/disconnect.png
new file mode 100644
index 00000000..fd58f7a4
--- /dev/null
+++ b/examples/terminal/images/disconnect.png
Binary files differ
diff --git a/examples/terminal/images/settings.png b/examples/terminal/images/settings.png
new file mode 100644
index 00000000..3d1042e2
--- /dev/null
+++ b/examples/terminal/images/settings.png
Binary files differ
diff --git a/examples/terminal/main.cpp b/examples/terminal/main.cpp
new file mode 100644
index 00000000..bf5d1f94
--- /dev/null
+++ b/examples/terminal/main.cpp
@@ -0,0 +1,10 @@
+#include <QtWidgets/QApplication>
+#include "mainwindow.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow w;
+ w.show();
+ return a.exec();
+}
diff --git a/examples/terminal/mainwindow.cpp b/examples/terminal/mainwindow.cpp
new file mode 100644
index 00000000..0de3ace0
--- /dev/null
+++ b/examples/terminal/mainwindow.cpp
@@ -0,0 +1,111 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include "console.h"
+#include "settingsdialog.h"
+
+#include <QtWidgets/QMessageBox>
+#include <QtAddOnSerialPort/serialport.h>
+
+MainWindow::MainWindow(QWidget *parent) :
+ QMainWindow(parent),
+ ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+ console = new Console;
+ console->setEnabled(false);
+ setCentralWidget(console);
+
+ serial = new SerialPort(this);
+ settings = new SettingsDialog;
+
+ ui->actionConnect->setEnabled(true);
+ ui->actionDisconnect->setEnabled(false);
+ ui->actionConfigure->setEnabled(true);
+
+ initActionsConnections();
+
+ connect(serial, SIGNAL(readyRead()), this, SLOT(readData()));
+ connect(console, SIGNAL(getData(QByteArray)), this, SLOT(writeData(QByteArray)));
+}
+
+MainWindow::~MainWindow()
+{
+ delete settings;
+ delete ui;
+}
+
+void MainWindow::open()
+{
+ SettingsDialog::Settings p = settings->settings();
+ serial->setPort(p.name);
+ if (serial->open(QIODevice::ReadWrite)) {
+ if (serial->setRate(p.rate)
+ && serial->setDataBits(p.dataBits)
+ && serial->setParity(p.parity)
+ && serial->setStopBits(p.stopBits)
+ && serial->setFlowControl(p.flowcontrol)) {
+
+ console->setEnabled(true);
+ ui->actionConnect->setEnabled(false);
+ ui->actionDisconnect->setEnabled(true);
+ ui->actionConfigure->setEnabled(false);
+ ui->statusBar->showMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
+ .arg(p.name).arg(p.stringRate).arg(p.stringDataBits)
+ .arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl));
+
+ } else {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Can't configure the serial port: %1,\n"
+ "error code: %2")
+ .arg(p.name).arg(serial->error()));
+
+ ui->statusBar->showMessage(tr("Open error"));
+ }
+ } else {
+ QMessageBox::critical(this, tr("Error"),
+ tr("Can't opened the serial port: %1,\n"
+ "error code: %2")
+ .arg(p.name).arg(serial->error()));
+
+ ui->statusBar->showMessage(tr("Configure error"));
+ }
+}
+
+void MainWindow::close()
+{
+ serial->close();
+ console->setEnabled(false);
+ ui->actionConnect->setEnabled(true);
+ ui->actionDisconnect->setEnabled(false);
+ ui->actionConfigure->setEnabled(true);
+ ui->statusBar->showMessage(tr("Disconnected"));
+}
+
+void MainWindow::about()
+{
+ QMessageBox::about(this, tr("About Simple Terminal"),
+ tr("The <b>Simple Terminal</b> example demonstrates how to "
+ "use the QtSerialPort module in modern GUI applications "
+ "using Qt, with a menu bar, toolbars, and a status bar."));
+}
+
+void MainWindow::writeData(const QByteArray &data)
+{
+ serial->write(data);
+}
+
+void MainWindow::readData()
+{
+ QByteArray data = serial->readAll();
+ console->putData(data);
+}
+
+void MainWindow::initActionsConnections()
+{
+ connect(ui->actionConnect, SIGNAL(triggered()), this, SLOT(open()));
+ connect(ui->actionDisconnect, SIGNAL(triggered()), this, SLOT(close()));
+ connect(ui->actionConfigure, SIGNAL(triggered()), settings, SLOT(show()));
+ connect(ui->actionClear, SIGNAL(triggered()), console, SLOT(clear()));
+ connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(about()));
+ connect(ui->actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
+}
diff --git a/examples/terminal/mainwindow.h b/examples/terminal/mainwindow.h
new file mode 100644
index 00000000..29ed8327
--- /dev/null
+++ b/examples/terminal/mainwindow.h
@@ -0,0 +1,46 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QtWidgets/QMainWindow>
+
+#include <QtAddOnSerialPort/serialport-global.h>
+
+namespace Ui {
+class MainWindow;
+}
+
+class Console;
+class SettingsDialog;
+
+QT_BEGIN_NAMESPACE_SERIALPORT
+class SerialPort;
+QT_END_NAMESPACE_SERIALPORT
+
+QT_USE_NAMESPACE_SERIALPORT
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+private slots:
+ void open();
+ void close();
+ void about();
+ void writeData(const QByteArray &data);
+ void readData();
+
+private:
+ void initActionsConnections();
+
+private:
+ Ui::MainWindow *ui;
+ Console *console;
+ SettingsDialog *settings;
+ SerialPort *serial;
+};
+
+#endif // MAINWINDOW_H
diff --git a/examples/terminal/mainwindow.ui b/examples/terminal/mainwindow.ui
new file mode 100644
index 00000000..7e65b419
--- /dev/null
+++ b/examples/terminal/mainwindow.ui
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Simple Terminal</string>
+ </property>
+ <widget class="QWidget" name="centralWidget">
+ <layout class="QVBoxLayout" name="verticalLayout"/>
+ </widget>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>19</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuCalls">
+ <property name="title">
+ <string>Calls</string>
+ </property>
+ <addaction name="actionConnect"/>
+ <addaction name="actionDisconnect"/>
+ </widget>
+ <widget class="QMenu" name="menuTools">
+ <property name="title">
+ <string>Tools</string>
+ </property>
+ <addaction name="actionConfigure"/>
+ <addaction name="actionClear"/>
+ </widget>
+ <widget class="QMenu" name="menuHelp">
+ <property name="title">
+ <string>Help</string>
+ </property>
+ <addaction name="actionAbout"/>
+ <addaction name="actionAboutQt"/>
+ </widget>
+ <addaction name="menuCalls"/>
+ <addaction name="menuTools"/>
+ <addaction name="menuHelp"/>
+ </widget>
+ <widget class="QToolBar" name="mainToolBar">
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ <addaction name="actionConnect"/>
+ <addaction name="actionDisconnect"/>
+ <addaction name="actionConfigure"/>
+ <addaction name="actionClear"/>
+ </widget>
+ <widget class="QStatusBar" name="statusBar"/>
+ <action name="actionAbout">
+ <property name="text">
+ <string>About</string>
+ </property>
+ <property name="toolTip">
+ <string>About program</string>
+ </property>
+ </action>
+ <action name="actionAboutQt">
+ <property name="text">
+ <string>About Qt</string>
+ </property>
+ </action>
+ <action name="actionConnect">
+ <property name="icon">
+ <iconset resource="terminal.qrc">
+ <normaloff>:/images/connect.png</normaloff>:/images/connect.png</iconset>
+ </property>
+ <property name="text">
+ <string>Connect</string>
+ </property>
+ <property name="toolTip">
+ <string>Connect to serial port</string>
+ </property>
+ </action>
+ <action name="actionDisconnect">
+ <property name="icon">
+ <iconset resource="terminal.qrc">
+ <normaloff>:/images/disconnect.png</normaloff>:/images/disconnect.png</iconset>
+ </property>
+ <property name="text">
+ <string>Disconnect</string>
+ </property>
+ <property name="toolTip">
+ <string>Disconnect from serial port</string>
+ </property>
+ </action>
+ <action name="actionConfigure">
+ <property name="icon">
+ <iconset resource="terminal.qrc">
+ <normaloff>:/images/settings.png</normaloff>:/images/settings.png</iconset>
+ </property>
+ <property name="text">
+ <string>Configure</string>
+ </property>
+ <property name="toolTip">
+ <string>Configure serial port</string>
+ </property>
+ </action>
+ <action name="actionClear">
+ <property name="icon">
+ <iconset resource="terminal.qrc">
+ <normaloff>:/images/clear.png</normaloff>:/images/clear.png</iconset>
+ </property>
+ <property name="text">
+ <string>Clear</string>
+ </property>
+ <property name="toolTip">
+ <string>Clear data</string>
+ </property>
+ </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources>
+ <include location="terminal.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/examples/terminal/settingsdialog.cpp b/examples/terminal/settingsdialog.cpp
new file mode 100644
index 00000000..08529d87
--- /dev/null
+++ b/examples/terminal/settingsdialog.cpp
@@ -0,0 +1,125 @@
+#include "settingsdialog.h"
+#include "ui_settingsdialog.h"
+
+#include <QtAddOnSerialPort/serialportinfo.h>
+
+SettingsDialog::SettingsDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::SettingsDialog)
+{
+ ui->setupUi(this);
+
+ connect(ui->applyButton, SIGNAL(clicked()),
+ this, SLOT(apply()));
+ connect(ui->portsBox, SIGNAL(currentIndexChanged(int)),
+ this, SLOT(showPortInfo(int)));
+
+ fillPortsParameters();
+ fillPortsInfo();
+
+ updateSettings();
+}
+
+SettingsDialog::~SettingsDialog()
+{
+ delete ui;
+}
+
+SettingsDialog::Settings SettingsDialog::settings() const
+{
+ return currentSettings;
+}
+
+void SettingsDialog::showPortInfo(int idx)
+{
+ if (idx != -1) {
+ QStringList list = ui->portsBox->itemData(idx).toStringList();
+ ui->descriptionLabel->setText(tr("Description: %1").arg(list.at(1)));
+ ui->manufacturerLabel->setText(tr("Manufacturer: %1").arg(list.at(2)));
+ ui->locationLabel->setText(tr("Location: %1").arg(list.at(3)));
+ }
+}
+
+void SettingsDialog::apply()
+{
+ updateSettings();
+ hide();
+}
+
+void SettingsDialog::fillPortsParameters()
+{
+ // fill baud rate (is not the entire list of available values,
+ // desired values??, add your independently)
+ ui->rateBox->addItem(QLatin1String("9600"), 9600);
+ ui->rateBox->addItem(QLatin1String("19200"), 19200);
+ ui->rateBox->addItem(QLatin1String("38400"), 38400);
+ ui->rateBox->addItem(QLatin1String("115200"), 115200);
+ ui->rateBox->addItem(QLatin1String("115200"), 115200);
+
+ // fill data bits
+ ui->dataBitsBox->addItem(QLatin1String("5"), static_cast<int>(SerialPort::Data5));
+ ui->dataBitsBox->addItem(QLatin1String("6"), static_cast<int>(SerialPort::Data6));
+ ui->dataBitsBox->addItem(QLatin1String("7"), static_cast<int>(SerialPort::Data7));
+ ui->dataBitsBox->addItem(QLatin1String("8"), static_cast<int>(SerialPort::Data8));
+
+ // fill parity
+ ui->parityBox->addItem(QLatin1String("None"), static_cast<int>(SerialPort::NoParity));
+ ui->parityBox->addItem(QLatin1String("Even"), static_cast<int>(SerialPort::EvenParity));
+ ui->parityBox->addItem(QLatin1String("Odd"), static_cast<int>(SerialPort::OddParity));
+ ui->parityBox->addItem(QLatin1String("Mark"), static_cast<int>(SerialPort::MarkParity));
+ ui->parityBox->addItem(QLatin1String("Space"), static_cast<int>(SerialPort::SpaceParity));
+
+ // fill stop bits
+ ui->stopBitsBox->addItem(QLatin1String("1"), static_cast<int>(SerialPort::OneStop));
+#if defined (Q_OS_WIN)
+ ui->stopBitsBox->addItem(QLatin1String("1.5"), static_cast<int>(SerialPort::OneAndHalfStop));
+#endif
+ ui->stopBitsBox->addItem(QLatin1String("2"), static_cast<int>(SerialPort::TwoStop));
+
+ // fill flow control
+ ui->flowControlBox->addItem(QLatin1String("None"), static_cast<int>(SerialPort::NoFlowControl));
+ ui->flowControlBox->addItem(QLatin1String("RTS/CTS"), static_cast<int>(SerialPort::HardwareControl));
+ ui->flowControlBox->addItem(QLatin1String("XON/XOFF"), static_cast<int>(SerialPort::SoftwareControl));
+}
+
+void SettingsDialog::fillPortsInfo()
+{
+ ui->portsBox->clear();
+ foreach (const SerialPortInfo &info, SerialPortInfo::availablePorts()) {
+ QStringList list;
+ list << info.portName() << info.description()
+ << info.manufacturer() << info.systemLocation();
+
+ ui->portsBox->addItem(list.at(0), list);
+ }
+}
+
+void SettingsDialog::updateSettings()
+{
+ currentSettings.name = ui->portsBox->currentText();
+
+ // Rate
+ currentSettings.rate = static_cast<SerialPort::Rate>(
+ ui->rateBox->itemData(ui->rateBox->currentIndex()).toInt());
+ currentSettings.stringRate = QString::number(currentSettings.rate);
+
+ // Data bits
+ currentSettings.dataBits = static_cast<SerialPort::DataBits>(
+ ui->dataBitsBox->itemData(ui->dataBitsBox->currentIndex()).toInt());
+ currentSettings.stringDataBits = ui->dataBitsBox->currentText();
+
+ // Parity
+ currentSettings.parity = static_cast<SerialPort::Parity>(
+ ui->parityBox->itemData(ui->parityBox->currentIndex()).toInt());
+ currentSettings.stringParity = ui->parityBox->currentText();
+
+ // Stop bits
+ currentSettings.stopBits = static_cast<SerialPort::StopBits>(
+ ui->stopBitsBox->itemData(ui->stopBitsBox->currentIndex()).toInt());
+ currentSettings.stringStopBits = ui->stopBitsBox->currentText();
+
+ // Flow control
+ currentSettings.flowcontrol = static_cast<SerialPort::FlowControl>(
+ ui->flowControlBox->itemData(ui->flowControlBox->currentIndex()).toInt());
+ currentSettings.stringFlowControl = ui->flowControlBox->currentText();
+}
diff --git a/examples/terminal/settingsdialog.h b/examples/terminal/settingsdialog.h
new file mode 100644
index 00000000..2134f5d1
--- /dev/null
+++ b/examples/terminal/settingsdialog.h
@@ -0,0 +1,51 @@
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include <QtWidgets/QDialog>
+#include <QtAddOnSerialPort/serialport.h>
+
+namespace Ui {
+class SettingsDialog;
+}
+
+QT_USE_NAMESPACE_SERIALPORT
+
+class SettingsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ struct Settings {
+ QString name;
+ qint32 rate;
+ QString stringRate;
+ SerialPort::DataBits dataBits;
+ QString stringDataBits;
+ SerialPort::Parity parity;
+ QString stringParity;
+ SerialPort::StopBits stopBits;
+ QString stringStopBits;
+ SerialPort::FlowControl flowcontrol;
+ QString stringFlowControl;
+ };
+
+ explicit SettingsDialog(QWidget *parent = 0);
+ ~SettingsDialog();
+
+ Settings settings() const;
+
+private slots:
+ void showPortInfo(int idx);
+ void apply();
+
+private:
+ void fillPortsParameters();
+ void fillPortsInfo();
+ void updateSettings();
+
+private:
+ Ui::SettingsDialog *ui;
+ Settings currentSettings;
+};
+
+#endif // SETTINGSDIALOG_H
diff --git a/examples/terminal/settingsdialog.ui b/examples/terminal/settingsdialog.ui
new file mode 100644
index 00000000..d88f2ea7
--- /dev/null
+++ b/examples/terminal/settingsdialog.ui
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SettingsDialog</class>
+ <widget class="QDialog" name="SettingsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>280</width>
+ <height>206</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QGroupBox" name="selectBox">
+ <property name="title">
+ <string>Select Serial Port</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QComboBox" name="portsBox"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="descriptionLabel">
+ <property name="text">
+ <string>Description:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="manufacturerLabel">
+ <property name="text">
+ <string>Manufacturer:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="locationLabel">
+ <property name="text">
+ <string>Location:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="vidLabel">
+ <property name="text">
+ <string>Vid:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="pidLabel">
+ <property name="text">
+ <string>Pid:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QGroupBox" name="parametersBox">
+ <property name="title">
+ <string>Select Parameters</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="rateLabel">
+ <property name="text">
+ <string>Rate:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="rateBox"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="dataBitsLabel">
+ <property name="text">
+ <string>Data bits:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QComboBox" name="dataBitsBox"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="parityLabel">
+ <property name="text">
+ <string>Parity:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QComboBox" name="parityBox"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="stopBitsLabel">
+ <property name="text">
+ <string>Stop bits:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QComboBox" name="stopBitsBox"/>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="flowControlLabel">
+ <property name="text">
+ <string>Flow control:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QComboBox" name="flowControlBox"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>96</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="applyButton">
+ <property name="text">
+ <string>Apply</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/terminal/terminal.pro b/examples/terminal/terminal.pro
new file mode 100644
index 00000000..8660b80d
--- /dev/null
+++ b/examples/terminal/terminal.pro
@@ -0,0 +1,23 @@
+QT += widgets serialport
+
+TARGET = terminal
+TEMPLATE = app
+
+
+SOURCES += \
+ main.cpp \
+ mainwindow.cpp \
+ settingsdialog.cpp \
+ console.cpp
+
+HEADERS += \
+ mainwindow.h \
+ settingsdialog.h \
+ console.h
+
+FORMS += \
+ mainwindow.ui \
+ settingsdialog.ui
+
+RESOURCES += \
+ terminal.qrc
diff --git a/examples/terminal/terminal.qrc b/examples/terminal/terminal.qrc
new file mode 100644
index 00000000..5ca35d4b
--- /dev/null
+++ b/examples/terminal/terminal.qrc
@@ -0,0 +1,8 @@
+<RCC>
+ <qresource prefix="/">
+ <file>images/connect.png</file>
+ <file>images/disconnect.png</file>
+ <file>images/settings.png</file>
+ <file>images/clear.png</file>
+ </qresource>
+</RCC>