前言
本项目是基于我已学习到的qt知识,将这些知识整合起来做成的一个练手小项目,作者还是新手处于学习阶段,程序中还有很多能够改进的地方,但我能力不足有些问题发现不了。或者有些问题在开发中就已经发现了,但是修改代码太麻烦就没有修改(在代码中会指出)。如果你有什么更好的建议可以留在评论区。
界面展示
主界面
设置界面
查询界面
预想中是能显示4路数据,两路ADC数据(其他数据传输方式)和两路串口数据,这里只做了串口通信。图像中的曲线是程序生成的测试数据而非串口数据。
串口数据显示(黄色曲线为串口1接收数据)
这里串口数据显示其实有一个小BUG,之后会提到。
大概框架
说明一下主要成员变量及其所属父对象。
项目整体结构
其中qcustomplot.h和.cpp文件需要去官网下载,请自行百度,或者直接下载我的工程文件即可。
直接上代码
mainwindow.h 主界面头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QSerialPort>
#include <QSettings>
#include "qcustomplot.h"
#include "setting.h"
#include "search.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QMainWindow>
#define STR(str) #str
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initMainUi();
void setSerialPort(QSerialPort*);
void initDatabase();
static void setCustomplotStyle(const QString&, QCustomPlot *);
static void setAxisColor(const QString&, QCustomPlot *);
enum FixedAxis{
Graph1FixedAxis = 0x01,
Graph2FixedAxis = 0x02
};
private:
QSerialPort *serialPort1;
QSerialPort *serialPort2;
private slots:
void on_setBtn_clicked();
void on_exitBtn_clicked();
void on_Uart1Enable_clicked(bool checked);
void on_Uart2Enable_clicked(bool checked);
void uart1Recieve();
void uart2Recieve();
void realtimeDataSlot();
void showMainUi();
void on_searchBtn_clicked();
protected:
void showEvent(QShowEvent *event) override;
void closeEvent(QCloseEvent *event) override;
//void paintEvent(QPaintEvent *event) override;
private:
Ui::MainWindow *ui;
QSettings *config;
QCustomPlot *plot_1;
QCustomPlot *plot_2;
QTimer *dataTimer;
double key; //用来记录横坐标的时间刻度
Setting *settingUi;
Search *searchUi;
quint8 isFixedAxisRange;
QSqlDatabase *database;
};
#endif // MAINWINDOW_H
mainwindow.cpp 主界面源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
//初始化各成员变量
settingUi = new Setting();
initDatabase(); //必须在实例化Search对象之前初始化数据库
searchUi = new Search(database);
ui->setupUi(this);
plot_1 = ui->customPlot1;
plot_2 = ui->customPlot2;
dataTimer = new QTimer(this);
//打开配置文件
config = new QSettings("config.ini", QSettings::IniFormat);
serialPort1 = new QSerialPort(this);
serialPort2 = new QSerialPort(this);
//连接串口接收槽函数
connect(serialPort1, SIGNAL(readyRead()), this, SLOT(uart1Recieve()));
connect(serialPort2, SIGNAL(readyRead()), this, SLOT(uart2Recieve()));
// 使上下轴、左右轴范围同步
connect(plot_2->xAxis, SIGNAL(rangeChanged(QCPRange)), plot_2->xAxis2, SLOT(setRange(QCPRange)));
connect(plot_2->yAxis, SIGNAL(rangeChanged(QCPRange)), plot_2->yAxis2, SLOT(setRange(QCPRange)));
//定时器连接槽函数realtimeDataSlot
connect(dataTimer, SIGNAL(timeout()), this, SLOT(realtimeDataSlot()));
//实现关闭设置界面/查询界面 显示主界面
connect(settingUi, SIGNAL(showMainUi()), this, SLOT(showMainUi()));
connect(searchUi, SIGNAL(showMainUi()), this, SLOT(showMainUi()));
//this->setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog);
initMainUi();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initMainUi()
{
//串口数据显示区
//坐标轴使用时间
QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime);
timeTicker->setTimeFormat("%h:%m:%s");
//设置曲线颜色(显示区域2)
plot_2->addGraph();
plot_2->graph(0)->setPen(QPen(QColor("#4fa08b"))); //测试数据
plot_2->addGraph();
plot_2->graph(1)->setPen(QPen(QColor(255, 100, 40))); //串口2
plot_2->xAxis->setTicker(timeTicker);
//四边安上坐标轴
plot_2->axisRect()->setupFullAxesBox();
//设置坐标轴名字
plot_2->xAxis->setLabel("时间/h:m:s");
plot_2->yAxis->setLabel("幅值");
//plot_2->setBackground(QBrush(QColor(