From 6b2a79f94b760340746d2a59a7bc1ef07848de21 Mon Sep 17 00:00:00 2001 From: gztss <2269610337@qq.com> Date: Fri, 7 Sep 2018 15:36:16 +0800 Subject: [PATCH] Code cleanup and refactoring. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 以面向对象思想重构了大部分代码。 --- SerialTool/SerialTool.pro | 95 +-- SerialTool/include/controller.h | 46 ++ SerialTool/include/mainwindow.h | 44 +- SerialTool/include/portsetbox.h | 1 - SerialTool/include/valuedisplay.h | 24 - SerialTool/include/vediobox.h | 32 - SerialTool/include/version.h | 4 +- SerialTool/language/serialtool_zh_CN.ts | 326 +++++---- SerialTool/language/zh_cn/serialtool.qm | Bin 9837 -> 9728 bytes SerialTool/resource/default.ini | 18 +- SerialTool/resource/images/clear.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/close.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/config.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/connect.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/exit.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/open.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/pause.ico | Bin 454 -> 678 bytes SerialTool/resource/images/port config.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/save.ico | Bin 3606 -> 5342 bytes SerialTool/resource/images/start.ico | Bin 3606 -> 5342 bytes SerialTool/source/mainwindow.cpp | 648 ------------------ SerialTool/{source => src}/aboutbox.cpp | 8 - SerialTool/src/controller.cpp | 79 +++ SerialTool/{source => src}/defaultconfig.cpp | 0 SerialTool/{source => src}/main.cpp | 0 SerialTool/src/mainwindow.cpp | 329 +++++++++ SerialTool/{source => src}/optionsbox.cpp | 4 +- SerialTool/src/port/abstractport.h | 40 ++ SerialTool/src/port/portmanager.cpp | 112 +++ SerialTool/src/port/portmanager.h | 46 ++ .../{source => src/port}/serialport.cpp | 2 +- SerialTool/{include => src/port}/serialport.h | 18 +- .../{source => src/port}/tcpudpport.cpp | 8 +- SerialTool/{include => src/port}/tcpudpport.h | 18 +- SerialTool/{source => src}/portsetbox.cpp | 0 SerialTool/src/toolbox/abstracttoolbox.h | 39 ++ SerialTool/src/toolbox/toolboxmanager.cpp | 82 +++ SerialTool/src/toolbox/toolboxmanager.h | 34 + .../toolbox/valuedisplay}/valuedisplay.cpp | 10 +- .../src/toolbox/valuedisplay/valuedisplay.h | 33 + .../toolbox/vediobox}/vediobox.cpp | 31 +- SerialTool/src/toolbox/vediobox/vediobox.h | 41 ++ SerialTool/{source => src}/updatedialog.cpp | 8 +- SerialTool/src/views/abstractview.h | 38 + .../views/filetransmit}/filethread.cpp | 0 .../views/filetransmit}/filethread.h | 0 .../views/filetransmit}/filetransmitview.cpp | 18 +- .../views/filetransmit}/filetransmitview.h | 16 +- .../views/filetransmit}/xmodem.cpp | 0 .../views/filetransmit}/xmodem.h | 0 .../views/filetransmit}/xmodem_crc16.h | 0 .../views/oscilloscope}/channelitem.cpp | 0 .../views/oscilloscope}/channelitem.h | 0 .../views/oscilloscope/oscilloscopeview.cpp} | 142 ++-- .../views/oscilloscope/oscilloscopeview.h} | 39 +- .../views/oscilloscope}/oscopetimestamp.cpp | 17 +- .../views/oscilloscope}/oscopetimestamp.h | 0 .../views/oscilloscope}/plotview.cpp | 0 .../views/oscilloscope}/plotview.h | 2 +- .../views/oscilloscope}/pointdatabuffer.cpp | 0 .../views/oscilloscope}/pointdatabuffer.h | 0 .../views/oscilloscope}/wavedecode.cpp | 121 ++-- .../views/oscilloscope}/wavedecode.h | 31 +- .../views/terminal}/terminalview.cpp | 61 +- .../views/terminal}/terminalview.h | 29 +- .../views/terminal}/textedit.cpp | 0 .../views/terminal}/textedit.h | 0 SerialTool/src/views/viewmanager.cpp | 134 ++++ SerialTool/src/views/viewmanager.h | 43 ++ SerialTool/ui/aboutbox.ui | 3 + SerialTool/ui/mainwindow.ui | 135 +--- SerialTool/ui/optionsbox.ui | 6 +- .../{oscilloscope.ui => oscilloscopeview.ui} | 6 +- SerialTool/ui/terminalview.ui | 2 +- SerialTool/ver_temp.h | 2 +- 75 files changed, 1674 insertions(+), 1351 deletions(-) create mode 100644 SerialTool/include/controller.h delete mode 100644 SerialTool/include/valuedisplay.h delete mode 100644 SerialTool/include/vediobox.h delete mode 100644 SerialTool/source/mainwindow.cpp rename SerialTool/{source => src}/aboutbox.cpp (80%) create mode 100644 SerialTool/src/controller.cpp rename SerialTool/{source => src}/defaultconfig.cpp (100%) rename SerialTool/{source => src}/main.cpp (100%) create mode 100644 SerialTool/src/mainwindow.cpp rename SerialTool/{source => src}/optionsbox.cpp (99%) create mode 100644 SerialTool/src/port/abstractport.h create mode 100644 SerialTool/src/port/portmanager.cpp create mode 100644 SerialTool/src/port/portmanager.h rename SerialTool/{source => src/port}/serialport.cpp (99%) rename SerialTool/{include => src/port}/serialport.h (72%) rename SerialTool/{source => src/port}/tcpudpport.cpp (99%) rename SerialTool/{include => src/port}/tcpudpport.h (80%) rename SerialTool/{source => src}/portsetbox.cpp (100%) create mode 100644 SerialTool/src/toolbox/abstracttoolbox.h create mode 100644 SerialTool/src/toolbox/toolboxmanager.cpp create mode 100644 SerialTool/src/toolbox/toolboxmanager.h rename SerialTool/{source => src/toolbox/valuedisplay}/valuedisplay.cpp (92%) create mode 100644 SerialTool/src/toolbox/valuedisplay/valuedisplay.h rename SerialTool/{source => src/toolbox/vediobox}/vediobox.cpp (79%) create mode 100644 SerialTool/src/toolbox/vediobox/vediobox.h rename SerialTool/{source => src}/updatedialog.cpp (96%) create mode 100644 SerialTool/src/views/abstractview.h rename SerialTool/{source => src/views/filetransmit}/filethread.cpp (100%) rename SerialTool/{include => src/views/filetransmit}/filethread.h (100%) rename SerialTool/{source => src/views/filetransmit}/filetransmitview.cpp (94%) rename SerialTool/{include => src/views/filetransmit}/filetransmitview.h (70%) rename SerialTool/{source => src/views/filetransmit}/xmodem.cpp (100%) rename SerialTool/{include => src/views/filetransmit}/xmodem.h (100%) rename SerialTool/{include => src/views/filetransmit}/xmodem_crc16.h (100%) rename SerialTool/{source => src/views/oscilloscope}/channelitem.cpp (100%) rename SerialTool/{include => src/views/oscilloscope}/channelitem.h (100%) rename SerialTool/{source/oscilloscope.cpp => src/views/oscilloscope/oscilloscopeview.cpp} (76%) rename SerialTool/{include/oscilloscope.h => src/views/oscilloscope/oscilloscopeview.h} (70%) rename SerialTool/{source => src/views/oscilloscope}/oscopetimestamp.cpp (84%) rename SerialTool/{include => src/views/oscilloscope}/oscopetimestamp.h (100%) rename SerialTool/{source => src/views/oscilloscope}/plotview.cpp (100%) rename SerialTool/{include => src/views/oscilloscope}/plotview.h (87%) rename SerialTool/{source => src/views/oscilloscope}/pointdatabuffer.cpp (100%) rename SerialTool/{include => src/views/oscilloscope}/pointdatabuffer.h (100%) rename SerialTool/{source => src/views/oscilloscope}/wavedecode.cpp (52%) rename SerialTool/{include => src/views/oscilloscope}/wavedecode.h (58%) rename SerialTool/{source => src/views/terminal}/terminalview.cpp (89%) rename SerialTool/{include => src/views/terminal}/terminalview.h (79%) rename SerialTool/{source => src/views/terminal}/textedit.cpp (100%) rename SerialTool/{include => src/views/terminal}/textedit.h (100%) create mode 100644 SerialTool/src/views/viewmanager.cpp create mode 100644 SerialTool/src/views/viewmanager.h rename SerialTool/ui/{oscilloscope.ui => oscilloscopeview.ui} (98%) diff --git a/SerialTool/SerialTool.pro b/SerialTool/SerialTool.pro index 7dc5a0c..2e0c6c8 100644 --- a/SerialTool/SerialTool.pro +++ b/SerialTool/SerialTool.pro @@ -32,53 +32,64 @@ RC_FILE += resource/serialtool.rc INCLUDEPATH += include SOURCES += \ - source/aboutbox.cpp \ - source/channelitem.cpp \ - source/main.cpp \ - source/optionsbox.cpp \ - source/portsetbox.cpp \ - source/textedit.cpp \ - source/wavedecode.cpp \ - source/oscilloscope.cpp \ - source/filethread.cpp \ - source/xmodem.cpp \ - source/vediobox.cpp \ - source/tcpudpport.cpp \ - source/defaultconfig.cpp \ - source/oscopetimestamp.cpp \ - source/terminalview.cpp \ - source/serialport.cpp \ - source/pointdatabuffer.cpp \ - source/valuedisplay.cpp \ - source/mainwindow.cpp \ - source/filetransmitview.cpp \ - source/plotview.cpp \ - source/updatedialog.cpp + src/aboutbox.cpp \ + src/main.cpp \ + src/mainwindow.cpp \ + src/controller.cpp \ + src/optionsbox.cpp \ + src/portsetbox.cpp \ + src/defaultconfig.cpp \ + src/updatedialog.cpp \ + src/port/portmanager.cpp \ + src/port/tcpudpport.cpp \ + src/port/serialport.cpp \ + src/views/viewmanager.cpp \ + src/views/terminal/terminalview.cpp \ + src/views/terminal/textedit.cpp \ + src/views/oscilloscope/oscilloscopeview.cpp \ + src/views/oscilloscope/channelitem.cpp \ + src/views/oscilloscope/oscopetimestamp.cpp \ + src/views/oscilloscope/pointdatabuffer.cpp \ + src/views/oscilloscope/plotview.cpp \ + src/views/oscilloscope/wavedecode.cpp \ + src/views/filetransmit/filetransmitview.cpp \ + src/views/filetransmit/filethread.cpp \ + src/views/filetransmit/xmodem.cpp \ + src/toolbox/toolboxmanager.cpp \ + src/toolbox/vediobox/vediobox.cpp \ + src/toolbox/valuedisplay/valuedisplay.cpp HEADERS += \ include/aboutbox.h \ - include/channelitem.h \ + include/mainwindow.h \ + include/controller.h \ include/optionsbox.h \ include/portsetbox.h \ - include/textedit.h \ include/version.h \ - include/wavedecode.h \ - include/oscilloscope.h \ - include/filethread.h \ - include/xmodem.h \ - include/xmodem_crc16.h \ - include/vediobox.h \ - include/tcpudpport.h \ include/defaultconfig.h \ - include/oscopetimestamp.h \ - include/terminalview.h \ - include/serialport.h \ - include/pointdatabuffer.h \ - include/valuedisplay.h \ - include/mainwindow.h \ - include/filetransmitview.h \ - include/plotview.h \ - include/updatedialog.h + include/updatedialog.h \ + src/port/portmanager.h \ + src/port/abstractport.h \ + src/port/tcpudpport.h \ + src/port/serialport.h \ + src/views/viewmanager.h \ + src/views/abstractview.h \ + src/views/terminal/terminalview.h \ + src/views/terminal/textedit.h \ + src/views/oscilloscope/oscilloscopeview.h \ + src/views/oscilloscope/channelitem.h \ + src/views/oscilloscope/oscopetimestamp.h \ + src/views/oscilloscope/pointdatabuffer.h \ + src/views/oscilloscope/plotview.h \ + src/views/oscilloscope/wavedecode.h \ + src/views/filetransmit/filetransmitview.h \ + src/views/filetransmit/filethread.h \ + src/views/filetransmit/xmodem.h \ + src/views/filetransmit/xmodem_crc16.h \ + src/toolbox/toolboxmanager.h \ + src/toolbox/abstracttoolbox.h \ + src/toolbox/vediobox/vediobox.h \ + src/toolbox/valuedisplay/valuedisplay.h DISTFILES += \ resource/images/clear.png \ @@ -99,7 +110,6 @@ FORMS += \ ui/aboutbox.ui \ ui/optionsbox.ui \ ui/portsetbox.ui \ - ui/oscilloscope.ui \ ui/vediobox.ui \ ui/tcpudpport.ui \ ui/terminalview.ui \ @@ -107,6 +117,7 @@ FORMS += \ ui/serialport.ui \ ui/mainwindow.ui \ ui/filetransmitview.ui \ - ui/updatedialog.ui + ui/updatedialog.ui \ + ui/oscilloscopeview.ui LIBS += -lqscintilla2_qt5 diff --git a/SerialTool/include/controller.h b/SerialTool/include/controller.h new file mode 100644 index 0000000..09de2d7 --- /dev/null +++ b/SerialTool/include/controller.h @@ -0,0 +1,46 @@ +#ifndef CONTROLLER_H +#define CONTROLLER_H + +#include + +class QMenu; +class QAction; +class QSettings; +class QTabWidget; +class PortManager; +class ViewManager; +class ToolBoxManager; + +class Controller : public QObject +{ + Q_OBJECT +public: + explicit Controller(QString *docPath, QTabWidget *tabWidget, + QMenu *menu, QAction *openAction, QAction *saveAction); + void setPortManager(PortManager *manager); + void loadConfig(QSettings *config); + void saveConfig(QSettings *config); + void loadSettings(QSettings *config); + void retranslate(); + void setEnabled(bool enabled); + void clear(void); + void setPause(bool paused) { m_pause = paused; } + int receiveCount() { return m_rxCount; } + int transmitCount () { return m_txCount; } + void setWindowOpacity(qreal level); + +signals: + +private slots: + void readPortData(); + void writePortData(const QByteArray &array); + +private: + ViewManager *m_views; + ToolBoxManager *m_toolBoxs; + PortManager *m_port; + bool m_pause = false; + int m_rxCount = 0, m_txCount = 0; +}; + +#endif // CONTROLLER_H diff --git a/SerialTool/include/mainwindow.h b/SerialTool/include/mainwindow.h index 00aa218..b92d831 100644 --- a/SerialTool/include/mainwindow.h +++ b/SerialTool/include/mainwindow.h @@ -9,23 +9,14 @@ namespace Ui { class MainWindow; } class QSettings; -class TcpUdpPort; -class WaveDecode; -class SerialPort; -class VedioBox; -class ValueDisplay; class QTranslator; -class QActionGroup; +class PortManager; +class Controller; class MainWindow : public QMainWindow { Q_OBJECT - enum PortType { - ComPort, - NetworkPort - }; - public: MainWindow(QWidget *parent = Q_NULLPTR); ~MainWindow(); @@ -37,55 +28,36 @@ class MainWindow : public QMainWindow void setStyleSheet(const QString &string); private slots: - void tabIndexChanged(int index); - void tabActionGroupTriggered(QAction *action); void changeRunFlag(); void onSecTimerTimeout(); void openPort(); void closePort(); void onPortSwitchActionTriggered(); - void openSetPortInfoBox(); - void readPortData(); - void writePort(const QByteArray &array); - void cleanData(); - void setOptions(); + void dispPortStatus(); + void clear(); void saveFile(); void openFile(); + void setOptions(); + void onStaysOnTopTriggered(); void about(); void openWiki(); - void onVedioBoxTriggered(); - void onVedioBoxDelete(); - void onValueDisplayTriggered(); - void onValueDisplayDelete(); - void onStaysOnTopTriggered(); - void currentTabChanged(int index); - void dispPortStatus(); void updateSoftware(); private: void loadConfig(); void closeEvent(QCloseEvent *event); - bool openComPort(); - bool openTcpUdpPort(); - void loadPortTool(); - void setTabActionIndex(int index); void setWindowStaysOnTop(bool enabled); private: Ui::MainWindow *ui; QString m_docPath; QTimer m_timer; // 秒定时器 - TcpUdpPort *m_tcpUdpPort; // TCP/UDP端口 QSettings *m_config; bool m_runFlag = true; - QActionGroup *m_tabActionGroup; - int m_rxCount, m_txCount; QLabel *m_rxCntLabel, *m_txCntLabel, *m_portInfoLabel; QVector m_translator; - VedioBox *m_vedioBox = NULL; - ValueDisplay *m_valueDisplay = NULL; - PortType m_portType; - SerialPort *m_serialPort; + PortManager *m_port; + Controller *m_controller; }; #endif // __MAINWINDOW_H diff --git a/SerialTool/include/portsetbox.h b/SerialTool/include/portsetbox.h index ca01776..e8063eb 100644 --- a/SerialTool/include/portsetbox.h +++ b/SerialTool/include/portsetbox.h @@ -2,7 +2,6 @@ #define __PORTSETBOX_H #include -#include #include namespace Ui { diff --git a/SerialTool/include/valuedisplay.h b/SerialTool/include/valuedisplay.h deleted file mode 100644 index f72c62c..0000000 --- a/SerialTool/include/valuedisplay.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef VALUEDISPLAY_H -#define VALUEDISPLAY_H - -#include - -namespace Ui { -class ValueDisplay; -} - -class ValueDisplay : public QDialog -{ - Q_OBJECT - -public: - explicit ValueDisplay(QWidget *parent = 0); - ~ValueDisplay(); - void append(const QByteArray &array); - -private: - Ui::ValueDisplay *ui; - QByteArray m_array; -}; - -#endif // VALUEDISPLAY_H diff --git a/SerialTool/include/vediobox.h b/SerialTool/include/vediobox.h deleted file mode 100644 index be46643..0000000 --- a/SerialTool/include/vediobox.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef __VEDIOBOX_H -#define __VEDIOBOX_H - -#include - -namespace Ui { - class VedioBox; -} - -class VedioBox : public QDialog -{ - Q_OBJECT - -public: - VedioBox(QWidget *parent = NULL); - ~VedioBox(); - void append(const QByteArray &arr); - void setFilePath(const QString &path); - -private slots: - void saveImage(); - void copyImage(); - -private: - Ui::VedioBox *ui; - QByteArray array; - QPixmap image; - char imageData[600]; - QString filePath; -}; - -#endif diff --git a/SerialTool/include/version.h b/SerialTool/include/version.h index 29e5b87..8c37802 100644 --- a/SerialTool/include/version.h +++ b/SerialTool/include/version.h @@ -1,7 +1,7 @@ #ifndef __VERSION_H #define __VERSION_H -#define MAIN_VERSION 1.2.6 +#define MAIN_VERSION 1.3.0Beta #define SOFTWARE_NAME "SerialTool" #define COPYRIGHT "Copyleft 2017-2018, Wenliang Guan" @@ -9,7 +9,7 @@ #define _STR_(s) #s #define __STR(s) _STR_(s) -#define BUILD_VERSION _STR_(57a6fM) +#define BUILD_VERSION _STR_(5880dM) #define SOFTWARE_VERSION __STR(MAIN_VERSION) #endif diff --git a/SerialTool/language/serialtool_zh_CN.ts b/SerialTool/language/serialtool_zh_CN.ts index 6ea049a..c0e46e4 100644 --- a/SerialTool/language/serialtool_zh_CN.ts +++ b/SerialTool/language/serialtool_zh_CN.ts @@ -12,7 +12,7 @@ ChannelItem - + Change plot lines color 修改绘制线条的颜色 @@ -95,246 +95,191 @@ 开始 - + Start transmit file: " 开始传输文件: " - + Can not open the file: " 无法打开文件: " - - + + Error: - 错误: + 错误: - - + + Error 错误 - + Cancel transfer. 取消传输. - + Transmit finished. 传输完成. - + Transmission timeout. 传输超时。 - - - MainWindow - - - - Terminal - 终端 - - - - Plot - 波形绘制 - - - - + File Transmit 文件传输 + + + MainWindow - + File 文件 - + Tools 工具 - + Edit 编辑 - + View 视图 - + Help 帮助 - - + + Tool Bar 工具栏 - - + Save 保存 - + Ctrl+S - + Options 选项 - - + + Open Port 打开端口 - + Alt+S - - + + Pause Tx/Rx 暂停发送/接收 - + Alt+R - + Clear Buffer 清空缓冲 - + Alt+C - + Port Settings 端口设置 - + Close 关闭 - - Tester - 调试助手 - - - + Status Bar 状态栏 - + About 关于 - + F1 - - Vedio Box - 视频图传 - - - - + + Wiki - - - + + Open 打开 - + Ctrl+O - - Value Display - 数值显示器 - - - + Stays On Top 置于顶层 - + Update 更新 - - - Portable Network Graphic Format (*.png) - 图像文件存储格式 (*.png) - - - - - Bitmap (*.bmp) - 位图文件 (*.bmp) - - - - - - Wave Plain Text File (*.txt) - 波形纯文本文件 (*.txt) - - - - - Terminal Text File (*.txt) - 终端文本文件 (*.txt) - - - + Start Tx/Rx 开始发送/接收 - + Close Port 关闭端口 @@ -361,16 +306,6 @@ Port Type 端口类型 - - - Serial Port - 串口 - - - - TCP/UDP - - System @@ -515,52 +450,77 @@ - Delete - 删除 + Delete + - Oscilloscope + OscilloscopeView - + Y Range Y轴范围 - + Y Offset Y轴偏置 - + X Points X轴点数 - + Hold Receive 保持接收 - + Warning 警告 - + The current window has data not saved, Still open the file? 当前窗口数据未保存,仍然打开文件? - + Error 错误 - + File parsing error. 文件解析错误。 + + + + + + Wave Plain Text File (*.txt) + 波形纯文本文件 (*.txt) + + + + + Portable Network Graphic Format (*.png) + 图像文件存储格式 (*.png) + + + + + Bitmap (*.bmp) + 位图文件 (*.bmp) + + + + Plot + 波形绘制 + PortSetBox @@ -603,12 +563,12 @@ 波特率 - + Error 错误 - + Can not open the port! Port may be occupied or configured incorrectly! 无法打开端口! @@ -638,50 +598,52 @@ Port may be occupied or configured incorrectly! 端口 - - - - - - - + + + + + + + Error 错误 - - + + Please enter a valid IP address and port number. - 请输入有效的IP地址和端口号。 + 请输入有效的IP地址和端口号。 + - + Can not connect to server! Please check the network, IP address and port number. 无法连接到服务器! 请检查网络、IP地址和端口号。 - + Please enter a valid port number! - 请输入有效的端口号! + 请输入有效的端口号! + - + Can not create server! Please check the port number. 无法创建服务器! 请检查端口号。 - + The port is occupied, Please re-enter it. 端口已被占用,请重新输入。 - + The remote host closed the connection. 远程主机关闭连接。 @@ -719,15 +681,26 @@ Please check the port number. 发送 - + Ctrl + Enter to send Ctrl + Enter发送 - + Connect port and start transmission to enable this button 连接端口并开启传输来启用此按钮 + + + + Terminal Text File (*.txt) + 终端文本文件 (*.txt) + + + + Terminal + 终端 + UpdateDialog @@ -748,67 +721,63 @@ Please check the port number. 取消 - - + + + + <b>SerialTool</b><br>Current Version: V <b>SerialTool</b><br>当前版本: V - + <br>Check update...<br><br> <br>检查更新...<br><br> - + <br>Find new version: <br>发现新版本: - + <br>Updated Date: <br>更新时间: - + <br>Press "Update" button to upgrade. <br>按下"更新"按钮来更新. - - - <b>SerialTool</b><br>Current Version: - <b>SerialTool</b><br>当前版本: - - - + <br>This is the latest version.<br><br> <br>已是最新版本.<br><br> - + <br>Network error.<br><br> <br>网络错误.<br><br> - + <br>Downloading... <br>下载中... - - - + + + Error 错误 - - + + Download error. 下载错误. - + Installation file corruption. 安装文件损坏. @@ -836,6 +805,14 @@ Please check the port number. 附加值 + + ValueDisplayFactory + + + Value Display + 数值显示器 + + VedioBox @@ -854,4 +831,25 @@ Please check the port number. 复制C语言数组 + + VedioBoxFactory + + + Video Box + 视频图传 + + + + ViewManager + + + Save + 保存 + + + + Open + 打开 + + diff --git a/SerialTool/language/zh_cn/serialtool.qm b/SerialTool/language/zh_cn/serialtool.qm index 8b05b7310b3eb293f504f40db884b9b0d73986fa..aabc4a1e0e3dedbebbce5166e6c5f22d0bfba4e5 100644 GIT binary patch delta 1812 zcmZuw4NMbv6o1#=UEAwjTRuu@Em&r&+hWY(2Wl3X6RUt=r#MDHofS^(#sI;g&Wsuz zF~|hXK?iP`x=h2s>0+lw=L}?i#*Z!P6c;r*a1kSZ;b59g_QPAYWN^vl_kZu+|GnS) zy?5Q|YtlDG2V05Q%|v`Z@CH##HIXiv$nibVyc0y?Lt?*U@x5I|V=A#fd5APGsHk%h zdubk#u>`mg_m>iT`!Vc(V(-3!Tr-LD?m&DMaVZmshI@%yas>V&6@#uz#Fga}NyRE! zZWC8t2YZW(R!&7*8F3BAi1fKCx}FjD*>oc9Y8CCx#Qg}u2Hd-02e#4V|TMTX-0L_+j2Lo$;v{cb;vj!C3hkwxt#g@?mz@XpF+>X3zMcoDjp_JRZ~#nSSHu zUtLZVd78_s1~c;kZt13jL{Xc$a*BdK#I5gpj2Zg4j|U{T&*bXPUMGt8b6bS~CrXSr{hu{Y8~?syXl8J4LS|220p2Y$AjyLJWf&K$0Dz~*AP$HC`^WS(*A(cxO& zeFsdV9`G+MT0|6A%_qLO8%$5}8NJCMx{uG5QP}tizc6Dg3OIRx!8#DG8fru zVm6_F@SLu7h6&P+(tAp=e2!}Ulu>RZs?pEh`#b&)MZfatGooSn`r0oQD70T6%0nUN z0sWTd*=XP|{lV6H3~ZLc))at}6AcMHy~xvPSXgxd@m)cK+{b}=o8jFBqY>y((YD2~ z>}N>MFA#+Gb0~0J82<~FDQdisKZ%7RPlff7AZmUfv{@U_z;@y2T@(_J7#V9j>@s8a zN0o>tqr3^k#2lmC>VXpR#u68HhAl9*{)*A-gNKY4wvWJJl!{S@MQ$nz>*__{P9(JK z5$l+%kZOa9_6uU8yar2lPuy>Nf~B>KKdiV2g?h!yS+E@>-t?CN-x50p&|WTCw%S2- znv@u-!H$fUs@||c37zyPj7EIo%O*Z)EhP1t#{S_z;tEr?rvn9Nnbr$?VUsCz-ib~Y zn|k-{#lH@%R+tcB@s;HT3JZ(N@`_93tbn{idEFg1gg0axDz@GBqUHY?lyoU! zu(L&)KSWk3cG(c#>e%6f6Kt^fh6p_n>mI^;dq}U{K4NfeIMx24mT@U3obehGlv_@p zEvCA!R+%Fg803`lk3P7c*^$}T&yWyKjoYSCj4{KMd{?BRHG7|9*YJ(u9@iaK+2I)( z6_w>Ld|#d(C@U%SubSb{TV7nMT=s;N*G9&^7s!{3UDJwJ>M#s*mYg3bhM~r+V(_mM qyEyZ0`gdNeuS6~yh&2ujCBt9jFOW;sIN!D0?Em62{pIqYxW54!6!Fvm delta 1715 zcmZWo3rrJt82^sm|E|5>T^~{k1=}(T)655BgXt34B9B!>K|n*$F%b&Gk)T3+X4D7< z2nx7AqUfTIID-f{?VK@F)1cFtIW#B^j1n0xJ_eGB%Fs>r;Uy-rCe81@@4n~n``zZm z!Ngi$_f-IP2LP`|yaQl9iO(?rfmr})7XftP!2ZYraD56&6~JB%1@N&e$WI0KMjC*0 z6mdJ|*8zL~34k08>_9lyDgzStEygbZ;*12a=K{$+i~b`(igEzl>Kx@k*9K&59X9My z(C=LZ{r3Xd{S$y@Dv+;Z0aPC;Xz2uU1qak_0&*t+@deB--hzW_A%0yCfaruz>dym^ z2yjLXBW8f}10Tc^L=|EqI4g(24dQJ`h}wyX(U6e60yiO$*nr4*6*QJA=%-Q8T%e#W z9Wt75U{wKR4B%#lR#=+*9)NHjmX)5sO>1DsrBY;qhnDEeXh$-V-hnI^GHt>80VX+^ z!NI$3oV0~`)PD&BhJ2u5E*9LQ5`IDIG$&Q|MW+FOs+7=|0LE68YeqAGf4s^&I~pM1 z5W9OGzGspYv<|aJs>g7VUF?w>+>krXwoKcK^{wpXEM!jH$o5@81`Hd>vRlPCz!=G{ za^qyi1oC<9DFELyWGzg>7agR01aHVElWpUaTM9|tue|`aEo6Vp48&2=SXT|;H%eNX z+i~NS#gS=B1f99oG*hf8$k2{0|>Rb8wM@<01VZ1wgWdf?Uo3H$% z0Yzj|(0-CXeKrRJ!+CGKj8rG7L)V}P181t|yp1=6YW2e7Pw}>$>h;fG0t9VUm(KHI ze7U;jAVsxrRM%%?W1mJ%@bELtBW_J*4Pk8?(ip+PpkTZ)#MlywRBMwe32w&MyGl3Pt z`2lPs|Epz8-PmZpg29Wm>1A6nFI?-Y#R268t;-vV47n4utL!K$_8qPFcNB-FLVN9- z5TvR`LErl#`FLClonq1zG>@_fSE@WU;}u8AbR={J}hmdFRA)>#n0_tm1D= z&=yQ$Use&?FU0;=xKGmW55SXlNm2FH0H67#OO?rH6kVhA*n=C%`7#&11u2e`BmTBv z;SxDLv>%!2mCJ?WXoFne8HAfu%g;`<;ny&zOR1DmGts)eDSD)QhVCEzBc%Es@*G_1 zxye3ecy4Dv)zFxQc5&&RJbr_UcKAlpr=r2rC&V&zI`5z+@h^JOWI<;v9WgCI+dw~* zy!4ng5TEt5*BUpT;J-~()s=F1#e7r~US<5B<|-<7t)T|dmp+$DXt5(~Jdmb@+Flje zAcs(+Ig#cF7J66?(6cG_`kdFF`S>r4NbP?ep-pwI$F`c|-?r``6DrGGkV{{wJR B%B%nY diff --git a/SerialTool/resource/default.ini b/SerialTool/resource/default.ini index 51161e8..d4387a5 100644 --- a/SerialTool/resource/default.ini +++ b/SerialTool/resource/default.ini @@ -13,14 +13,22 @@ AxisColor=#9499a3 UpdateInterval=25 UseOpenGL=false UseAntialias=false -PortType=0 +PortType=Serial Port Language=en Theme=default WindowOpacity=100 +[Path] +DocumentPath= + [SerialPort] BaudRate=9600 +[TcpUdpPort] +ServerAddress=localhost +PortNumber=8080 +PortProtocol=TCP Server + [Workspace] TabIndex=0 ToolBarVisible=true @@ -73,17 +81,9 @@ Channels\15\Color=#55aaff Channels\16\Visible=true Channels\16\Color=#aaaaff -[Path] -DocumentPath= - [FileTransmit] BeforeSendText= BeforeSend=false FileName= Protocol=XModem SendMode=true - -[TcpUdpPort] -ServerAddress=localhost -PortNumber=8080 -PortProtocol=TCP Server diff --git a/SerialTool/resource/images/clear.ico b/SerialTool/resource/images/clear.ico index d809e57f852c6a14cfaaa633d5ca74a1d6807e49..fbd0cee4432e20e05e656511a53703d0839da6b1 100644 GIT binary patch delta 1030 zcmY*XT}TvB6h5gahTsqzEx6!f8|bz>bFaHvf)5TAVMGe%lRZ?>kGk`-n@L*_>(Ybv z5)J)81U=P5Mi03=GuKs=*ud8?iXadn3Q=07A0o+|&Yca^3*X#(=bUrT`Mz@=1eRLj z0K1?P{C>U%VWJkG9RPg3@|{%!%;7&lDBmwv0gMVSL$_=9pa(P~co<)Istq|T*qRiy zb#mQQ#V?jBJ-R!$J7Dw%f|LFIl~$6Tv32o1(}~M;=^N9ji~eJl5~?xeNQnE`nwYj# zvTkdngh-nj>Bhat6mboGy9~KG;$l)eAzfuE`ODw4lCcwB3HY%!ddgPmI@X0FAXkkg{6(KlQlLk`sO z+L%iFa+jnA9y6mvdoa$mGixOBnmqQpr6_Bez(pZD2Ot9?oQ-V!MA{k2c}^Cg;Zc#FDgcyPcnN zBe4bSjf=YcK%Yzr32u4;8eO##Br|m}#-{{k)kFJiReD}-Jd)Ju3QNU~aohIw?ntnw zFcQ~M zEKRbvJ9=kDTAS9y6lct*4w;3xA7_CNeKiy0Atu0Lu~3!#G_}?X=;uw{{7{&8w}Ve2 zpPXD$YRG%U_$1R3OSKMq?`Avwywh9x#nr-ayNMQj0q8H)3!A}|o_VY5HVPh2$=Q`NYw3ZH0Lhv7LMr*pD3k;^Nu+;1fs7wL^6Hu;VZ}srMxJI(*kg z%AU$$5Al^3dx$;IQ)M3G*x_uKtyhOij_S~UP&!BUiNqMy_uA-uCfgA{@#*r;Lt>9< zcTpGT^U-pDa4v=R{UZOk@Bbx!r8U^8?{C%a*W2`=P_X-Th@yhq)XD zN!{V2#r}xBEsL2FA4=Y`zSDudE2@8ee;H5QIQuBa;5%isDr1nv_*<;&})?5ywS%PXy5@aWFQL+U;z`@IEV33 zEo}@`?`7Z3MQP`RD(S75PIjFw4r$~=N^GsAvPV#f0Nb|i%VRC@wK5I6TeUgXA zTbwf&vKUf!Gp^_9lGpWH$}aLga5YvoZH8;-mly*y*c++jyGZOsQQcnWb4%077F*ru zXx87$^h1s@`xt$HHRn6a(H!e4VCtZwi&z|MG3&lAdE-ad=p3`CSm&C$cbR!wi3mME2bjiSImClc=FDd_tuS8(5W`2UE zc~lzrSvR>W-W+0G;6@BaC(mYa2x&o_=$-XjL$9ywTydF1NzPumyW0wI@+ zI-{WNuLr=CIo!avnK|d`C+ZdF=7m_9w2Gf$2kK>(BOzou=ecfX_3D<5VX{vvdt%&r zs@2+wNDamgYPPf2>8R2|W?|vmyB+Vjbe1|dX6ew@6xDh}E8Qvja(R~4>1FEj-K%wJ zYghk4A2(>=A?96W8OQDU3re*WO=T+;Ds!k^HisKO38$oz0AQ%*khM$v+Bw%SaxsVV~x( z`QL=3OFQyUc5?lc!OwSo$JRLqBC3t)+e~6OcM2G S`VaaT0}VXjh0MjjiT(kgom4OY delta 288 zcmcboIZZ}|fq{{Mi9tdFL@O|Ka56BcF)%O)2tfE5EDQ|mI5(Q~aZauh(Bbg2KUNrE zf7EAUpn`(G-7#N(`(p(_)o>8#dQ>dH;mB>E+yzU4sbY{50PPDIRBY}q5mTT1N#F8 U2Id2k*N7+yFdu+$LBb$u0GT{d8~^|S diff --git a/SerialTool/resource/images/config.ico b/SerialTool/resource/images/config.ico index dc60661dace8aded50914439c8f8a37f391970a2..ff015b9597806851e0aa6b0d643ff86453e90ba4 100644 GIT binary patch delta 1286 zcmZux&r1|>6#ux1wI#KL)IuISc&OV}5(^?a=MLeaAPFqHWQUL-A&J)7f=;!=f)VcQ z%(w`Wc!(}RW_GNuV>9;n0-i+T((t*eOe&2iF&wJm`d*2ypo;%S7)L{?O zY0)islmyNIXljc0uNr_E+ES@_f2|%EOucA*oIK139H+=J`3eoXb}HqMqSv#qK$)*v zxTtGgDZhkUT!$i_i5t3>$pjXL0vk*le@i7y_$ET1F|L7eWe-Et@!TCXGG=J&_sX!VWqfwI*R`f2RTFti94GOzHj7<}qgQuWkyF`~ z_Qr648J~IvHfq_nveLfBY+rWRO>8nt!Fh)LtRTxWb8$6v)>x2A1&}jza#z4Id?xKB%Y%y*j5!v5M?EJnyO>vJw=k#W_F{7k z467o@)`nL?rFz!D0B_wR0qR>G#cXwKYoJUlk={<_Q#xRqq+J3S4WEtoY-e_@h;C>6 z-zbpTuRQ-y+Uiu$!OJ~}#zV1CVj&guag5H(IB^^bY~k*sxP64wc>{l#!|et`3@MAmsxcuj(ud&D=gk-vVO{2vRRv5`hJj*cVy@~TmFQX3wUOZuQWs7 zaF|1)mcT@Xw)pj1m{NAp?A~qu4N`)`+##{#We&<;gX;^9g-_HAv|ZMNMQj0q8jD|MZ7zATT=#q%Arrj(}m zg!JP9;sWa_x0w>xs1nZ|v#y$XB2HcYho)N3FlBc$pD&`%Y3}k-ONn`|#4L5iL*z6& zX5^90m z)DyQHv%H8tp%th##eMr!i!ZN=@qC)5Bl;$~l}%Zmb%MEk znz^#eF-t-;&A%r*jmTj@AC@V32$!Fh;V9m>R#p;_Jn6}|pq~5{+I7@r!%%rI7)Fh4`@T-=Hg*&%ImUdpT?@oL5#T!sG9i|dBKbIfXW7{K$@7~rwl|;_ zK&}9CypDOXN|0)>W~>b$IR2kx%W?AdS=C;IsvqF?&J>>EaZpyzqdCXhba zG}&ZuSB|dMaQRJ5gevxqdv-uQ-kT!;40ixNpuYS8U*ec$#~}kCJYc?j0`Aoe@UU^q z69nA;Txwz_5yH0IYf=0wHf0zjkLlKyZ`EO{^ULiOAFy2dUQ-3-yLx81d_bOnC42KL zB3e^R(T^GmbiAQsFs?nou*j!m(Bjf@$E>c>^_gq;=YhNE^$TrxzM25`5&lbRp3|Yv7C)&bzhsgqBGo%Z4 e1V+ejgODXy77^KShGgryh>^Y2NMQj0q8q|{z7pdLXLM>ulgFA)3yAXM0p(6lGis1o8QI3O-a z+3aSwDM|ty_yNQx^h6P&H8a^b@h*{A$#FdM=6S~R>^JM*Z`=Y{f^)F8MspqZY5-dR zu)3PBKUM)^w0T~>ez*+q*n984u3bO`T*pCS^zBy{HR@Bk^E>=vMlMuTbBk} zu){>LUNAx753M`#9Z9pXNq(s9fj;f?K_|T&`aDI7wBRP_;?V3w@b0S(Cv7PH31c!V zZlIN$P&&^gPxtCP`(=d~f> zsbHh0#tslxl=F3$IF;Me0gq;T5yofP3!jAvW|0$^K(n6AZuDEZ<7dW4q`s5xU<+Q( zZ2*e*8d&`wJJ$GZo8(kjS1UH!2GC0|E6<=oSFZ7>N!1hB4mJ?mmj5TxNDKFiReg^3 z*)R;S`Z5>A5n{6cB0_};2sgnji=T9&=DbZsSs7%JFK;Ckg%wu}W;)aU56&xRjC~qn zmbRc4i;#|)j@u@ZJZZ>Mn@~?}#g9(yWK4{)2^RLxP_cz7Nhkr2wc-&9=X1fg;bcvp z&D&BYloM4av*bv?^H%0 zf+zpuBR{NMQj0q81v z!lNH1p=^se+3qqr!r)pt;`V6hA6uCLDKj@yM&6{M?OWRF8CymzNB(N&@6U*VN1lJ* zF*ZeLNim_S3*44*XzmSmA+N9`us)~UtP5^_?D?j4@l+=)$)8*KbrtP#G8Qd*MYQdE zJx;SC=T8b`2F>D@V*1RINoYOl2KLz=BZq0|6RlcNc&AN&2(RGuxg|R-=dHqV;=M_u zN*vm9xShX_lga(2IsDXyqd3kTp&H>RwK853Mt=)#ANCoM`+<2`l@N^H#uvGCf{}v+ zljD%SSAMm60X4k(nvQwu)i(U~TtQC*GDf4aiV5nDGaUR^0hQA-(>=>`m#||yZWl_? zlOm0F9rqtG$L&6ZRcxLCNL9Z YA7kn%|78{501a&=RRi_vg>g&&1G4twlmGw# delta 50 zcmcboIZZ}|fq{{Mi9tdFL@O|Ka56BcF)%O)2tfE5EDQ|mI5(Q~ac-^>NMQj0q8{{R1vBtsh}$c~0OMw(!d*&zRl05OP$`F8=34Fk0H@BjZF7#e>F iPz8g`0{KG#h!ubs=AQ;28wRNDA5ao#K1d!0=>-6_?`Q7- delta 47 ucmZ3+dW>0_fq{{Mi9tew2}m&DOwg$9@i-c{B>5U35 z*FF4hcz7!2q1x7{5qOwr_z>h;@bLJ)J5_gaakY%oKOSL^ZS`s4KQ2R5_4pTNh*<{XZZH^@!1?i1GfE{DA8VRJn`%V?2Yj&%k&_>=r^ zht{gdb@n2^H${YHVv#5ni6cZW_d6pjA>uoNpTsZd_{01d39em)T7pm_h!U|#EJg7Z b=H-@`*m;>5Rtjv=+1ov(6c+AxUs3-8?N&q2 delta 65 zcmcboIZZ}|fq{{Mi9tdFL@O|Ka56BcF)%O)2tfE5EDQ|mI5(Q~aZauhFlMZp7-%v1 OnLssT)#fC@8fE}KObpTh diff --git a/SerialTool/resource/images/save.ico b/SerialTool/resource/images/save.ico index 1afa252245552f55b576fbef30a8af2ed6d45194..7220d860da9e31e83efe6eb6e03a35164a005a0e 100644 GIT binary patch literal 5342 zcmeHLy-or_5dIWnqBay1*imX{G_m$kwDSq9E$y(ikRPqo7qB7{9>7;HDjcy;A_>Ms zS!eE;bwutD4m5;KhS{5)`F3WQ+Z_PrkU};K;yD~G0owpF8SnXe5vY(Xo%Wvh7k~qr zuaOR!V1tP5cOl@f6)*iTCzA^FH}`SS+@iHoSUBZl^8Yuxb1k1Fp2Q%&Xg@?2$G=J7IbQCM`~9>J-@-VCQ^sqvh)z_Z{@_*n;pV%9 zPm)I>>R;ZqJ?;A*)t2>!v^TOxM0?Q}ZexpRZ}nwg;s4m4V+}mh$@h-{|3lAPu9Z0U ztlw1i!v4jw=Xl6xskcPzOL!AJ=5$WAnNMQj0q8M^8bA!v1_BeLSev*%ZdJmR%4e0L6BAuTfc*a;9J?a%yzhj7c#A>{ z&WVXO5-{<&)$#w6x2FEjI+(RPaYdrb#6*k9x41;P*TjF0SraoOWm$^$#6*M1vzR0V z;@2kpPgtG!Fl%>KjcJyt#Kc66$-kHsc;eQ?|4&?>crj^nO7vtsUX{sF%$nS*6aL4o zirX5#KH6boq6|<-mw!#df1nXxl9naSE8A73JJC^OvJ{JnK>T{3_!gjblOpOvRu*zj z=3{Y@NLrTsGjvyYTiTg4E{6X=Z$iQ3eat#whs3W<{28|=9$mc1m(*I{J$~*!L6<=T=3Bv*~ab@bYfE_`ZR!6KR zPh_+OM?my~==!(?anj&8G4}ue{{zEuAU+7h2SC^!i1~q-8HgEyn4tiO1%Q|V!UlCY&Dy+{Gm`}X6jSGZ delta 50 zcmcboIZZ}|fq{{Mi9tdFL@O|Ka56BcF)%O)2tfE5EDQ|mI5(Q~ac-^>NMQj0q8 -#include -#include -#include -#include -#include -#include -#include "portsetbox.h" -#include "optionsbox.h" -#include "aboutbox.h" -#include "version.h" -#include "tcpudpport.h" -#include "defaultconfig.h" -#include "serialport.h" -#include "valuedisplay.h" -#include "vediobox.h" -#include "updatedialog.h" - -MainWindow::MainWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow) -{ - QString configPath(QStandardPaths::writableLocation( - QStandardPaths::AppConfigLocation) + "/config.ini"); - syncDefaultConfig(configPath); - m_config = new QSettings(configPath, QSettings::IniFormat); - - ui->setupUi(this); - setWindowTitle(SOFTWARE_NAME " V" SOFTWARE_VERSION); - - // 互斥动作 - m_tabActionGroup = new QActionGroup(this); - m_tabActionGroup->addAction(ui->actionVisibleTab0); - m_tabActionGroup->addAction(ui->actionVisibleTab1); - m_tabActionGroup->addAction(ui->actionVisibleTab2); - - m_serialPort = new SerialPort(this); - m_tcpUdpPort = new TcpUdpPort(this); - ui->toolBar1->insertWidget(ui->portSetAction, m_tcpUdpPort); - ui->toolBar1->insertWidget(ui->portSetAction, m_serialPort); - - m_rxCount = 0; - m_txCount = 0; - // 状态栏设置 - m_rxCntLabel = new QLabel("RX: 0Bytes", this); - m_txCntLabel = new QLabel("TX: 0Bytes", this); - m_portInfoLabel = new QLabel("", this); - m_rxCntLabel->setMinimumWidth(120); - m_txCntLabel->setMinimumWidth(120); - m_portInfoLabel->setMinimumWidth(120); - ui->statusBar->addWidget(m_portInfoLabel); - ui->statusBar->addWidget(m_rxCntLabel); - ui->statusBar->addWidget(m_txCntLabel); - - loadConfig(); // 加载配置 - - // create connection between axes and scroll bars: - connect(ui->portRunAction, SIGNAL(triggered()), this, SLOT(changeRunFlag())); - connect(ui->portSwitchAction, SIGNAL(triggered()), this, SLOT(onPortSwitchActionTriggered())); - connect(ui->terminal, &TerminalView::sendDataRequest, this, &MainWindow::writePort); - connect(ui->clearAction, SIGNAL(triggered()), this, SLOT(cleanData())); - QObject::connect(&m_timer, &QTimer::timeout, this, &MainWindow::onSecTimerTimeout); - connect(ui->portSetAction, SIGNAL(triggered()), this, SLOT(openSetPortInfoBox())); - connect(ui->actionOption, SIGNAL(triggered()), this, SLOT(setOptions())); - connect(ui->actionSave, SIGNAL(triggered()), this, SLOT(saveFile())); - connect(ui->actionOpen, SIGNAL(triggered()), this, SLOT(openFile())); - connect(ui->actionClose, SIGNAL(triggered()), this, SLOT(close())); - connect(ui->actionVisibleToolbar, SIGNAL(triggered(bool)), ui->toolBar1, SLOT(setVisible(bool))); - connect(ui->actionVisibleStatusBar, SIGNAL(triggered(bool)), ui->statusBar, SLOT(setVisible(bool))); - connect(ui->toolBar1, SIGNAL(visibilityChanged(bool)), ui->actionVisibleToolbar, SLOT(setChecked(bool))); - connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabIndexChanged(int))); - connect(m_tabActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(tabActionGroupTriggered(QAction*))); - connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(about())); - connect(ui->actionWiki, SIGNAL(triggered()), this, SLOT(openWiki())); - connect(ui->fileTransmit, &FileTransmitView::sendData, this, &MainWindow::writePort); - connect(ui->actionVedioBox, SIGNAL(triggered()), this, SLOT(onVedioBoxTriggered())); - connect(ui->actionValueDisplay, SIGNAL(triggered()), this, SLOT(onValueDisplayTriggered())); - connect(ui->tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); - connect(m_serialPort, SIGNAL(portChanged()), this, SLOT(dispPortStatus())); - connect(m_serialPort, SIGNAL(portError()), this, SLOT(closePort())); - connect(m_tcpUdpPort, SIGNAL(protocolChanged()), this, SLOT(dispPortStatus())); - connect(m_tcpUdpPort, SIGNAL(connectionError()), this, SLOT(closePort())); - connect(ui->actionStaysOnTop, SIGNAL(triggered()), this, SLOT(onStaysOnTopTriggered())); - connect(ui->actionUpdate, SIGNAL(triggered()), this, SLOT(updateSoftware())); - - m_timer.start(1000); -} - -MainWindow::~MainWindow() -{ - delete ui; - delete m_config; - delete m_tabActionGroup; - delete m_tcpUdpPort; - delete m_rxCntLabel; - delete m_txCntLabel; - delete m_portInfoLabel; - delete m_serialPort; -} - -// 关闭事件 -void MainWindow::closeEvent(QCloseEvent *event) -{ - saveConfig(); - QMainWindow::closeEvent(event); -} - -// 加载语言 -void MainWindow::setLanguage(const QString &string) -{ - // 首先卸载翻译 - if (!m_translator.isEmpty()) { - for (int i = 0; i < m_translator.size(); ++i) { - qApp->removeTranslator(m_translator[i]); // 卸载翻译环境 - delete m_translator[i]; - } - m_translator.clear(); - } - // 遍历文件 - QDir dir("language/" + string); - foreach(QFileInfo mfi ,dir.entryInfoList()) { - if (mfi.isFile() && mfi.suffix() == "qm") { // 是翻译文件 - QTranslator* ts = new QTranslator; - ts->load(mfi.absoluteFilePath()); - qApp->installTranslator(ts); // 安装翻译环境 - m_translator.append(ts); - } - } - // 重新翻译界面 - ui->retranslateUi(this); - ui->terminal->retranslate(); - ui->oscPlot->retranslate(); - ui->fileTransmit->retranslate(); - m_tcpUdpPort->retranslate(); - m_serialPort->retranslate(); -} - -// 加载样式表 -void MainWindow::setStyleSheet(const QString &string) -{ - // 样式表 - QFile qss("themes/" + string + "/style.css"); - qss.open(QFile::ReadOnly); - qApp->setStyleSheet(qss.readAll()); - qss.close(); -} - -// 读取系统设置 -void MainWindow::loadSettings() -{ - // 系统设置 - m_config->beginGroup("Settings"); - - QString fontFamily("'" - + m_config->value("FontFamily").toString().replace("+", "','") + "'"); - QString fontStyle(m_config->value("FontStyle").toString()); - int fontSize = m_config->value("FontSize").toInt(); - fontSize = fontSize < 6 ? 10 : fontSize; - ui->terminal->setFontFamily(fontFamily, fontSize, fontStyle); - - ui->oscPlot->setBackground(QColor(m_config->value("PlotBackground").toString())); - ui->oscPlot->setGridColor(QColor(m_config->value("AxisColor").toString())); - // 绘制使用OpenGL加速 - ui->oscPlot->setUseOpenGL(m_config->value("UseOpenGL").toBool()); - // 绘制时抗锯齿 - ui->oscPlot->setUseAntialiased(m_config->value("UseAntialias").toBool()); - // 示波器刷新速度 - ui->oscPlot->setUpdateInterval(m_config->value("UpdateInterval").toInt()); - PortType type = (PortType)m_config->value("PortType").toInt(); - - // 窗口透明度 - int opacity = m_config->value("WindowOpacity").toInt(); - opacity = opacity < 30 ? 100 : opacity <= 100 ? opacity : 100; - setWindowOpacity(opacity / 100.0); - if (m_valueDisplay != NULL) { - m_valueDisplay->setWindowOpacity(windowOpacity()); - } - if (m_vedioBox != NULL) { - m_vedioBox->setWindowOpacity(windowOpacity()); - } - - // highlight - ui->terminal->setHighlight(m_config->value("TerminalHighlight").toString()); - // text codec - ui->terminal->setTextCodec(m_config->value("TerminalTextCodec").toString()); - ui->terminal->setTabsInsertSpaces(m_config->value("TerminalTabsInsertSpaces").toBool()); - ui->terminal->setTabWidth(m_config->value("TerminalTabWidth").toInt()); - ui->terminal->setAutoIndent(m_config->value("TerminalAutoIndent").toBool()); - ui->terminal->setIndentationGuides(m_config->value("TerminalIndentationGuides").toBool()); - - // 语言设置 - setLanguage(m_config->value("Language").toString()); - setStyleSheet(m_config->value("Theme").toString()); - - m_config->endGroup(); - - if (type != m_portType) { - closePort(); // 端口改变时关闭之前的端口 - m_portType = type; - } - dispPortStatus(); // 更新端口状态显示 - loadPortTool(); -} - -// 控件数据初始化, 在构造函数中初始化各种控件的初始值 -void MainWindow::loadConfig() -{ - // 路经 - m_config->beginGroup("Path"); - m_docPath = m_config->value("DocumentPath").toString(); - m_config->endGroup(); - - // 串口设置 - m_serialPort->loadConfig(m_config); - - // TCP/UDP设置 - m_tcpUdpPort->loadConfig(m_config); - - // 打开页面配置 - m_config->beginGroup("Workspace"); - ui->tabWidget->setCurrentIndex(m_config->value("TabIndex").toInt()); - setTabActionIndex(ui->tabWidget->currentIndex()); - ui->toolBar1->setVisible(m_config->value("ToolBarVisible").toBool()); - ui->actionVisibleToolbar->setChecked(m_config->value("ToolBarVisible").toBool()); - ui->statusBar->setVisible(m_config->value("StatusBarVisible").toBool()); - // 这里如果直接速读取ui->statusBar->isVisible()会是false,原因不明 - ui->actionVisibleStatusBar->setChecked(m_config->value("StatusBarVisible").toBool()); - setWindowStaysOnTop(m_config->value("WindowStaysOnTop").toBool()); - m_config->endGroup(); - - // 调试终端配置 - ui->terminal->loadConfig(m_config); - - // 串口示波器 - ui->oscPlot->loadConfig(m_config); - - // 读取文件传输功能的设置 - ui->fileTransmit->loadConfig(m_config); - - // 最后读取系统设置 - loadSettings(); -} - -// 保存配置 -void MainWindow::saveConfig() -{ - // 保存串口设置 - m_serialPort->saveConfig(m_config); - - // 保存TCP/UDP设置 - m_tcpUdpPort->saveConfig(m_config); - - // 打开页面配置 - m_config->beginGroup("Workspace"); - m_config->setValue("TabIndex", - QVariant(ui->tabWidget->currentIndex())); - m_config->setValue("ToolBarVisible", QVariant(ui->toolBar1->isVisible())); - m_config->setValue("StatusBarVisible", QVariant(ui->statusBar->isVisible())); - m_config->setValue("WindowStaysOnTop", QVariant((windowFlags() & Qt::WindowStaysOnTopHint) != 0)); - m_config->endGroup(); - - // 调试终端配置 - ui->terminal->saveConfig(m_config); - // 串口示波器 - ui->oscPlot->saveConfig(m_config); - - // 路经 - m_config->beginGroup("Path"); - m_config->setValue("DocumentPath", QVariant(m_docPath)); - m_config->endGroup(); - - // 文件传输配置 - ui->fileTransmit->saveConfig(m_config); -} - -void MainWindow::setOptions() -{ - OptionsBox option(this); - option.exec(); -} - -// 保存文件 -void MainWindow::saveFile() -{ - QString filter; - QString fname = QFileDialog::getSaveFileName(this, tr("Save"), m_docPath, - tr("Portable Network Graphic Format (*.png)") + ";;" + - tr("Bitmap (*.bmp)") + ";;" + - tr("Wave Plain Text File (*.txt)") + ";;" + - tr("Terminal Text File (*.txt)"), &filter, - QFileDialog::HideNameFilterDetails); - if (fname.isNull()) { - return; - } - m_docPath = QFileInfo(fname).path(); - if (filter == tr("Portable Network Graphic Format (*.png)")) { - ui->oscPlot->savePng(fname); - } else if (filter == tr("Bitmap (*.bmp)")) { - ui->oscPlot->saveBmp(fname); - } else if (filter == tr("Wave Plain Text File (*.txt)")) { - ui->oscPlot->saveWave(fname); - } else if (filter == tr("Terminal Text File (*.txt)")) { - ui->terminal->saveText(fname); - } -} - -// 打开文件 -void MainWindow::openFile() -{ - QString filter; - QString fname = QFileDialog::getOpenFileName(this, tr("Open"), m_docPath, - tr("Wave Plain Text File (*.txt)"), &filter, - QFileDialog::HideNameFilterDetails); - if (fname.isNull()) { - return; - } - m_docPath = QFileInfo(fname).path(); - if (filter.indexOf("(*.txt)", 0) != -1) { - ui->oscPlot->loadWave(fname); - } -} - -void MainWindow::tabIndexChanged(int index) -{ - setTabActionIndex(index); - if (index == 0) { // terminal - if (m_runFlag) { // 暂停按钮没有按下时继续发送 - ui->terminal->setPaused(false); - } - } else { // 其他选项卡下暂停发送 - ui->terminal->setPaused(true); - } -} - -void MainWindow::setTabActionIndex(int index) -{ - switch (index) { - case 0: - ui->actionVisibleTab0->setChecked(true); - break; - case 1: - ui->actionVisibleTab1->setChecked(true); - break; - case 2: - ui->actionVisibleTab2->setChecked(true); - break; - default: - ui->actionVisibleTab0->setChecked(true); - break; - } -} - -void MainWindow::tabActionGroupTriggered(QAction *action) -{ - if (action == ui->actionVisibleTab0) { - ui->tabWidget->setCurrentIndex(0); - } else if (action == ui->actionVisibleTab1) { - ui->tabWidget->setCurrentIndex(1); - } else if (action == ui->actionVisibleTab2) { - ui->tabWidget->setCurrentIndex(2); - } -} - -void MainWindow::changeRunFlag() -{ - if (m_runFlag == true) { - m_runFlag = false; - QIcon icon(":/SerialTool/images/start.ico"); - ui->portRunAction->setIcon(icon); - ui->portRunAction->setText(tr("Start Tx/Rx")); - ui->terminal->setPaused(true); // terminal transmission pause - ui->oscPlot->stop(); - } else { - m_runFlag = true; - QIcon icon(":/SerialTool/images/pause.ico"); - ui->portRunAction->setIcon(icon); - ui->portRunAction->setText(tr("Pause Tx/Rx")); - ui->terminal->setPaused(false); // terminal transmission continue - if (ui->tabWidget->widget(ui->tabWidget->currentIndex()) == ui->tabOsc) { - ui->oscPlot->start(); - } - } -} - -// 状态栏显示端口状态 -void MainWindow::dispPortStatus() -{ - bool status = false; - QString string; - QPalette palette; - - if (m_portType == ComPort) { - status = m_serialPort->portStatus(string); - } else if (m_portType == NetworkPort) { - status = m_tcpUdpPort->portStatus(string); - } - palette.setColor(QPalette::WindowText, status ? Qt::darkGreen : Qt::red); - m_portInfoLabel->setText(string); - m_portInfoLabel->setPalette(palette); -} - -// 秒定时器溢出槽函数 -void MainWindow::onSecTimerTimeout() -{ - QString str; - - // 更新显示信息 - str = "RX: " + QString::number(m_rxCount) + "Bytes"; - m_rxCntLabel->setText(str); - str = "TX: " + QString::number(m_txCount) + "Bytes"; - m_txCntLabel->setText(str); -} - -// 打开串口端口 -bool MainWindow::openComPort() -{ - if (m_serialPort->open()) { - connect(m_serialPort, &SerialPort::readyRead, this, &MainWindow::readPortData); - return true; - } - return false; -} - -// 打开TCP/UDP端口 -bool MainWindow::openTcpUdpPort() -{ - if (m_tcpUdpPort->open()) { - connect(m_tcpUdpPort, &TcpUdpPort::readyRead, this, &MainWindow::readPortData); - return true; - } - return false; -} - -// 打开端口 -void MainWindow::openPort() -{ - bool status = false; - - if (m_portType == ComPort) { - status = openComPort(); - } else if (m_portType == NetworkPort) { - status = openTcpUdpPort(); - } - if (status) { - QIcon icon(":/SerialTool/images/close.ico"); - ui->portSwitchAction->setIcon(icon); - ui->portSwitchAction->setText(tr("Close Port")); - ui->terminal->setEnabled(true); - ui->portRunAction->setEnabled(true); - if (m_runFlag && ui->tabWidget->widget(ui->tabWidget->currentIndex()) == ui->tabOsc) { - ui->oscPlot->start(); // 启动串口示波器 - } - dispPortStatus(); // 更新端口状态显示 - } -} - -void MainWindow::closePort() -{ - if (m_serialPort->isOpen()) { - m_serialPort->close(); // 关闭串口 - } - if (m_tcpUdpPort->isOpen()) { - m_tcpUdpPort->close(); - } - ui->oscPlot->stop(); // 串口示波器结束运行 - QIcon icon(":/SerialTool/images/connect.ico"); - ui->portSwitchAction->setIcon(icon); - ui->portSwitchAction->setText(tr("Open Port")); - ui->terminal->setEnabled(false); - ui->portRunAction->setEnabled(false); - dispPortStatus(); // 更新端口状态显示 -} - -// 打开串口槽函数 -void MainWindow::onPortSwitchActionTriggered() -{ - if (ui->portRunAction->isEnabled() == true) { // 现在需要关闭端口 - closePort(); - } else { // 端口关闭时打开端口 - openPort(); - } -} - -// 打开串口设置对话框 -void MainWindow::openSetPortInfoBox() -{ - m_serialPort->portSetDialog(); -} - -//读取接收到的数据 -void MainWindow::readPortData() -{ - // 读取串口数据 - if (!m_runFlag) { - return; - } - QByteArray buf; - if (m_portType == ComPort) { - buf = m_serialPort->readAll(); // 读取串口数据 - } else if (m_portType == NetworkPort) { - buf = m_tcpUdpPort->readAll(); // 读取TCP/UDP数据 - } - m_rxCount += buf.length(); // 接收计数 - if (!buf.isEmpty()) { - if (ui->tabWidget->currentIndex() == 0) { // 串口调试助手 - ui->terminal->append(buf); - } - // 串口示波器接收数据 - if (ui->tabWidget->currentIndex() == 1 || ui->oscPlot->holdReceive()) { - ui->oscPlot->append(buf); - } - // 串口文件传输 - if (ui->tabWidget->currentIndex() == 2) { - ui->fileTransmit->readData(buf); - } - if (m_vedioBox != NULL) { - m_vedioBox->append(buf); - } - if (m_valueDisplay != NULL) { - m_valueDisplay->append(buf); - } - } - buf.clear(); -} - -// 向端口发送数据,带参数 -void MainWindow::writePort(const QByteArray &array) -{ - m_txCount += array.length(); // 发送计数 - if (m_portType == ComPort) { - m_serialPort->write(array); - } else if (m_portType == NetworkPort) { - m_tcpUdpPort->write(array); - } -} - -void MainWindow::cleanData() -{ - switch (ui->tabWidget->currentIndex()) { - case 0: // 串口调试助手 - ui->terminal->clear(); - break; - case 1: - ui->oscPlot->clear(); - break; - } - // 计数清零 - m_rxCount = 0; - m_txCount = 0; -} - -void MainWindow::about() -{ - AboutBox aboutBox(this); - - aboutBox.exec(); -} - -void MainWindow::onValueDisplayTriggered() -{ - if (m_valueDisplay == NULL) { - m_valueDisplay = new ValueDisplay(this); - m_valueDisplay->setModal(false); - m_valueDisplay->setAttribute(Qt::WA_DeleteOnClose); - m_valueDisplay->setWindowOpacity(windowOpacity()); - connect(m_valueDisplay, SIGNAL(destroyed()), this, SLOT(onValueDisplayDelete())); - m_valueDisplay->show(); - } -} - -void MainWindow::onValueDisplayDelete() -{ - m_valueDisplay = NULL; -} - -void MainWindow::loadPortTool() -{ - if (m_portType == ComPort) { - m_serialPort->setVisibleWidget(true); - ui->portSetAction->setVisible(true); - m_tcpUdpPort->setVisibleWidget(false); - } else if (m_portType == NetworkPort) { - m_serialPort->setVisibleWidget(false); - ui->portSetAction->setVisible(false); - m_tcpUdpPort->setVisibleWidget(true); - } -} - -void MainWindow::onVedioBoxTriggered() -{ - if (m_vedioBox == NULL) { // 当对话框没有创建时创建 - m_vedioBox = new VedioBox(this); - connect(m_vedioBox, SIGNAL(destroyed()), this, SLOT(onVedioBoxDelete())); - m_vedioBox->setModal(false); // 非模态对话框 - m_vedioBox->setAttribute(Qt::WA_DeleteOnClose); - m_vedioBox->setWindowOpacity(windowOpacity()); - m_vedioBox->setFilePath(m_docPath); - m_vedioBox->show(); - } -} - -void MainWindow::onVedioBoxDelete() -{ - m_vedioBox = NULL; -} - -void MainWindow::setWindowStaysOnTop(bool enabled) -{ - QString str = enabled ? ":/SerialTool/images/pin_down.ico" - : ":/SerialTool/images/pin_up.ico"; - - ui->actionStaysOnTop->setIcon(QIcon(str)); - if (enabled) { - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); - } else { - setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); - } - show(); -} - -void MainWindow::onStaysOnTopTriggered() -{ - setWindowStaysOnTop(!(windowFlags() & Qt::WindowStaysOnTopHint)); -} - -void MainWindow::openWiki() -{ - QDesktopServices::openUrl(QUrl("https://github.com/gztss/SerialTool/wiki")); -} - -void MainWindow::currentTabChanged(int index) -{ - if (m_runFlag && ui->tabWidget->widget(index) == ui->tabOsc) { // 只有在串口示波器选项卡下面才会启动示波器 - ui->oscPlot->start(); - } else { - ui->oscPlot->stop(); - } -} - -void MainWindow::updateSoftware() -{ - UpdateDialog *dialog = new UpdateDialog(this); - - dialog->exec(); - dialog->deleteLater(); -} diff --git a/SerialTool/source/aboutbox.cpp b/SerialTool/src/aboutbox.cpp similarity index 80% rename from SerialTool/source/aboutbox.cpp rename to SerialTool/src/aboutbox.cpp index a21e7d1..1935ac5 100644 --- a/SerialTool/source/aboutbox.cpp +++ b/SerialTool/src/aboutbox.cpp @@ -12,14 +12,6 @@ AboutBox::AboutBox(QWidget *parent) : ui->setupUi(this); setFixedSize(400, 400); // 不能伸缩的对话框 - QPalette pal(palette()); - pal.setColor(QPalette::Background, Qt::white); //设置背景色 - setAutoFillBackground(true); - setPalette(pal); - - ui->buttonBox->setCenterButtons(true); // 按钮居中 - ui->textBrowser->setFrameStyle(QFrame::NoFrame); // 无边框 - QPixmap pix(":/SerialTool/images/logo.ico"); pix = pix.scaledToWidth(64, Qt::SmoothTransformation); ui->label1->setPixmap(pix); diff --git a/SerialTool/src/controller.cpp b/SerialTool/src/controller.cpp new file mode 100644 index 0000000..71bec7d --- /dev/null +++ b/SerialTool/src/controller.cpp @@ -0,0 +1,79 @@ +#include "controller.h" +#include "views/viewmanager.h" +#include "toolbox/toolboxmanager.h" +#include "port/portmanager.h" +#include + +Controller::Controller(QString *docPath, QTabWidget *tabWidget, QMenu *menu, + QAction *openAction, QAction *saveAction) +{ + m_views = new ViewManager(docPath, tabWidget); + m_toolBoxs = new ToolBoxManager(docPath, menu); + + m_views->setFileAction(openAction, saveAction); +} + +void Controller::loadConfig(QSettings *config) +{ + m_views->loadConfig(config); +} + +void Controller::saveConfig(QSettings *config) +{ + m_views->saveConfig(config); +} + +void Controller::loadSettings(QSettings *config) +{ + m_views->loadSettings(config); +} + +void Controller::retranslate() +{ + m_views->retranslate(); + m_toolBoxs->retranslate(); +} + +void Controller::setEnabled(bool enabled) +{ + m_views->setEnabled(enabled); +} + +void Controller::clear(void) +{ + m_rxCount = 0; + m_txCount = 0; + m_views->clear(); +} + +void Controller::setPortManager(PortManager *manager) +{ + m_port = manager; + connect(m_port, &PortManager::readyRead, this, &Controller::readPortData); + connect(m_views, &ViewManager::transmitData, this, &Controller::writePortData); +} + +void Controller::readPortData() +{ + if (m_pause == false) { + QByteArray array = m_port->readAll(); + + if (!array.isEmpty()) { + m_rxCount += array.length(); + m_views->receiveData(array); + m_toolBoxs->receiveData(array); + } + } +} + +// 向端口发送数据,带参数 +void Controller::writePortData(const QByteArray &array) +{ + m_txCount += array.length(); + m_port->write(array); +} + +void Controller::setWindowOpacity(qreal level) +{ + m_toolBoxs->setWindowOpacity(level); +} diff --git a/SerialTool/source/defaultconfig.cpp b/SerialTool/src/defaultconfig.cpp similarity index 100% rename from SerialTool/source/defaultconfig.cpp rename to SerialTool/src/defaultconfig.cpp diff --git a/SerialTool/source/main.cpp b/SerialTool/src/main.cpp similarity index 100% rename from SerialTool/source/main.cpp rename to SerialTool/src/main.cpp diff --git a/SerialTool/src/mainwindow.cpp b/SerialTool/src/mainwindow.cpp new file mode 100644 index 0000000..b7d718f --- /dev/null +++ b/SerialTool/src/mainwindow.cpp @@ -0,0 +1,329 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "optionsbox.h" +#include "aboutbox.h" +#include "version.h" +#include "defaultconfig.h" +#include "updatedialog.h" +#include "controller.h" +#include "port/portmanager.h" + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + QString configPath(QStandardPaths::writableLocation( + QStandardPaths::AppConfigLocation) + "/config.ini"); + syncDefaultConfig(configPath); + m_config = new QSettings(configPath, QSettings::IniFormat); + + ui->setupUi(this); + setWindowTitle(SOFTWARE_NAME " V" SOFTWARE_VERSION); + + m_port = new PortManager(ui->toolBar1, ui->portSetAction); + m_controller = new Controller(&m_docPath, + ui->tabWidget, ui->menu_2, ui->actionOpen, ui->actionSave); + m_controller->setPortManager(m_port); + + // 状态栏设置 + m_rxCntLabel = new QLabel("RX: 0Bytes", this); + m_txCntLabel = new QLabel("TX: 0Bytes", this); + m_portInfoLabel = new QLabel("", this); + m_rxCntLabel->setMinimumWidth(120); + m_txCntLabel->setMinimumWidth(120); + m_portInfoLabel->setMinimumWidth(120); + ui->statusBar->addWidget(m_portInfoLabel); + ui->statusBar->addWidget(m_rxCntLabel); + ui->statusBar->addWidget(m_txCntLabel); + + loadConfig(); // 加载配置 + + // create connection between axes and scroll bars: + connect(ui->portRunAction, SIGNAL(triggered()), this, SLOT(changeRunFlag())); + connect(ui->portSwitchAction, SIGNAL(triggered()), this, SLOT(onPortSwitchActionTriggered())); + connect(ui->clearAction, SIGNAL(triggered()), this, SLOT(clear())); + connect(&m_timer, &QTimer::timeout, this, &MainWindow::onSecTimerTimeout); + connect(ui->actionOption, SIGNAL(triggered()), this, SLOT(setOptions())); + connect(ui->actionClose, SIGNAL(triggered()), this, SLOT(close())); + connect(ui->actionVisibleToolbar, SIGNAL(triggered(bool)), ui->toolBar1, SLOT(setVisible(bool))); + connect(ui->actionVisibleStatusBar, SIGNAL(triggered(bool)), ui->statusBar, SLOT(setVisible(bool))); + connect(ui->toolBar1, SIGNAL(visibilityChanged(bool)), ui->actionVisibleToolbar, SLOT(setChecked(bool))); + connect(m_port, SIGNAL(portChanged()), this, SLOT(dispPortStatus())); + connect(m_port, SIGNAL(portError()), this, SLOT(closePort())); + connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(about())); + connect(ui->actionWiki, SIGNAL(triggered()), this, SLOT(openWiki())); + connect(ui->actionStaysOnTop, SIGNAL(triggered()), this, SLOT(onStaysOnTopTriggered())); + connect(ui->actionUpdate, SIGNAL(triggered()), this, SLOT(updateSoftware())); + + m_timer.start(1000); +} + +MainWindow::~MainWindow() +{ + delete ui; + delete m_config; + delete m_rxCntLabel; + delete m_txCntLabel; + delete m_portInfoLabel; +} + +// 关闭事件 +void MainWindow::closeEvent(QCloseEvent *event) +{ + saveConfig(); + QMainWindow::closeEvent(event); +} + +// 加载语言 +void MainWindow::setLanguage(const QString &string) +{ + // 首先卸载翻译 + if (!m_translator.isEmpty()) { + for (int i = 0; i < m_translator.size(); ++i) { + qApp->removeTranslator(m_translator[i]); // 卸载翻译环境 + delete m_translator[i]; + } + m_translator.clear(); + } + // 遍历文件 + QDir dir("language/" + string); + foreach(QFileInfo mfi ,dir.entryInfoList()) { + if (mfi.isFile() && mfi.suffix() == "qm") { // 是翻译文件 + QTranslator* ts = new QTranslator; + ts->load(mfi.absoluteFilePath()); + qApp->installTranslator(ts); // 安装翻译环境 + m_translator.append(ts); + } + } + // 重新翻译界面 + ui->retranslateUi(this); + m_port->retranslate(); + m_controller->retranslate(); +} + +// 加载样式表 +void MainWindow::setStyleSheet(const QString &string) +{ + // 样式表 + QFile qss("themes/" + string + "/style.css"); + qss.open(QFile::ReadOnly); + qApp->setStyleSheet(qss.readAll()); + qss.close(); +} + +// 读取系统设置 +void MainWindow::loadSettings() +{ + // 系统设置 + m_config->beginGroup("Settings"); + + m_port->loadSettings(m_config); + m_controller->loadSettings(m_config); + + // 窗口透明度 + int opacity = m_config->value("WindowOpacity").toInt(); + opacity = opacity < 30 ? 100 : opacity <= 100 ? opacity : 100; + setWindowOpacity(opacity / 100.0); + m_controller->setWindowOpacity(opacity / 100.0); + + // 语言设置 + setLanguage(m_config->value("Language").toString()); + setStyleSheet(m_config->value("Theme").toString()); + + m_config->endGroup(); + + dispPortStatus(); // 更新端口状态显示 +} + +// 控件数据初始化, 在构造函数中初始化各种控件的初始值 +void MainWindow::loadConfig() +{ + // 路经 + m_config->beginGroup("Path"); + m_docPath = m_config->value("DocumentPath").toString(); + m_config->endGroup(); + + m_port->loadConfig(m_config); + m_controller->loadConfig(m_config); + + // 打开页面配置 + m_config->beginGroup("Workspace"); + ui->tabWidget->setCurrentIndex(m_config->value("TabIndex").toInt()); + ui->toolBar1->setVisible(m_config->value("ToolBarVisible").toBool()); + ui->actionVisibleToolbar->setChecked(m_config->value("ToolBarVisible").toBool()); + ui->statusBar->setVisible(m_config->value("StatusBarVisible").toBool()); + // 这里如果直接速读取ui->statusBar->isVisible()会是false,原因不明 + ui->actionVisibleStatusBar->setChecked(m_config->value("StatusBarVisible").toBool()); + setWindowStaysOnTop(m_config->value("WindowStaysOnTop").toBool()); + m_config->endGroup(); + + // 最后读取系统设置 + loadSettings(); +} + +// 保存配置 +void MainWindow::saveConfig() +{ + // 打开页面配置 + m_config->beginGroup("Workspace"); + m_config->setValue("TabIndex", + QVariant(ui->tabWidget->currentIndex())); + m_config->setValue("ToolBarVisible", QVariant(ui->toolBar1->isVisible())); + m_config->setValue("StatusBarVisible", QVariant(ui->statusBar->isVisible())); + m_config->setValue("WindowStaysOnTop", QVariant((windowFlags() & Qt::WindowStaysOnTopHint) != 0)); + m_config->endGroup(); + + // 路经 + m_config->beginGroup("Path"); + m_config->setValue("DocumentPath", QVariant(m_docPath)); + m_config->endGroup(); + + m_port->saveConfig(m_config); + m_controller->saveConfig(m_config); +} + +void MainWindow::setOptions() +{ + OptionsBox option(this); + option.exec(); +} + +// 保存文件 +void MainWindow::saveFile() +{ + +} + +// 打开文件 +void MainWindow::openFile() +{ +} + +void MainWindow::changeRunFlag() +{ + if (m_runFlag == true) { + m_runFlag = false; + QIcon icon(":/SerialTool/images/start.ico"); + ui->portRunAction->setIcon(icon); + ui->portRunAction->setText(tr("Start Tx/Rx")); + } else { + m_runFlag = true; + QIcon icon(":/SerialTool/images/pause.ico"); + ui->portRunAction->setIcon(icon); + ui->portRunAction->setText(tr("Pause Tx/Rx")); + } + m_controller->setEnabled(m_runFlag); +} + +// 状态栏显示端口状态 +void MainWindow::dispPortStatus() +{ + bool status = false; + QString string; + QPalette palette; + + status = m_port->portStatus(string); + palette.setColor(QPalette::WindowText, status ? Qt::darkGreen : Qt::red); + m_portInfoLabel->setText(string); + m_portInfoLabel->setPalette(palette); +} + +// 秒定时器溢出槽函数 +void MainWindow::onSecTimerTimeout() +{ + QString str; + + // 更新显示信息 + str = "RX: " + QString::number(m_controller->receiveCount()) + "Bytes"; + m_rxCntLabel->setText(str); + str = "TX: " + QString::number(m_controller->transmitCount()) + "Bytes"; + m_txCntLabel->setText(str); +} + +// 打开端口 +void MainWindow::openPort() +{ + if (m_port->open()) { + QIcon icon(":/SerialTool/images/close.ico"); + ui->portSwitchAction->setIcon(icon); + ui->portSwitchAction->setText(tr("Close Port")); + ui->portRunAction->setEnabled(true); + m_controller->setEnabled(m_runFlag); + dispPortStatus(); // 更新端口状态显示 + } +} + +void MainWindow::closePort() +{ + if (m_port->isOpen()) { + m_port->close(); + } + QIcon icon(":/SerialTool/images/connect.ico"); + ui->portSwitchAction->setIcon(icon); + ui->portSwitchAction->setText(tr("Open Port")); + ui->portRunAction->setEnabled(false); + m_controller->setEnabled(false); + dispPortStatus(); // 更新端口状态显示 +} + +// 打开串口槽函数 +void MainWindow::onPortSwitchActionTriggered() +{ + if (ui->portRunAction->isEnabled() == true) { // 现在需要关闭端口 + closePort(); + } else { // 端口关闭时打开端口 + openPort(); + } +} + +void MainWindow::clear() +{ + m_controller->clear(); +} + +void MainWindow::setWindowStaysOnTop(bool enabled) +{ + QString str = enabled ? ":/SerialTool/images/pin_down.ico" + : ":/SerialTool/images/pin_up.ico"; + + ui->actionStaysOnTop->setIcon(QIcon(str)); + if (enabled) { + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + } else { + setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); + } + show(); +} + +void MainWindow::onStaysOnTopTriggered() +{ + setWindowStaysOnTop(!(windowFlags() & Qt::WindowStaysOnTopHint)); +} + +void MainWindow::about() +{ + AboutBox aboutBox(this); + + aboutBox.exec(); +} + +void MainWindow::openWiki() +{ + QDesktopServices::openUrl(QUrl("https://github.com/gztss/SerialTool/wiki")); +} + +void MainWindow::updateSoftware() +{ + UpdateDialog *dialog = new UpdateDialog(this); + + dialog->exec(); + dialog->deleteLater(); +} diff --git a/SerialTool/source/optionsbox.cpp b/SerialTool/src/optionsbox.cpp similarity index 99% rename from SerialTool/source/optionsbox.cpp rename to SerialTool/src/optionsbox.cpp index be29278..0c13f87 100644 --- a/SerialTool/source/optionsbox.cpp +++ b/SerialTool/src/optionsbox.cpp @@ -111,7 +111,7 @@ void OptionsBox::setup() ui->useOpenGLBox->setChecked(config->value("UseOpenGL").toBool()); ui->useAntiBox->setChecked(config->value("UseAntialias").toBool()); ui->updateIntervalBox->setValue(config->value("UpdateInterval").toInt()); - ui->portTypeBox->setCurrentIndex(config->value("PortType").toInt()); + ui->portTypeBox->setCurrentText(config->value("PortType").toString()); language = config->value("Language").toString(); theme = config->value("Theme").toString(); ui->tabWidthBox->setValue(config->value("TerminalTabWidth").toInt()); @@ -163,7 +163,7 @@ void OptionsBox::processOptions(QAbstractButton *button) config->setValue("UseOpenGL", QVariant(ui->useOpenGLBox->isChecked())); config->setValue("UseAntialias", QVariant(ui->useAntiBox->isChecked())); config->setValue("UpdateInterval", QVariant(ui->updateIntervalBox->value())); - config->setValue("PortType", QVariant(ui->portTypeBox->currentIndex())); + config->setValue("PortType", QVariant(ui->portTypeBox->currentText())); config->setValue("Language", QVariant(language)); config->setValue("Theme", QVariant(ui->themeBox->currentText())); config->setValue("TerminalTabWidth", QVariant(ui->tabWidthBox->value())); diff --git a/SerialTool/src/port/abstractport.h b/SerialTool/src/port/abstractport.h new file mode 100644 index 0000000..43ecbc6 --- /dev/null +++ b/SerialTool/src/port/abstractport.h @@ -0,0 +1,40 @@ +#ifndef ABSTRACTPORT_H +#define ABSTRACTPORT_H + +#include + +class QSettings; + +class AbstractPort : public QWidget +{ + Q_OBJECT +public: + explicit AbstractPort(QWidget *parent = nullptr) : QWidget(parent) {} + + virtual void retranslate() {} + virtual void loadConfig(QSettings *config) = 0; + virtual void saveConfig(QSettings *config) = 0; + virtual bool open() = 0; + virtual void close() = 0; + virtual QByteArray readAll() = 0; + virtual void write(const QByteArray &data) = 0; + virtual bool portStatus(QString &string) = 0; + virtual bool isOpen() = 0; + virtual bool usePortSetDialog() { return false; } + virtual void portSetDialog() {} + +signals: + void readyRead(); + void portError(); + void portChanged(); +}; + +class AbstractPortFactory +{ +public: + AbstractPortFactory() {} + virtual AbstractPort* create(QWidget *parent = nullptr) = 0; + virtual QString type() = 0; +}; + +#endif // ABSTRACTPORT_H diff --git a/SerialTool/src/port/portmanager.cpp b/SerialTool/src/port/portmanager.cpp new file mode 100644 index 0000000..e8080db --- /dev/null +++ b/SerialTool/src/port/portmanager.cpp @@ -0,0 +1,112 @@ +#include "portmanager.h" +#include "abstractport.h" +#include "serialport.h" +#include "tcpudpport.h" +#include +#include +#include +#include + +PortManager::PortManager(QToolBar *toolbar, QAction *portSetAction) +{ + m_portFactorys = new QVector; + + m_toolbar = toolbar; + m_portSetAction = portSetAction; + + m_portFactorys->append(new SerialPortFactory); + m_portFactorys->append(new TcpUdpPortFactory); + + m_currentPortType = m_portFactorys->at(0)->type(); + setupPort(m_portFactorys->at(0)->create(toolbar)); +} + +void PortManager::retranslate() +{ + m_currentPort->retranslate(); +} + +void PortManager::loadConfig(QSettings *config) +{ + m_config = config; + m_currentPort->loadConfig(config); +} + +void PortManager::saveConfig(QSettings *config) +{ + m_currentPort->saveConfig(config); +} + +void PortManager::loadSettings(QSettings *config) +{ + QString type = config->value("PortType").toString(); + + m_config->endGroup(); // Group "Settings" + for (AbstractPortFactory *factory : *m_portFactorys) { + if (factory->type() == type && type != m_currentPortType) { + m_currentPortType = type; + if (m_currentPort->isOpen()) { + m_currentPort->close(); + emit portError(); // close port action + } + m_currentPort->saveConfig(config); + delete m_currentPort; + setupPort(factory->create(m_toolbar)); + m_currentPort->loadConfig(config); + break; + } + } + m_config->beginGroup("Settings"); +} + +bool PortManager::open() +{ + return m_currentPort->open(); +} + +void PortManager::close() +{ + return m_currentPort->close(); +} + +QByteArray PortManager::readAll() +{ + return m_currentPort->readAll(); +} + +void PortManager::write(const QByteArray &data) +{ + m_currentPort->write(data); +} + +bool PortManager::portStatus(QString &string) +{ + return m_currentPort->portStatus(string); +} + +bool PortManager::isOpen() +{ + return m_currentPort->isOpen(); +} + +void PortManager::portSetDialog() +{ + m_currentPort->portSetDialog(); +} + +void PortManager::setupPort(AbstractPort *port) +{ + m_currentPort = port; + m_toolbar->insertWidget(m_portSetAction, port); + + if (m_currentPort->usePortSetDialog()) { + m_portSetAction->setVisible(true); + connect(m_portSetAction, &QAction::triggered, m_currentPort, &AbstractPort::portSetDialog); + } else { + m_portSetAction->setVisible(false); + } + + connect(port, &AbstractPort::readyRead, this, &PortManager::readyRead); + connect(port, &AbstractPort::portError, this, &PortManager::portError); + connect(port, &AbstractPort::portChanged, this, &PortManager::portChanged); +} diff --git a/SerialTool/src/port/portmanager.h b/SerialTool/src/port/portmanager.h new file mode 100644 index 0000000..458579f --- /dev/null +++ b/SerialTool/src/port/portmanager.h @@ -0,0 +1,46 @@ +#ifndef PORTMANAGER_H +#define PORTMANAGER_H + +#include + +class QAction; +class QToolBar; +class QSettings; +class AbstractPort; +class AbstractPortFactory; + +class PortManager : public QObject +{ + Q_OBJECT +public: + explicit PortManager(QToolBar *toolbar, QAction *portSetAction); + void retranslate(); + void loadConfig(QSettings *config); + void saveConfig(QSettings *config); + void loadSettings(QSettings *config); + bool open(); + void close(); + QByteArray readAll(); + void write(const QByteArray &data); + bool portStatus(QString &string); + bool isOpen(); + void portSetDialog(); + +signals: + void readyRead(); + void portError(); + void portChanged(); + +private: + void setupPort(AbstractPort *port); + +private: + QVector *m_portFactorys; + AbstractPort *m_currentPort; + QString m_currentPortType; + QAction *m_portSetAction; + QToolBar *m_toolbar; + QSettings *m_config; +}; + +#endif // PORTMANAGER_H diff --git a/SerialTool/source/serialport.cpp b/SerialTool/src/port/serialport.cpp similarity index 99% rename from SerialTool/source/serialport.cpp rename to SerialTool/src/port/serialport.cpp index b7a04f5..902a171 100644 --- a/SerialTool/source/serialport.cpp +++ b/SerialTool/src/port/serialport.cpp @@ -11,7 +11,7 @@ #include SerialPort::SerialPort(QWidget *parent) : - QWidget(parent), + AbstractPort(parent), ui(new Ui::SerialPort) { ui->setupUi(this); diff --git a/SerialTool/include/serialport.h b/SerialTool/src/port/serialport.h similarity index 72% rename from SerialTool/include/serialport.h rename to SerialTool/src/port/serialport.h index 62d67f4..cf56d22 100644 --- a/SerialTool/include/serialport.h +++ b/SerialTool/src/port/serialport.h @@ -1,7 +1,7 @@ #ifndef SERIALPORT_H #define SERIALPORT_H -#include +#include "abstractport.h" class QSerialPort; class QSettings; @@ -10,7 +10,7 @@ namespace Ui { class SerialPort; } -class SerialPort : public QWidget +class SerialPort : public AbstractPort { Q_OBJECT @@ -27,13 +27,9 @@ class SerialPort : public QWidget void write(const QByteArray &data); bool portStatus(QString &string); bool isOpen(); + bool usePortSetDialog() { return true; } void portSetDialog(); -signals: - void readyRead(); - void portError(); - void portChanged(); - private: void scanPort(); @@ -51,4 +47,12 @@ private slots: QTimer *timer; }; +class SerialPortFactory : public AbstractPortFactory +{ +public: + AbstractPort* create(QWidget *parent = nullptr) { return new SerialPort(parent); } + QString type() { return "Serial Port"; } +}; + + #endif // SERIALPORT_H diff --git a/SerialTool/source/tcpudpport.cpp b/SerialTool/src/port/tcpudpport.cpp similarity index 99% rename from SerialTool/source/tcpudpport.cpp rename to SerialTool/src/port/tcpudpport.cpp index 445d7ce..0e23f7e 100644 --- a/SerialTool/source/tcpudpport.cpp +++ b/SerialTool/src/port/tcpudpport.cpp @@ -5,7 +5,7 @@ #include TcpUdpPort::TcpUdpPort(QWidget *parent) : - QWidget(parent), + AbstractPort(parent), ui(new Ui::TcpUdpPort) { ui->setupUi(this); @@ -17,7 +17,7 @@ TcpUdpPort::TcpUdpPort(QWidget *parent) : pReg = new QRegExpValidator(regExpNetPort, this); ui->portEdit->setValidator(pReg); - protocolChanged(); + emit portChanged(); connect(ui->protocolBox, &QComboBox::currentTextChanged, this, &TcpUdpPort::onProtocolChanged); connect(ui->ipEdit, &QLineEdit::textEdited, this, &TcpUdpPort::ipAddressEdited); @@ -83,7 +83,7 @@ void TcpUdpPort::onProtocolChanged() ui->ipEdit->setReadOnly(false); ui->ipEdit->setText(serverIP); } - emit protocolChanged(); + emit portChanged(); } // get localhost address @@ -359,5 +359,5 @@ void TcpUdpPort::onError() tr("The remote host closed the connection."), QMessageBox::Cancel, this); err.exec(); - emit connectionError(); + emit portError(); } diff --git a/SerialTool/include/tcpudpport.h b/SerialTool/src/port/tcpudpport.h similarity index 80% rename from SerialTool/include/tcpudpport.h rename to SerialTool/src/port/tcpudpport.h index 0d227c4..e50b6e8 100644 --- a/SerialTool/include/tcpudpport.h +++ b/SerialTool/src/port/tcpudpport.h @@ -1,7 +1,7 @@ #ifndef TCPUDPPORT_H #define TCPUDPPORT_H -#include +#include "abstractport.h" #include namespace Ui { @@ -14,7 +14,7 @@ class QTcpServer; class QUdpSocket; class QHostAddress; -class TcpUdpPort : public QWidget +class TcpUdpPort : public AbstractPort { Q_OBJECT @@ -25,7 +25,7 @@ class TcpUdpPort : public QWidget }; public: - explicit TcpUdpPort(QWidget *parent = 0); + explicit TcpUdpPort(QWidget *parent = nullptr); ~TcpUdpPort(); void loadConfig(QSettings *config); void saveConfig(QSettings *config); @@ -38,11 +38,6 @@ class TcpUdpPort : public QWidget void retranslate(); bool portStatus(QString &string); -signals: - void protocolChanged(); - void readyRead(); - void connectionError(); - private: QString localHost(); bool openTcpClient(); @@ -70,4 +65,11 @@ private slots: QByteArray readArray; }; +class TcpUdpPortFactory : public AbstractPortFactory +{ +public: + AbstractPort* create(QWidget *parent = nullptr) { return new TcpUdpPort(parent); } + QString type() { return "TCP/UDP"; } +}; + #endif // TCPUDPPORT_H diff --git a/SerialTool/source/portsetbox.cpp b/SerialTool/src/portsetbox.cpp similarity index 100% rename from SerialTool/source/portsetbox.cpp rename to SerialTool/src/portsetbox.cpp diff --git a/SerialTool/src/toolbox/abstracttoolbox.h b/SerialTool/src/toolbox/abstracttoolbox.h new file mode 100644 index 0000000..06efb81 --- /dev/null +++ b/SerialTool/src/toolbox/abstracttoolbox.h @@ -0,0 +1,39 @@ +#ifndef ABSTRACTTOOLBOX_H +#define ABSTRACTTOOLBOX_H + +#include + +class AbstractToolBox : public QDialog +{ + Q_OBJECT +public: + explicit AbstractToolBox(QWidget *parent = nullptr) : QDialog(parent) {} + + virtual void retranslate() {} + virtual void receiveData(const QByteArray &array) { (void)array; } + virtual void setFilePath(const QString &path) { (void)path; } +}; + +class AbstractToolBoxFactory : public QObject +{ + Q_OBJECT +public: + AbstractToolBoxFactory() {} + virtual AbstractToolBox* create(QWidget *parent = nullptr) = 0; + virtual QString title() { return "Tool Box"; } + + AbstractToolBox *product() { return m_product; } + + void setProduct(AbstractToolBox *product) { + m_product = product; + connect(product, SIGNAL(destroyed()), this, SLOT(toolBoxDestroyed())); + } + +private slots: + void toolBoxDestroyed() { m_product = nullptr; } + +private: + AbstractToolBox *m_product = nullptr; +}; + +#endif // ABSTRACTTOOLBOX_H diff --git a/SerialTool/src/toolbox/toolboxmanager.cpp b/SerialTool/src/toolbox/toolboxmanager.cpp new file mode 100644 index 0000000..b18ffb0 --- /dev/null +++ b/SerialTool/src/toolbox/toolboxmanager.cpp @@ -0,0 +1,82 @@ +#include "toolboxmanager.h" +#include "abstracttoolbox.h" +#include "vediobox/vediobox.h" +#include "valuedisplay/valuedisplay.h" +#include +#include + +ToolBoxManager::ToolBoxManager(QString *docPath, QMenu *menu) +{ + m_actions = new QVector; + m_factorys = new QVector; + m_docPath = docPath; + m_parent = menu; + + m_factorys->append(new ValueDisplayFactory()); + m_factorys->append(new VedioBoxFactory()); + + for (AbstractToolBoxFactory *factory : *m_factorys) { + QAction *action = new QAction(menu); + + action->setText(factory->title()); + m_actions->append(action); + menu->addAction(action); + connect(action, SIGNAL(triggered(bool)), this, SLOT(onActionTriggered())); + } +} + +ToolBoxManager::~ToolBoxManager() +{ + for (AbstractToolBoxFactory *factory : *m_factorys) { + delete factory; + } + delete m_factorys; +} + +void ToolBoxManager::onActionTriggered() +{ + int index = m_actions->indexOf((QAction *)sender()); + AbstractToolBoxFactory *factory = m_factorys->at(index); + + if (factory->product() == nullptr) { + AbstractToolBox *toolBox = factory->create(m_parent); + + factory->setProduct(toolBox); + toolBox->setModal(false); // 非模态对话框 + toolBox->setAttribute(Qt::WA_DeleteOnClose); + toolBox->setFilePath(*m_docPath); + toolBox->setWindowOpacity(m_opacity); + toolBox->show(); + } +} + +void ToolBoxManager::retranslate() +{ + for (int i = 0; i < m_factorys->size(); ++i) { + AbstractToolBoxFactory *factory = m_factorys->at(i); + + if (factory->product() != nullptr) { + factory->product()->retranslate(); + } + m_actions->at(i)->setText(factory->title()); + } +} + +void ToolBoxManager::receiveData(const QByteArray &array) +{ + for (AbstractToolBoxFactory *factory : *m_factorys) { + if (factory->product() != nullptr) { + factory->product()->receiveData(array); + } + } +} + +void ToolBoxManager::setWindowOpacity(qreal level) +{ + m_opacity = level; + for (AbstractToolBoxFactory *factory : *m_factorys) { + if (factory->product() != nullptr) { + factory->product()->setWindowOpacity(level); + } + } +} diff --git a/SerialTool/src/toolbox/toolboxmanager.h b/SerialTool/src/toolbox/toolboxmanager.h new file mode 100644 index 0000000..50c107c --- /dev/null +++ b/SerialTool/src/toolbox/toolboxmanager.h @@ -0,0 +1,34 @@ +#ifndef TOOLBOXMANAGER_H +#define TOOLBOXMANAGER_H + +#include + +class QMenu; +class QAction; +class QWidget; +class AbstractToolBox; +class AbstractToolBoxFactory; + +class ToolBoxManager : public QObject +{ + Q_OBJECT +public: + ToolBoxManager(QString *docPath, QMenu *menu); + ~ToolBoxManager(); + + void retranslate(); + void receiveData(const QByteArray &array); + void setWindowOpacity(qreal level); + +private slots: + void onActionTriggered(); + +private: + qreal m_opacity = 1.0; + QWidget *m_parent; + QString *m_docPath; + QVector *m_actions; + QVector *m_factorys; +}; + +#endif // TOOLBOXEDIATOR_H diff --git a/SerialTool/source/valuedisplay.cpp b/SerialTool/src/toolbox/valuedisplay/valuedisplay.cpp similarity index 92% rename from SerialTool/source/valuedisplay.cpp rename to SerialTool/src/toolbox/valuedisplay/valuedisplay.cpp index 56e302a..c55a705 100644 --- a/SerialTool/source/valuedisplay.cpp +++ b/SerialTool/src/toolbox/valuedisplay/valuedisplay.cpp @@ -2,7 +2,7 @@ #include "ui_valuedisplay.h" ValueDisplay::ValueDisplay(QWidget *parent) : - QDialog(parent), + AbstractToolBox(parent), ui(new Ui::ValueDisplay) { // 不显示问号 @@ -13,7 +13,6 @@ ValueDisplay::ValueDisplay(QWidget *parent) : ui->setupUi(this); setAttribute(Qt::WA_WState_WindowOpacitySet); - setWindowOpacity(0.7); ui->tableWidget->horizontalHeader()->setStretchLastSection(true); ui->tableWidget->setColumnWidth(0, 140); @@ -25,7 +24,12 @@ ValueDisplay::~ValueDisplay() delete ui; } -void ValueDisplay::append(const QByteArray &array) +void ValueDisplay::retranslate() +{ + ui->retranslateUi(this); +} + +void ValueDisplay::receiveData(const QByteArray &array) { m_array.append(array); diff --git a/SerialTool/src/toolbox/valuedisplay/valuedisplay.h b/SerialTool/src/toolbox/valuedisplay/valuedisplay.h new file mode 100644 index 0000000..d078105 --- /dev/null +++ b/SerialTool/src/toolbox/valuedisplay/valuedisplay.h @@ -0,0 +1,33 @@ +#ifndef VALUEDISPLAY_H +#define VALUEDISPLAY_H + +#include "../abstracttoolbox.h" + +namespace Ui { +class ValueDisplay; +} + +class ValueDisplay : public AbstractToolBox +{ + Q_OBJECT + +public: + explicit ValueDisplay(QWidget *parent = 0); + ~ValueDisplay(); + void retranslate(); + void receiveData(const QByteArray &array); + +private: + Ui::ValueDisplay *ui; + QByteArray m_array; +}; + +class ValueDisplayFactory : public AbstractToolBoxFactory +{ + Q_OBJECT +public: + AbstractToolBox* create(QWidget *parent = nullptr) { return new ValueDisplay(parent); } + QString title() { return tr("Value Display"); } +}; + +#endif // VALUEDISPLAY_H diff --git a/SerialTool/source/vediobox.cpp b/SerialTool/src/toolbox/vediobox/vediobox.cpp similarity index 79% rename from SerialTool/source/vediobox.cpp rename to SerialTool/src/toolbox/vediobox/vediobox.cpp index dc83ea1..e7b4ea1 100644 --- a/SerialTool/source/vediobox.cpp +++ b/SerialTool/src/toolbox/vediobox/vediobox.cpp @@ -5,7 +5,7 @@ #include VedioBox::VedioBox(QWidget *parent) : - QDialog(parent), + AbstractToolBox(parent), ui(new Ui::VedioBox) { // 不显示问号 @@ -26,12 +26,17 @@ VedioBox::~VedioBox() delete ui; } -// 添加一字节数据 -void VedioBox::append(const QByteArray &arr) + +void VedioBox::retranslate() +{ + ui->retranslateUi(this); +} + +void VedioBox::receiveData(const QByteArray &array) { - array.append(arr); - qint32 i, len = array.size() - 1; - const char *data = array.data(); + m_array.append(array); + qint32 i, len = m_array.size() - 1; + const char *data = m_array.data(); for (i = 0; i < len; ++i) { if ((quint8)data[i] == 0x0B && (quint8)data[i + 1] == 0xBB) { @@ -39,17 +44,17 @@ void VedioBox::append(const QByteArray &arr) } } if (i != 0 && i < len) { // 匹配到内容 - array = array.mid(i); // 保留余下内容 + m_array = m_array.mid(i); // 保留余下内容 } // 检查是否接收到一幅图像 - if ((quint8)array.data()[0] == 0x0B - && (quint8)array.data()[1] == 0xBB - && array.size() >= 602) { + if ((quint8)m_array.data()[0] == 0x0B + && (quint8)m_array.data()[1] == 0xBB + && m_array.size() >= 602) { QPixmap pixmap(80, 60); QPainter painter(&pixmap); pixmap.fill(Qt::white); - data = array.data() + 2; + data = m_array.data() + 2; for (int y = 0; y < 60; ++y) { for (int x = 0; x < 10; ++x) { quint8 byte = (quint8)*data++; @@ -62,8 +67,8 @@ void VedioBox::append(const QByteArray &arr) } ui->label->setPixmap(pixmap.scaled(QSize(320, 240))); image = pixmap; // 保存图像 - memcpy(imageData, array.data() + 2, 600); // 复制到缓冲区 - array = array.mid(602); // 保留余下内容 + memcpy(imageData, m_array.data() + 2, 600); // 复制到缓冲区 + m_array = m_array.mid(602); // 保留余下内容 } } diff --git a/SerialTool/src/toolbox/vediobox/vediobox.h b/SerialTool/src/toolbox/vediobox/vediobox.h new file mode 100644 index 0000000..9b18558 --- /dev/null +++ b/SerialTool/src/toolbox/vediobox/vediobox.h @@ -0,0 +1,41 @@ +#ifndef __VEDIOBOX_H +#define __VEDIOBOX_H + +#include "../abstracttoolbox.h" + +namespace Ui { + class VedioBox; +} + +class VedioBox : public AbstractToolBox +{ + Q_OBJECT + +public: + VedioBox(QWidget *parent = nullptr); + ~VedioBox(); + void retranslate(); + void receiveData(const QByteArray &array); + void setFilePath(const QString &path); + +private slots: + void saveImage(); + void copyImage(); + +private: + Ui::VedioBox *ui; + QByteArray m_array; + QPixmap image; + char imageData[600]; + QString filePath; +}; + +class VedioBoxFactory : public AbstractToolBoxFactory +{ + Q_OBJECT +public: + AbstractToolBox* create(QWidget *parent = nullptr) { return new VedioBox(parent); } + QString title() { return tr("Video Box"); } +}; + +#endif diff --git a/SerialTool/source/updatedialog.cpp b/SerialTool/src/updatedialog.cpp similarity index 96% rename from SerialTool/source/updatedialog.cpp rename to SerialTool/src/updatedialog.cpp index a7cc1d2..7f9523a 100644 --- a/SerialTool/source/updatedialog.cpp +++ b/SerialTool/src/updatedialog.cpp @@ -24,10 +24,6 @@ UpdateDialog::UpdateDialog(QWidget *parent) : ui->setupUi(this); setFixedSize(400, 400); // 不能伸缩的对话框 - QPalette pal(palette()); - pal.setColor(QPalette::Background, Qt::white); //设置背景色 - setAutoFillBackground(true); - setPalette(pal); QPixmap pix(":/SerialTool/images/logo.ico"); pix = pix.scaledToWidth(64, Qt::SmoothTransformation); ui->label_2->setPixmap(pix); @@ -95,12 +91,12 @@ void UpdateDialog::checkUpdateFinished(QNetworkReply *reply) connect(ui->updateBtn, SIGNAL(released()), this, SLOT(startUpdate())); } } else { - m_revInfo = tr("SerialTool
Current Version: ") + SOFTWARE_VERSION + + m_revInfo = tr("SerialTool
Current Version: V") + SOFTWARE_VERSION + tr("
This is the latest version.

"); ui->label->setText(m_revInfo); } } else { - m_revInfo = tr("SerialTool
Current Version: ") + SOFTWARE_VERSION + + m_revInfo = tr("SerialTool
Current Version: V") + SOFTWARE_VERSION + tr("
Network error.

"); ui->label->setText(m_revInfo); } diff --git a/SerialTool/src/views/abstractview.h b/SerialTool/src/views/abstractview.h new file mode 100644 index 0000000..1157188 --- /dev/null +++ b/SerialTool/src/views/abstractview.h @@ -0,0 +1,38 @@ +#ifndef ABSTRACTVIEW_H +#define ABSTRACTVIEW_H + +#include + +class QSettings; + +class AbstractView : public QWidget +{ + Q_OBJECT +public: + explicit AbstractView(QWidget *parent = nullptr) : QWidget(parent) {} + virtual void loadConfig(QSettings *config) = 0; + virtual void saveConfig(QSettings *config) = 0; + virtual void loadSettings(QSettings *config) = 0; + virtual void retranslate() {} + virtual QString title() { return "Abstract View"; } + virtual void receiveData(const QByteArray &array) = 0; + virtual bool holdReceive() { return false; } + virtual void setEnabled(bool enabled) = 0; + virtual void clear() {} + + virtual QString openFileFilter() { return QString(); } + virtual QString saveFileFilter() { return QString(); } + virtual void saveFile(const QString &fileName, const QString &filter) { + (void)fileName; (void)filter; + } + virtual void openFile(const QString &fileName, const QString &filter) { + (void)fileName; (void)filter; + } + +signals: + void transmitData(const QByteArray &); + +public slots: +}; + +#endif // ABSTRACTVIEW_H diff --git a/SerialTool/source/filethread.cpp b/SerialTool/src/views/filetransmit/filethread.cpp similarity index 100% rename from SerialTool/source/filethread.cpp rename to SerialTool/src/views/filetransmit/filethread.cpp diff --git a/SerialTool/include/filethread.h b/SerialTool/src/views/filetransmit/filethread.h similarity index 100% rename from SerialTool/include/filethread.h rename to SerialTool/src/views/filetransmit/filethread.h diff --git a/SerialTool/source/filetransmitview.cpp b/SerialTool/src/views/filetransmit/filetransmitview.cpp similarity index 94% rename from SerialTool/source/filetransmitview.cpp rename to SerialTool/src/views/filetransmit/filetransmitview.cpp index 766940c..30f4ac8 100644 --- a/SerialTool/source/filetransmitview.cpp +++ b/SerialTool/src/views/filetransmit/filetransmitview.cpp @@ -8,7 +8,7 @@ // 构造函数 FileTransmitView::FileTransmitView(QWidget *parent) : - QWidget(parent), + AbstractView(parent), ui(new Ui::FileTransmitView) { ui->setupUi(this); @@ -63,6 +63,16 @@ void FileTransmitView::saveConfig(QSettings *config) config->endGroup(); } +void FileTransmitView::loadSettings(QSettings *config) +{ + (void)config; +} + +void FileTransmitView::setEnabled(bool enabled) +{ + (void)enabled; +} + // 打开文件按钮按下 void FileTransmitView::browseButtonClicked() { @@ -126,13 +136,13 @@ void FileTransmitView::sendFile() void FileTransmitView::portSendData(const QByteArray &array) { QString string; - emit sendData(array); + emit transmitData(array); ui->progressBar->setValue(thread.progress()); } // 接收数据 -void FileTransmitView::readData(const QByteArray &array) +void FileTransmitView::receiveData(const QByteArray &array) { thread.readData(array); } @@ -171,7 +181,7 @@ void FileTransmitView::beforceSend() QTextCodec *code = QTextCodec::codecForName("GB-2312"); QByteArray arr = code->fromUnicode(ui->beforeSendEdit->toPlainText()); - emit sendData(arr); + emit transmitData(arr); } } diff --git a/SerialTool/include/filetransmitview.h b/SerialTool/src/views/filetransmit/filetransmitview.h similarity index 70% rename from SerialTool/include/filetransmitview.h rename to SerialTool/src/views/filetransmit/filetransmitview.h index 8883535..0876c4b 100644 --- a/SerialTool/include/filetransmitview.h +++ b/SerialTool/src/views/filetransmit/filetransmitview.h @@ -1,27 +1,30 @@ #ifndef __FILETRANSFERVIEW_H #define __FILETRANSFERVIEW_H -#include +#include "../abstractview.h" #include "filethread.h" namespace Ui { class FileTransmitView; } -class QSettings; -class FileTransmitView : public QWidget +class FileTransmitView : public AbstractView { Q_OBJECT public: - FileTransmitView(QWidget *parent = Q_NULLPTR); + FileTransmitView(QWidget *parent = nullptr); ~FileTransmitView(); + + QString title() { return tr("File Transmit"); } void retranslate(); void loadConfig(QSettings *config); void saveConfig(QSettings *config); + void loadSettings(QSettings *config); + void setEnabled(bool enabled); public slots: - void readData(const QByteArray &array); + void receiveData(const QByteArray &array); void cancelTransfer(); void logOut(const QString &string, QColor color = Qt::black); @@ -35,9 +38,6 @@ private slots: void onTransFinsh(); void onTimeoutError(); -signals: - void sendData(const QByteArray &); - private: Ui::FileTransmitView *ui; FileThread thread; diff --git a/SerialTool/source/xmodem.cpp b/SerialTool/src/views/filetransmit/xmodem.cpp similarity index 100% rename from SerialTool/source/xmodem.cpp rename to SerialTool/src/views/filetransmit/xmodem.cpp diff --git a/SerialTool/include/xmodem.h b/SerialTool/src/views/filetransmit/xmodem.h similarity index 100% rename from SerialTool/include/xmodem.h rename to SerialTool/src/views/filetransmit/xmodem.h diff --git a/SerialTool/include/xmodem_crc16.h b/SerialTool/src/views/filetransmit/xmodem_crc16.h similarity index 100% rename from SerialTool/include/xmodem_crc16.h rename to SerialTool/src/views/filetransmit/xmodem_crc16.h diff --git a/SerialTool/source/channelitem.cpp b/SerialTool/src/views/oscilloscope/channelitem.cpp similarity index 100% rename from SerialTool/source/channelitem.cpp rename to SerialTool/src/views/oscilloscope/channelitem.cpp diff --git a/SerialTool/include/channelitem.h b/SerialTool/src/views/oscilloscope/channelitem.h similarity index 100% rename from SerialTool/include/channelitem.h rename to SerialTool/src/views/oscilloscope/channelitem.h diff --git a/SerialTool/source/oscilloscope.cpp b/SerialTool/src/views/oscilloscope/oscilloscopeview.cpp similarity index 76% rename from SerialTool/source/oscilloscope.cpp rename to SerialTool/src/views/oscilloscope/oscilloscopeview.cpp index 59a137e..4e4741b 100644 --- a/SerialTool/source/oscilloscope.cpp +++ b/SerialTool/src/views/oscilloscope/oscilloscopeview.cpp @@ -1,5 +1,5 @@ -#include "oscilloscope.h" -#include "ui_oscilloscope.h" +#include "oscilloscopeview.h" +#include "ui_oscilloscopeview.h" #include #include #include @@ -14,19 +14,19 @@ #include "wavedecode.h" #include "pointdatabuffer.h" -#define SCALE (1000.0 / _xRange) +#define CH_NUM 16 QT_CHARTS_USE_NAMESPACE -Oscilloscope::Oscilloscope(QWidget *parent) : - QWidget(parent), - ui(new Ui::Oscilloscope), +OscilloscopeView::OscilloscopeView(QWidget *parent) : + AbstractView(parent), + ui(new Ui::OscilloscopeView), m_chart(0), m_timer(new QTimer(this)), m_decode(new WaveDecode) { m_chart = new QChart; - ui->setupUi(parent); + ui->setupUi(this); m_timeStamp = new OscopeTimeStamp(); m_xRange = 0; @@ -39,19 +39,19 @@ Oscilloscope::Oscilloscope(QWidget *parent) : m_timer->setInterval(25); - connect(ui->horizontalScrollBar, &QAbstractSlider::sliderMoved, this, &Oscilloscope::horzScrollBarMoved); - connect(ui->horizontalScrollBar, &QAbstractSlider::actionTriggered, this, &Oscilloscope::horzScrollBarActionTriggered); + connect(ui->horizontalScrollBar, &QAbstractSlider::sliderMoved, this, &OscilloscopeView::horzScrollBarMoved); + connect(ui->horizontalScrollBar, &QAbstractSlider::actionTriggered, this, &OscilloscopeView::horzScrollBarActionTriggered); connect(ui->yOffsetBox, static_cast - (&QDoubleSpinBox::valueChanged), this, &Oscilloscope::yOffsetChanged); + (&QDoubleSpinBox::valueChanged), this, &OscilloscopeView::yOffsetChanged); connect(ui->yRangeBox, static_cast - (&QDoubleSpinBox::valueChanged), this, &Oscilloscope::yRangeChanged); - connect(ui->xRangeBox, &QComboBox::currentTextChanged, this, &Oscilloscope::xRangeChanged); - connect(m_timer, &QTimer::timeout, this, &Oscilloscope::timeUpdata); + (&QDoubleSpinBox::valueChanged), this, &OscilloscopeView::yRangeChanged); + connect(ui->xRangeBox, &QComboBox::currentTextChanged, this, &OscilloscopeView::xRangeChanged); + connect(m_timer, &QTimer::timeout, this, &OscilloscopeView::timeUpdata); clear(); } -Oscilloscope::~Oscilloscope() +OscilloscopeView::~OscilloscopeView() { delete ui; delete m_timeStamp; @@ -59,13 +59,13 @@ Oscilloscope::~Oscilloscope() } // 重新设置语言 -void Oscilloscope::retranslate() +void OscilloscopeView::retranslate() { ui->retranslateUi(this); } // load config -void Oscilloscope::loadConfig(QSettings *config) +void OscilloscopeView::loadConfig(QSettings *config) { config->beginGroup("Oscillograph"); QString xRange = config->value("XRange").toString(); @@ -94,7 +94,7 @@ void Oscilloscope::loadConfig(QSettings *config) } // save config -void Oscilloscope::saveConfig(QSettings *config) +void OscilloscopeView::saveConfig(QSettings *config) { config->beginGroup("Oscillograph"); config->setValue("YOffset", QVariant(ui->yOffsetBox->value())); @@ -112,8 +112,20 @@ void Oscilloscope::saveConfig(QSettings *config) config->endGroup(); } +void OscilloscopeView::loadSettings(QSettings *config) +{ + setBackground(QColor(config->value("PlotBackground").toString())); + setGridColor(QColor(config->value("AxisColor").toString())); + // 绘制使用OpenGL加速 + setUseOpenGL(config->value("UseOpenGL").toBool()); + // 绘制时抗锯齿 + setUseAntialiased(config->value("UseAntialias").toBool()); + // 示波器刷新速度 + setUpdateInterval(config->value("UpdateInterval").toInt()); +} + // 初始化示波器界面 -void Oscilloscope::setupPlot() +void OscilloscopeView::setupPlot() { ui->plotView->setChart(m_chart); m_chart->createDefaultAxes(); @@ -137,7 +149,7 @@ void Oscilloscope::setupPlot() } // 通道列表初始化 -void Oscilloscope::listViewInit() +void OscilloscopeView::listViewInit() { ui->channelList->setModelColumn(2); // 两列 for (int i = 0; i < CH_NUM; ++i) { @@ -147,37 +159,34 @@ void Oscilloscope::listViewInit() ui->channelList->setItemWidget(item, chItem); chItem->setChannel(i); channelStyleChanged(chItem); - connect(chItem, &ChannelItem::changelChanged, this, &Oscilloscope::channelStyleChanged); + connect(chItem, &ChannelItem::changelChanged, this, &OscilloscopeView::channelStyleChanged); } ui->channelList->editItem(ui->channelList->item(0)); } // 获取通道Widget -inline ChannelItem* Oscilloscope::channelWidget(int channel) +inline ChannelItem* OscilloscopeView::channelWidget(int channel) { return (ChannelItem *)(ui->channelList->itemWidget(ui->channelList->item(channel))); } -// 开始运行 -void Oscilloscope::start() -{ - m_timer->start(); -} - -// 结束运行 -void Oscilloscope::stop() +void OscilloscopeView::setEnabled(bool enabled) { - m_timer->stop(); + if (enabled) { + m_timer->start(); + } else { + m_timer->stop(); + } } // 返回保持接收状态 -bool Oscilloscope::holdReceive() +bool OscilloscopeView::holdReceive() { return ui->holdReceiveBox->isChecked(); } // 设置是否使用OpenGL加速 -void Oscilloscope::setUseOpenGL(bool status) +void OscilloscopeView::setUseOpenGL(bool status) { for (int i = 0; i < CH_NUM; ++i) { m_series[i]->setUseOpenGL(status); @@ -188,21 +197,21 @@ void Oscilloscope::setUseOpenGL(bool status) } // 设置是否使用抗锯齿 -void Oscilloscope::setUseAntialiased(bool status) +void OscilloscopeView::setUseAntialiased(bool status) { status &= !m_series[0]->useOpenGL(); // 不适用OpenGL时才可以打开抗锯齿 ui->plotView->setRenderHint(QPainter::Antialiasing, status); } // 设置背景颜色 -void Oscilloscope::setBackground(QColor color) +void OscilloscopeView::setBackground(QColor color) { m_chart->setBackgroundPen(QPen(color)); m_chart->setBackgroundBrush(QBrush(color)); } // 设置网格和图例颜色 -void Oscilloscope::setGridColor(QColor color) +void OscilloscopeView::setGridColor(QColor color) { m_chart->axisX()->setLinePen(QPen(color)); m_chart->axisX()->setGridLineColor(color); @@ -215,19 +224,19 @@ void Oscilloscope::setGridColor(QColor color) } // 设置更新时间 -void Oscilloscope::setUpdateInterval(int msec) +void OscilloscopeView::setUpdateInterval(int msec) { m_timer->setInterval(msec); } // 添加数据 -void Oscilloscope::append(const QByteArray &array) +void OscilloscopeView::receiveData(const QByteArray &array) { QVector vector = m_decode->frameDecode(array); for (WaveDecode::DataType data : vector) { if (data.mode == WaveDecode::ValueMode) { - m_buffer->append(data.channel, data.value); // 先将数据暂存到缓冲区 + m_buffer->append(data.channel, data.data.value); // 先将数据暂存到缓冲区 } else { // Wave Time StampMode m_timeStamp->append(data, m_buffer->maximumCount()); } @@ -235,7 +244,7 @@ void Oscilloscope::append(const QByteArray &array) } // 清空数据 -void Oscilloscope::clear() +void OscilloscopeView::clear() { m_buffer->clear(); m_timeStamp->clear(); @@ -244,7 +253,7 @@ void Oscilloscope::clear() } // 保存PNG文件 -void Oscilloscope::savePng(const QString &fileName) +void OscilloscopeView::savePng(const QString &fileName) { QScreen *screen = QGuiApplication::primaryScreen(); @@ -254,7 +263,7 @@ void Oscilloscope::savePng(const QString &fileName) } // 保存BMP文件 -void Oscilloscope::saveBmp(const QString &fileName) +void OscilloscopeView::saveBmp(const QString &fileName) { QScreen *screen = QGuiApplication::primaryScreen(); @@ -264,7 +273,7 @@ void Oscilloscope::saveBmp(const QString &fileName) } // 通道显示风格改变 -void Oscilloscope::channelStyleChanged(ChannelItem *item) +void OscilloscopeView::channelStyleChanged(ChannelItem *item) { int ch = item->channel(); m_series[ch]->setVisible(item->isChecked()); @@ -272,7 +281,7 @@ void Oscilloscope::channelStyleChanged(ChannelItem *item) } // 滚动条滑块移动时触发 -void Oscilloscope::horzScrollBarMoved(int value) +void OscilloscopeView::horzScrollBarMoved(int value) { if (ui->horizontalScrollBar->maximum() == value) { replotFlag = true; @@ -283,13 +292,13 @@ void Oscilloscope::horzScrollBarMoved(int value) } // 滚动条按钮点击时触发 -void Oscilloscope::horzScrollBarActionTriggered(void) +void OscilloscopeView::horzScrollBarActionTriggered(void) { horzScrollBarMoved(ui->horizontalScrollBar->value()); } // Y轴偏置改变 -void Oscilloscope::yOffsetChanged(double offset) +void OscilloscopeView::yOffsetChanged(double offset) { double range = ui->yRangeBox->value(); @@ -297,7 +306,7 @@ void Oscilloscope::yOffsetChanged(double offset) } // Y轴范围改变 -void Oscilloscope::yRangeChanged(double range) +void OscilloscopeView::yRangeChanged(double range) { double offset = ui->yOffsetBox->value(); @@ -305,7 +314,7 @@ void Oscilloscope::yRangeChanged(double range) } // X轴范围改变 -void Oscilloscope::xRangeChanged(const QString &str) +void OscilloscopeView::xRangeChanged(const QString &str) { m_count = m_buffer->update(); m_xRange = str.toDouble(); @@ -328,9 +337,8 @@ void Oscilloscope::xRangeChanged(const QString &str) } // 更新定时器触发 -void Oscilloscope::timeUpdata() +void OscilloscopeView::timeUpdata() { - int count = m_buffer->update(); if (count > m_xRange + 1 && count > m_count) { if (replotFlag) { @@ -351,7 +359,7 @@ void Oscilloscope::timeUpdata() } // 保存txt文件 -void Oscilloscope::saveWave(const QString &fname) +void OscilloscopeView::saveWave(const QString &fname) { QFile file(fname); int dataCountMax = m_buffer->maximumCount(); @@ -387,7 +395,7 @@ void Oscilloscope::saveWave(const QString &fname) } // 读取txt文件, 私有函数 -bool Oscilloscope::loadWave_p(const QString &fname) +bool OscilloscopeView::loadWave_p(const QString &fname) { bool ok = true; int channelCount = 0, lineCount = 0; @@ -455,7 +463,7 @@ bool Oscilloscope::loadWave_p(const QString &fname) } // 打开波形文件, 公有函数 -void Oscilloscope::loadWave(const QString &fname) +void OscilloscopeView::loadWave(const QString &fname) { if (m_buffer->maximumCount() > 0) { QMessageBox::StandardButton button; @@ -473,3 +481,33 @@ void Oscilloscope::loadWave(const QString &fname) tr("File parsing error.")); } } + +QString OscilloscopeView::openFileFilter() +{ + return tr("Wave Plain Text File (*.txt)"); +} + +QString OscilloscopeView::saveFileFilter() +{ + return tr("Portable Network Graphic Format (*.png)") + ";;" + + tr("Bitmap (*.bmp)") + ";;" + + tr("Wave Plain Text File (*.txt)"); +} + +void OscilloscopeView::saveFile(const QString &fileName, const QString &filter) +{ + if (filter == tr("Portable Network Graphic Format (*.png)")) { + savePng(fileName); + } else if (filter == tr("Bitmap (*.bmp)")) { + saveBmp(fileName); + } else if (filter == tr("Wave Plain Text File (*.txt)")) { + saveWave(fileName); + } +} + +void OscilloscopeView::openFile(const QString &fileName, const QString &filter) +{ + if (filter == tr("Wave Plain Text File (*.txt)")) { + loadWave(fileName); + } +} diff --git a/SerialTool/include/oscilloscope.h b/SerialTool/src/views/oscilloscope/oscilloscopeview.h similarity index 70% rename from SerialTool/include/oscilloscope.h rename to SerialTool/src/views/oscilloscope/oscilloscopeview.h index 1b90306..a8c3901 100644 --- a/SerialTool/include/oscilloscope.h +++ b/SerialTool/src/views/oscilloscope/oscilloscopeview.h @@ -1,54 +1,53 @@ -#ifndef __OSCILLOSCOPE_H -#define __OSCILLOSCOPE_H +#ifndef __OSCILLOSCOPEVIEW_H +#define __OSCILLOSCOPEVIEW_H -#include - -#ifndef CH_NUM -#define CH_NUM 16 -#endif +#include "../abstractview.h" namespace Ui { -class Oscilloscope; +class OscilloscopeView; } class OscopeTimeStamp; class PointDataBuffer; class ChannelItem; class WaveDecode; -class QSettings; namespace QtCharts { class QLineSeries; class QChart; } -class Oscilloscope : public QWidget { +class OscilloscopeView : public AbstractView { Q_OBJECT public: - Oscilloscope(QWidget *parent = Q_NULLPTR); - ~Oscilloscope(); - + OscilloscopeView(QWidget *parent = nullptr); + ~OscilloscopeView(); + QString title() { return tr("Plot"); } void retranslate(); void loadConfig(QSettings *config); void saveConfig(QSettings *config); - - void start(); - void stop(); + void loadSettings(QSettings *config); + void receiveData(const QByteArray &array); + void setEnabled(bool enabled); + void clear(); bool holdReceive(); + QString openFileFilter(); + QString saveFileFilter(); + void saveFile(const QString &fileName, const QString &filter); + void openFile(const QString &fileName, const QString &filter); + +private: void setUseOpenGL(bool status); void setUseAntialiased(bool status); void setBackground(QColor color); void setGridColor(QColor color); void setUpdateInterval(int msec); - void append(const QByteArray &array); - void clear(); void savePng(const QString &fileName); void saveBmp(const QString &fileName); void saveWave(const QString &fname); void loadWave(const QString &fname); -private: void setupPlot(); void listViewInit(); bool loadWave_p(const QString &fname); @@ -67,7 +66,7 @@ private slots: void timeUpdata(); private: - Ui::Oscilloscope *ui; + Ui::OscilloscopeView *ui; bool replotFlag = 1; QVector m_series; QtCharts::QChart *m_chart; diff --git a/SerialTool/source/oscopetimestamp.cpp b/SerialTool/src/views/oscilloscope/oscopetimestamp.cpp similarity index 84% rename from SerialTool/source/oscopetimestamp.cpp rename to SerialTool/src/views/oscilloscope/oscopetimestamp.cpp index 1e7e42b..533a385 100644 --- a/SerialTool/source/oscopetimestamp.cpp +++ b/SerialTool/src/views/oscilloscope/oscopetimestamp.cpp @@ -5,16 +5,17 @@ void OscopeTimeStamp::append(const WaveDecode::DataType &data, uint64_t count) { TimeStamp_p ts; + const WaveDecode::TimeStamp &wts = data.data.ts; ts.count = count; - ts.year = data.year; - ts.month = data.month; - ts.day = data.day; - ts.hour = data.hour; - ts.min = data.min; - ts.sec = data.sec; - ts.msec = data.msec; - ts.sampleRate = data.sampleRate; + ts.year = wts.year; + ts.month = wts.month; + ts.day = wts.day; + ts.hour = wts.hour; + ts.min = wts.min; + ts.sec = wts.sec; + ts.msec = wts.msec; + ts.sampleRate = wts.sampleRate; m_timeStampVector.append(ts); } diff --git a/SerialTool/include/oscopetimestamp.h b/SerialTool/src/views/oscilloscope/oscopetimestamp.h similarity index 100% rename from SerialTool/include/oscopetimestamp.h rename to SerialTool/src/views/oscilloscope/oscopetimestamp.h diff --git a/SerialTool/source/plotview.cpp b/SerialTool/src/views/oscilloscope/plotview.cpp similarity index 100% rename from SerialTool/source/plotview.cpp rename to SerialTool/src/views/oscilloscope/plotview.cpp diff --git a/SerialTool/include/plotview.h b/SerialTool/src/views/oscilloscope/plotview.h similarity index 87% rename from SerialTool/include/plotview.h rename to SerialTool/src/views/oscilloscope/plotview.h index 1b9c560..ddd5176 100644 --- a/SerialTool/include/plotview.h +++ b/SerialTool/src/views/oscilloscope/plotview.h @@ -6,7 +6,7 @@ class PlotView : public QtCharts::QChartView { public: - PlotView(QWidget *parent); + PlotView(QWidget *parent = nullptr); protected: void resizeEvent(QResizeEvent *event); diff --git a/SerialTool/source/pointdatabuffer.cpp b/SerialTool/src/views/oscilloscope/pointdatabuffer.cpp similarity index 100% rename from SerialTool/source/pointdatabuffer.cpp rename to SerialTool/src/views/oscilloscope/pointdatabuffer.cpp diff --git a/SerialTool/include/pointdatabuffer.h b/SerialTool/src/views/oscilloscope/pointdatabuffer.h similarity index 100% rename from SerialTool/include/pointdatabuffer.h rename to SerialTool/src/views/oscilloscope/pointdatabuffer.h diff --git a/SerialTool/source/wavedecode.cpp b/SerialTool/src/views/oscilloscope/wavedecode.cpp similarity index 52% rename from SerialTool/source/wavedecode.cpp rename to SerialTool/src/views/oscilloscope/wavedecode.cpp index b57f036..6db1bbf 100644 --- a/SerialTool/source/wavedecode.cpp +++ b/SerialTool/src/views/oscilloscope/wavedecode.cpp @@ -24,11 +24,11 @@ enum Result { WaveDecode::WaveDecode() { - status = STA_None; - dataCount = 0; - frameCount = 0; - dataLength = 0; - frameLength = 0; + m_status = STA_None; + m_dataCount = 0; + m_frameCount = 0; + m_dataLength = 0; + m_frameLength = 0; } double WaveDecode::data2Double(uint32_t value, int type) @@ -60,78 +60,80 @@ double WaveDecode::data2Double(uint32_t value, int type) } // 接收一个点数据, 仅仅是数据 -int WaveDecode::pointData(DataType &dst, uint8_t byte) +int WaveDecode::pointData(DataType *data, uint8_t byte) { static const int bytes[] = { 4, 1, 2, 4 }; // 各种类型的字节数 - if (dataCount == 0) { // 第一个字节是数据类型和通道信息 - channel = byte & 0x0F; // 通道值 - // tpye: 0: float, 1: int8, 2: int16, 3: int32 - type = byte >> 4; - if (type > 3) { // 数据类型错误 - dataCount = 0; + if (m_dataCount == 0) { // 第一个字节是数据类型和通道信息 + m_channel = byte & 0x0F; // 通道值 + // m_type: 0: float, 1: int8, 2: int16, 3: int32 + m_type = byte >> 4; + if (m_type > 3) { // 数据类型错误 + m_dataCount = 0; return Error; } - dataLength = bytes[type]; + m_dataLength = bytes[m_type]; } else { // 后面几个字节是数据 - data = (data << 8) | byte; - if (dataCount >= dataLength) { // 接收完毕 - dst.channel = channel; - dst.mode = ValueMode; - dst.value = data2Double(data, type); - dataCount = 0; - data = 0; + m_data = (m_data << 8) | byte; + if (m_dataCount >= m_dataLength) { // 接收完毕 + data->channel = m_channel; + data->mode = ValueMode; + data->data.value = data2Double(m_data, m_type); + m_dataCount = 0; + m_data = 0; return Done; } } - ++dataCount; + ++m_dataCount; return Ok; } // 转换时间戳 -void WaveDecode::timeStamp(DataType &dst, uint8_t* buffer) +void WaveDecode::timeStamp(DataType *data, uint8_t* buffer) { - dst.mode = TimeStampMode; - dst.year = (buffer[0] >> 1) & 0x7F; - dst.month = ((buffer[0] << 3) & 0x80) | ((buffer[1] >> 5) & 0x07); - dst.day = buffer[1] & 0x1F; - dst.hour = (buffer[2] >> 3) & 0x1F; - dst.min = ((buffer[2] << 3) & 0x38) | ((buffer[3] >> 5) & 0x07); - dst.sec = ((buffer[3] << 1) & 0x3E) | ((buffer[4] >> 7) & 0x01); - dst.msec = (((uint16_t)buffer[4] << 3) & 0x03F8) | (((uint16_t)buffer[5] >> 5) & 0x0007); - dst.sampleRate = (((uint32_t)buffer[5] << 16) & 0x1F0000) + TimeStamp &ts = data->data.ts; + + data->mode = TimeStampMode; + ts.year = (buffer[0] >> 1) & 0x7F; + ts.month = ((buffer[0] << 3) & 0x80) | ((buffer[1] >> 5) & 0x07); + ts.day = buffer[1] & 0x1F; + ts.hour = (buffer[2] >> 3) & 0x1F; + ts.min = ((buffer[2] << 3) & 0x38) | ((buffer[3] >> 5) & 0x07); + ts.sec = ((buffer[3] << 1) & 0x3E) | ((buffer[4] >> 7) & 0x01); + ts.msec = (((uint16_t)buffer[4] << 3) & 0x03F8) | (((uint16_t)buffer[5] >> 5) & 0x0007); + ts.sampleRate = (((uint32_t)buffer[5] << 16) & 0x1F0000) | (((uint32_t)buffer[6] << 8) & 0x00FF00) | (uint32_t)buffer[7]; } // 波形数据帧解码, 会识别帧头 -bool WaveDecode::frameDecode_p(DataType &data, uint8_t byte) +bool WaveDecode::frameDecode_p(DataType *data, uint8_t byte) { int res; // 捕获帧头状态机 - switch (status) { + switch (m_status) { case STA_None: - status = byte == Frame_Head ? STA_Head : STA_None; + m_status = byte == Frame_Head ? STA_Head : STA_None; break; case STA_Head: - /* byte == Frame_PointMode -> status = STA_Point - * byte == Frame_SyncMode -> status = STA_Sync - * byte == Frame_InfoMode -> status = STA_Info - * else -> status = STA_None + /* byte == Frame_PointMode -> m_status = STA_Point + * byte == Frame_SyncMode -> m_status = STA_Sync + * byte == Frame_InfoMode -> m_status = STA_Info + * else -> m_status = STA_None */ switch (byte) { case Frame_PointMode: - status = STA_Point; + m_status = STA_Point; break; case Frame_SyncMode: - status = STA_Sync; + m_status = STA_Sync; break; case Frame_InfoMode: - status = STA_Info; - frameCount = 0; + m_status = STA_Info; + m_frameCount = 0; break; default: - status = STA_None; + m_status = STA_None; break; } @@ -142,45 +144,45 @@ bool WaveDecode::frameDecode_p(DataType &data, uint8_t byte) case Ok: // 还在接收数据 break; case Error: // 错误则重新开始接收 - status = STA_None; + m_status = STA_None; break; case Done: // 结束初始化状态并返回true - status = STA_None; + m_status = STA_None; return true; } break; case STA_Sync: - frameCount = 0; - frameLength = byte; - // 如果len > 64则帧长度错误, 将重新匹配帧, 否则转到STA_SyncData状态 - status = frameLength <= 64 ? STA_SyncData : STA_None; + m_frameCount = 0; + m_frameLength = byte; + // 如果len > 80则帧长度错误, 将重新匹配帧, 否则转到STA_SyncData状态 + m_status = m_frameLength <= 80 ? STA_SyncData : STA_None; break; case STA_SyncData: - if (++frameCount >= frameLength) { // 计数达到帧长度说明帧结束, 重置状态 - status = STA_None; + if (++m_frameCount >= m_frameLength) { // 计数达到帧长度说明帧结束, 重置状态 + m_status = STA_None; } res = pointData(data, byte); switch (res) { case Ok: // 还在接收数据 break; case Error: // 错误则重新开始接收 - status = STA_None; + m_status = STA_None; break; case Done: // 结束返回true return true; } break; case STA_Info: - infoFrame[frameCount++] = byte; - if (frameCount >= 8) { - timeStamp(data, infoFrame); - frameCount = 0; - status = STA_None; + m_infoFrame[m_frameCount++] = byte; + if (m_frameCount >= 8) { + timeStamp(data, m_infoFrame); + m_frameCount = 0; + m_status = STA_None; return true; } break; default: // 异常情况复位状态 - status = STA_None; + m_status = STA_None; } return false; } @@ -190,9 +192,8 @@ QVector WaveDecode::frameDecode(const QByteArray &array) DataType data; QVector vector; - for (char byte : array) { - if (frameDecode_p(data, byte) == true) { + if (frameDecode_p(&data, byte) == true) { vector.append(data); } } diff --git a/SerialTool/include/wavedecode.h b/SerialTool/src/views/oscilloscope/wavedecode.h similarity index 58% rename from SerialTool/include/wavedecode.h rename to SerialTool/src/views/oscilloscope/wavedecode.h index 286ef5b..ea4c873 100644 --- a/SerialTool/include/wavedecode.h +++ b/SerialTool/src/views/oscilloscope/wavedecode.h @@ -11,8 +11,7 @@ class WaveDecode { ValueMode, TimeStampMode }; - struct DataType { - DataMode mode; + struct TimeStamp { uint8_t year; uint8_t month; uint8_t day; @@ -21,8 +20,14 @@ class WaveDecode { uint8_t sec; uint16_t msec; uint32_t sampleRate; - double value; + }; + struct DataType { + DataMode mode; uint8_t channel; + union { + TimeStamp ts; + double value; + } data; }; WaveDecode(); @@ -30,18 +35,18 @@ class WaveDecode { private: double data2Double(uint32_t value, int type); - int pointData(DataType &dst, uint8_t byte); - void timeStamp(DataType &dst, uint8_t* buffer); - bool frameDecode_p(DataType &data, uint8_t byte); + int pointData(DataType *data, uint8_t byte); + void timeStamp(DataType *data, uint8_t* buffer); + bool frameDecode_p(DataType *data, uint8_t byte); private: - uint32_t data; - int type; - char channel; - int status; - int frameCount, dataCount; - int frameLength, dataLength; - uint8_t infoFrame[8]; + uint32_t m_data; + int m_type; + char m_channel; + int m_status; + int m_frameCount, m_dataCount; + int m_frameLength, m_dataLength; + uint8_t m_infoFrame[8]; }; #endif // !__WAVEDECODE_H diff --git a/SerialTool/source/terminalview.cpp b/SerialTool/src/views/terminal/terminalview.cpp similarity index 89% rename from SerialTool/source/terminalview.cpp rename to SerialTool/src/views/terminal/terminalview.cpp index c9e075a..84ca73d 100644 --- a/SerialTool/source/terminalview.cpp +++ b/SerialTool/src/views/terminal/terminalview.cpp @@ -4,10 +4,9 @@ #include #include #include -#include TerminalView::TerminalView(QWidget *parent) : - QWidget(parent), + AbstractView(parent), ui(new Ui::TerminalView) { ui->setupUi(this); @@ -106,6 +105,25 @@ void TerminalView::saveConfig(QSettings *config) config->endGroup(); } +void TerminalView::loadSettings(QSettings *config) +{ + QString fontFamily("'" + config->value("FontFamily").toString().replace("+", "','") + "'"); + QString fontStyle(config->value("FontStyle").toString()); + int fontSize = config->value("FontSize").toInt(); + + fontSize = fontSize < 6 ? 10 : fontSize; + setFontFamily(fontFamily, fontSize, fontStyle); + + // highlight + setHighlight(config->value("TerminalHighlight").toString()); + // text codec + setTextCodec(config->value("TerminalTextCodec").toString()); + setTabsInsertSpaces(config->value("TerminalTabsInsertSpaces").toBool()); + setTabWidth(config->value("TerminalTabWidth").toInt()); + setAutoIndent(config->value("TerminalAutoIndent").toBool()); + setIndentationGuides(config->value("TerminalIndentationGuides").toBool()); +} + void TerminalView::loadHistory(QSettings *config) { config->beginGroup("HistoryBox"); @@ -139,7 +157,7 @@ void TerminalView::setHighlight(const QString &language) ui->textEditRx->setHighLight(language); } -void TerminalView::append(const QByteArray &array) +void TerminalView::receiveData(const QByteArray &array) { QString string; @@ -163,27 +181,14 @@ void TerminalView::setFontFamily(QString fontFamily, int size, QString style) ui->textEditTx->setFonts(fontFamily, size, Qt::black, style); } -void TerminalView::setPaused(bool status) -{ - m_paused = status; - setSendButtonEnabled(!m_paused && m_sendEnabled); - updateResendTimerStatus(); -} - -void TerminalView::setSendButtonEnabled(bool status) +void TerminalView::setEnabled(bool enabled) { QString str; - ui->sendButton->setEnabled(status); - str = status ? tr("Ctrl + Enter to send") : + ui->sendButton->setEnabled(enabled); + str = enabled ? tr("Ctrl + Enter to send") : tr("Connect port and start transmission to enable this button"); ui->sendButton->setToolTip(str); -} - -void TerminalView::setEnabled(bool status) -{ - m_sendEnabled = status; - setSendButtonEnabled(!m_paused && m_sendEnabled); // auto resend updateResendTimerStatus(); } @@ -199,7 +204,7 @@ void TerminalView::sendData() } else { array = QByteArray::fromHex(ui->textEditTx->text().toLatin1()); } - sendDataRequest(array); + emit transmitData(array); } void TerminalView::onWrapBoxChanged(int status) @@ -229,9 +234,7 @@ void TerminalView::onSendButtonClicked() void TerminalView::updateResendTimerStatus() { - bool status = m_sendEnabled && !m_paused && ui->resendBox->isChecked(); - - if (status) { + if (ui->sendButton->isEnabled() && ui->resendBox->isChecked()) { m_resendTimer->start(ui->resendIntervalBox->text().toInt()); } else { m_resendTimer->stop(); @@ -433,3 +436,15 @@ void TerminalView::setIndentationGuides(bool enable) { ui->textEditTx->setIndentationGuides(enable); } + +QString TerminalView::saveFileFilter() +{ + return tr("Terminal Text File (*.txt)"); +} + +void TerminalView::saveFile(const QString &fileName, const QString &filter) +{ + if (filter == tr("Terminal Text File (*.txt)")) { + saveText(fileName); + } +} diff --git a/SerialTool/include/terminalview.h b/SerialTool/src/views/terminal/terminalview.h similarity index 79% rename from SerialTool/include/terminalview.h rename to SerialTool/src/views/terminal/terminalview.h index 0515945..3476c8b 100644 --- a/SerialTool/include/terminalview.h +++ b/SerialTool/src/views/terminal/terminalview.h @@ -1,32 +1,35 @@ #ifndef TERMINALVIEW_H #define TERMINALVIEW_H -#include +#include "../abstractview.h" namespace Ui { class TerminalView; } -class QTimer; -class QSettings; -class QByteArray; - -class TerminalView : public QWidget +class TerminalView : public AbstractView { Q_OBJECT public: - explicit TerminalView(QWidget *parent = 0); + explicit TerminalView(QWidget *parent = nullptr); ~TerminalView(); + QString title() { return tr("Terminal"); } void retranslate(); void loadConfig(QSettings *config); void saveConfig(QSettings *config); - void append(const QByteArray &array); + void loadSettings(QSettings *config); + void receiveData(const QByteArray &array); + void setEnabled(bool enabled); void clear(); + + //QString openFileFilter(); + QString saveFileFilter(); + void saveFile(const QString &fileName, const QString &filter); + +private: void setFontFamily(QString fonts, int size, QString style); - void setEnabled(bool status); - void setPaused(bool status); void setHighlight(const QString &language); void setTextCodec(const QString &name); void setTabsInsertSpaces(bool enable); @@ -35,12 +38,7 @@ class TerminalView : public QWidget void setIndentationGuides(bool enable); void saveText(const QString &fname); -signals: - void sendDataRequest(const QByteArray &array); - -private: void keyPressEvent(QKeyEvent *event); - void setSendButtonEnabled(bool status); void arrayToHex(QString &str, const QByteArray &arr, int countOfLine); void arrayToString(QString &str, const QByteArray &arr); void loadHistory(QSettings *config); @@ -69,7 +67,6 @@ private slots: }; Ui::TerminalView *ui; - bool m_sendEnabled = false, m_paused = false; QTimer *m_resendTimer; QByteArray *m_asciiBuf; enum TextCodec m_textCodec; diff --git a/SerialTool/source/textedit.cpp b/SerialTool/src/views/terminal/textedit.cpp similarity index 100% rename from SerialTool/source/textedit.cpp rename to SerialTool/src/views/terminal/textedit.cpp diff --git a/SerialTool/include/textedit.h b/SerialTool/src/views/terminal/textedit.h similarity index 100% rename from SerialTool/include/textedit.h rename to SerialTool/src/views/terminal/textedit.h diff --git a/SerialTool/src/views/viewmanager.cpp b/SerialTool/src/views/viewmanager.cpp new file mode 100644 index 0000000..c2d71eb --- /dev/null +++ b/SerialTool/src/views/viewmanager.cpp @@ -0,0 +1,134 @@ +#include "viewmanager.h" +#include +#include +#include +#include +#include "abstractview.h" +#include "terminal/terminalview.h" +#include "oscilloscope/oscilloscopeview.h" +#include "filetransmit/filetransmitview.h" + +ViewManager::ViewManager(QString *docPath, QTabWidget *tabWidget) +{ + m_views = new QVector; + + // create views + m_views->append(new TerminalView()); + m_views->append(new OscilloscopeView()); + m_views->append(new FileTransmitView()); + + m_docPath = docPath; + m_tabWidget = tabWidget; + m_currentView = m_views->at(0); + for (AbstractView *view : *m_views) { + tabWidget->addTab(view, view->title()); + connect(view, &AbstractView::transmitData, this, &ViewManager::transmitData); + } + connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(tabIndexChanged(int))); +} + +ViewManager::~ViewManager() +{ + for (AbstractView *view : *m_views) { + delete view; + } + delete m_views; +} + +void ViewManager::loadConfig(QSettings *config) +{ + for (AbstractView *view : *m_views) { + view->loadConfig(config); + } +} + +void ViewManager::saveConfig(QSettings *config) +{ + for (AbstractView *view : *m_views) { + view->saveConfig(config); + } +} + +void ViewManager::loadSettings(QSettings *config) +{ + for (AbstractView *view : *m_views) { + view->loadSettings(config); + } +} + +void ViewManager::retranslate() +{ + for (int i = 0; i < m_views->size(); ++i) { + AbstractView *view = m_views->at(i); + + view->retranslate(); + m_tabWidget->setTabText(i, view->title()); + } +} + +void ViewManager::receiveData(const QByteArray &array) +{ + for (AbstractView *view : *m_views) { + if (view->holdReceive() || m_currentView == view) { + view->receiveData(array); + } + } +} + +void ViewManager::setEnabled(bool enabled) +{ + for (AbstractView *view : *m_views) { + view->setEnabled(enabled); + } +} + +void ViewManager::clear(void) +{ + m_currentView->clear(); +} + +void ViewManager::setFileAction(QAction *openAction, QAction *saveAction) +{ + m_openFileAction = openAction; + m_saveFileAction = saveAction; + + m_openFileAction->setEnabled(!m_currentView->openFileFilter().isEmpty()); + m_saveFileAction->setEnabled(!m_currentView->saveFileFilter().isEmpty()); + connect(m_openFileAction, SIGNAL(triggered()), this, SLOT(openFile())); + connect(m_saveFileAction, SIGNAL(triggered()), this, SLOT(saveFile())); +} + +void ViewManager::tabIndexChanged(int index) +{ + AbstractView *view = m_views->at(index); + + m_currentView = view; + m_openFileAction->setEnabled(!m_currentView->openFileFilter().isEmpty()); + m_saveFileAction->setEnabled(!m_currentView->saveFileFilter().isEmpty()); +} + +void ViewManager::saveFile() +{ + QString filter; + QString fileName = QFileDialog::getSaveFileName(m_currentView, tr("Save"), *m_docPath, + m_currentView->saveFileFilter(), &filter, + QFileDialog::HideNameFilterDetails); + if (fileName.isEmpty()) { + return; + } + *m_docPath = QFileInfo(fileName).path(); + m_currentView->saveFile(fileName, filter); +} + +void ViewManager::openFile() +{ + QString filter; + QString fileName = QFileDialog::getOpenFileName(m_currentView, tr("Open"), *m_docPath, + m_currentView->openFileFilter(), &filter, + QFileDialog::HideNameFilterDetails); + if (fileName.isEmpty()) { + return; + } + *m_docPath = QFileInfo(fileName).path(); + m_currentView->openFile(fileName, filter); +} diff --git a/SerialTool/src/views/viewmanager.h b/SerialTool/src/views/viewmanager.h new file mode 100644 index 0000000..755d2b7 --- /dev/null +++ b/SerialTool/src/views/viewmanager.h @@ -0,0 +1,43 @@ +#ifndef VIEWMANAGER_H +#define VIEWMANAGER_H + +#include + +class AbstractView; +class QTabWidget; +class QAction; +class QSettings; + +class ViewManager : public QObject +{ + Q_OBJECT +public: + explicit ViewManager(QString *docPath, QTabWidget *tabWidget); + ~ViewManager(); + + void loadConfig(QSettings *config); + void saveConfig(QSettings *config); + void loadSettings(QSettings *config); + void retranslate(); + void receiveData(const QByteArray &array); + void setEnabled(bool enabled); + void clear(void); + void setFileAction(QAction *openAction, QAction *saveAction); + +signals: + void transmitData(const QByteArray &); + +private slots: + void tabIndexChanged(int index); + void saveFile(); + void openFile(); + +private: + QVector *m_views; + AbstractView *m_currentView; + QAction *m_openFileAction = nullptr, *m_saveFileAction = nullptr; + QTabWidget *m_tabWidget; + QString *m_docPath; +}; + +#endif // VIEWMEDIATOR_H diff --git a/SerialTool/ui/aboutbox.ui b/SerialTool/ui/aboutbox.ui index 246007a..d0040be 100644 --- a/SerialTool/ui/aboutbox.ui +++ b/SerialTool/ui/aboutbox.ui @@ -76,6 +76,9 @@ QDialogButtonBox::Ok + + true + diff --git a/SerialTool/ui/mainwindow.ui b/SerialTool/ui/mainwindow.ui index b735d29..0769bbf 100644 --- a/SerialTool/ui/mainwindow.ui +++ b/SerialTool/ui/mainwindow.ui @@ -62,73 +62,8 @@ - 0 + -1 - - - Terminal - - - - 2 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - - - - Plot - - - - - 0 - 0 - 592 - 297 - - - - - - - File Transmit - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - @@ -156,8 +91,6 @@ Tools - - @@ -173,9 +106,6 @@ View - - - @@ -203,6 +133,12 @@ Qt::BottomToolBarArea|Qt::TopToolBarArea + + + 20 + 20 + + TopToolBarArea @@ -308,25 +244,6 @@ Tool Bar - - - true - - - Terminal - - - Tester - - - - - true - - - Plot - - true @@ -346,19 +263,6 @@ F1 - - - Vedio Box - - - - - true - - - File Transmit - - Wiki @@ -382,11 +286,6 @@ Ctrl+O - - - Value Display - - @@ -403,26 +302,6 @@ - - - Oscilloscope - QWidget -
oscilloscope.h
- 1 -
- - FileTransmitView - QWidget -
filetransmitview.h
- 1 -
- - TerminalView - QWidget -
terminalview.h
- 1 -
-
diff --git a/SerialTool/ui/optionsbox.ui b/SerialTool/ui/optionsbox.ui index a965541..8ba0b5e 100644 --- a/SerialTool/ui/optionsbox.ui +++ b/SerialTool/ui/optionsbox.ui @@ -56,12 +56,12 @@ - Serial Port + Serial Port - TCP/UDP + TCP/UDP @@ -630,7 +630,7 @@ - Delete + Delete diff --git a/SerialTool/ui/oscilloscope.ui b/SerialTool/ui/oscilloscopeview.ui similarity index 98% rename from SerialTool/ui/oscilloscope.ui rename to SerialTool/ui/oscilloscopeview.ui index 8350114..22771b5 100644 --- a/SerialTool/ui/oscilloscope.ui +++ b/SerialTool/ui/oscilloscopeview.ui @@ -1,7 +1,7 @@ - Oscilloscope - + OscilloscopeView + 0 @@ -254,7 +254,7 @@ PlotView QWidget -
plotview.h
+
src/views/oscilloscope/plotview.h
1
diff --git a/SerialTool/ui/terminalview.ui b/SerialTool/ui/terminalview.ui index f233b7d..0ff569d 100644 --- a/SerialTool/ui/terminalview.ui +++ b/SerialTool/ui/terminalview.ui @@ -257,7 +257,7 @@ TextEdit QWidget -
textedit.h
+
src/views/terminal/textedit.h
1
diff --git a/SerialTool/ver_temp.h b/SerialTool/ver_temp.h index 4e3ec0f..6de0aa7 100644 --- a/SerialTool/ver_temp.h +++ b/SerialTool/ver_temp.h @@ -1,7 +1,7 @@ #ifndef __VERSION_H #define __VERSION_H -#define MAIN_VERSION 1.2.6 +#define MAIN_VERSION 1.3.0Beta #define SOFTWARE_NAME "SerialTool" #define COPYRIGHT "Copyleft 2017-2018, Wenliang Guan"