2025-03-10T17:35:07

This commit is contained in:
yuntang 2025-03-10 17:35:07 +08:00
parent c445ee422a
commit b6c5cc3d33
43 changed files with 6192 additions and 142 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -5,10 +5,14 @@ debug/mainwindow.o
debug/dataparser.o
debug/serialport.o
debug/qcustomplot.o
debug/experimentsettingform.o
debug/leftwidget.o
debug/realtimedataform.o
debug/moc_centralwidget.o
debug/moc_mainwidget.o
debug/moc_mainwindow.o
debug/moc_serialport.o
debug/moc_qcustomplot.o
debug/moc_experimentsettingform.o
debug/moc_leftwidget.o
debug/moc_realtimedataform.o

View File

@ -5,10 +5,14 @@ release/mainwindow.o
release/dataparser.o
release/serialport.o
release/qcustomplot.o
release/experimentsettingform.o
release/leftwidget.o
release/realtimedataform.o
release/moc_centralwidget.o
release/moc_mainwidget.o
release/moc_mainwindow.o
release/moc_serialport.o
release/moc_qcustomplot.o
release/moc_experimentsettingform.o
release/moc_leftwidget.o
release/moc_realtimedataform.o

View File

View File

@ -23,6 +23,8 @@ SOURCES += \
serialport/dataparser.cpp \
serialport/serialport.cpp \
thirdparty/qcustomplot/qcustomplot.cpp \
ui/experimentsettingform.cpp \
ui/leftwidget.cpp \
ui/realtimedataform.cpp
HEADERS += \
@ -33,10 +35,13 @@ HEADERS += \
serialport/protocol.h \
serialport/serialport.h \
thirdparty/qcustomplot/qcustomplot.h \
ui/experimentsettingform.h \
ui/leftwidget.h \
ui/realtimedataform.h
FORMS += \
mainwindow.ui \
ui/experimentsettingform.ui \
ui/realtimedataform.ui
INCLUDEPATH += serialport \

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.11.1, 2025-03-06T16:19:26. -->
<!-- Written by QtCreator 4.11.1, 2025-03-10T17:17:05. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

25
src/AnalysTool.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35825.156 d17.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnalysTool", "AnalysTool.vcxproj", "{F30D2791-A8A0-38F9-928F-89C2B41456F0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{F30D2791-A8A0-38F9-928F-89C2B41456F0}.Debug|x64.ActiveCfg = Debug|x64
{F30D2791-A8A0-38F9-928F-89C2B41456F0}.Debug|x64.Build.0 = Debug|x64
{F30D2791-A8A0-38F9-928F-89C2B41456F0}.Release|x64.ActiveCfg = Release|x64
{F30D2791-A8A0-38F9-928F-89C2B41456F0}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {084FD268-695B-4117-A631-0128BC510B8E}
EndGlobalSection
EndGlobal

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,29 +1,35 @@
#include "mainwindow.h"
#include <QApplication>
#include "centralwidget.h"
#include "serialport/serialport.h"
#include "ui/realtimedataform.h"
#include "experimentsettingform.h"
int main(int argc, char *argv[])
{
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 启用高DPI缩放
QApplication a(argc, argv);
// MainWindow w;
MainWindow w;
// w.show();
CentralWidget central;
central.show();
ExperimentSettingForm es;
es.show();
// CentralWidget central;
// central.show();
// SerialPort::parserTest();
SerialPort sp;
// SerialPort sp;
RealTimeDataForm r;
// RealTimeDataForm r;
// r.show();
QObject::connect(&sp,&SerialPort::sigSendSerialPortData,
&r,&RealTimeDataForm::slotRevSerialPortData);
// QObject::connect(&sp,&SerialPort::sigSendSerialPortData,
// &r,&RealTimeDataForm::slotRevSerialPortData);
return a.exec();
}

View File

@ -5,11 +5,14 @@ MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, _centralWidget(new CentralWidget)
,_leftWidget(new LeftWidget)
{
ui->setupUi(this);
this->setToolTip(".....");
setCentralWidget(_centralWidget);
addDockWidget(Qt::LeftDockWidgetArea, _leftWidget);
}
MainWindow::~MainWindow()

View File

@ -2,7 +2,9 @@
#define MAINWINDOW_H
#include <QMainWindow>
#include "centralwidget.h"
#include "leftwidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
@ -19,5 +21,6 @@ public:
private:
Ui::MainWindow *ui;
CentralWidget *_centralWidget;
LeftWidget*_leftWidget;
};
#endif // MAINWINDOW_H

View File

@ -4,3 +4,10 @@ DataParser::DataParser()
{
}
void DataParser::connectToDevice(const QVector<Phase> &vtr)
{
for(const Phase& phase:vtr){
}
}

View File

@ -1,10 +1,15 @@
#ifndef DATAPARSER_H
#define DATAPARSER_H
#include <QVector>
#include "protocol.h"
class DataParser
{
public:
DataParser();
static void connectToDevice(const QVector<Phase>&);
};
#endif // DATAPARSER_H

View File

@ -12,74 +12,74 @@
struct com_protocol
{
uint16_t head;
uint8_t len;
uint8_t cmd;
uint16_t addr;
uint8_t data_buf[256];
uint16_t head;
uint8_t len;
uint8_t cmd;
uint16_t addr;
uint8_t data_buf[256];
};
enum gas_type{
NC,
N2,
O2
};
typedef enum gas_type {
NC,
N2,
O2
}GasType;
struct control_data
typedef struct control_data
{
uint8_t onoff;
float cutoff_temp;
float temp_flow;
uint16_t constant_temp_time_min;
enum gas_type gas;
};
uint8_t onoff;
float cutoff_temp;
float temp_flow;
uint16_t constant_temp_time_min;
enum gas_type gas;
}Phase;
struct pid_data
{
float kp;
float ki;
float kd;
float kp;
float ki;
float kd;
};
typedef struct com_data
{
uint8_t run_type; //0,运行状态
uint8_t current_phase; //1,当前阶段
float add_run_time; //2,累计运行时间
float add_constan_temp_time; //6,当前阶段恒温时间
double sample_temp; //A,样品温度
double dsc; //12,热流
double temp_flow; //1a,升温速率
float cold_temp; //22,冷端温度
uint8_t hardware_err; //26,硬件错误
uint8_t current_gas; //27,当前气氛
float auto_pid_temp_flow; //28,自整定升温速率
uint8_t run_mode; //2c,启动模式
uint8_t reserve_buf[35]; //2d-4f,保留
struct control_data phase_data[6];//50-97,阶段控制数据
uint8_t meas_type; //98测试类型
uint8_t init_gas; //99, 初始气氛
struct pid_data temp_flow_pid_low;//9a-a5,升温速率 低pid
struct pid_data temp_flow_pid_high;//a6-B1,升温速率 高pid
float cold_temp_cali_standard; //B2,冷端标准温度
float cold_temp_cali_meas; //B6,冷端测量温度
uint8_t cold_cali_flag; //B7,冷端温度计算
float cold_temp_slope; //B8,冷端温度倍率
float sample_temp_calilow_standard;//BC,样品标准温度低倍率
float sample_temp_calilow_meas; //C0,样品测量温度低倍率
uint8_t sample_temp_cali_low_flag;//C4,样品温度计算低倍率
float sample_temp_slope_low; //C5,样品温度低倍率低倍率
float sample_temp_calimid_standard;//C9,样品标准温度中倍率
float sample_temp_calimid_meas; //CD,样品测量温度中倍率
uint8_t sample_temp_cali_mid_flag;//D1,样品温度计算中倍率
float sample_temp_slope_middle; //D2,样品温度中倍率
float sample_temp_calihigh_standard;//D6,样品标准温度高倍率
float sample_temp_calihigh_meas; //样品测量温度高倍率
uint8_t sample_temp_cali_high_flag; //样品温度计算高倍率
float sample_temp_slope_high; //样品温度高倍率
float enthalpy_equation_a; //热焓方程式系数a
float enthalpy_equation_b; //热焓方程式系数b
float enthalpy_equation_c; //热焓方程式系数c
uint8_t run_type; //0,运行状态
uint8_t current_phase; //1,当前阶段
float add_run_time; //2,累计运行时间
float add_constan_temp_time; //6,当前阶段恒温时间
double sample_temp; //A,样品温度
double dsc; //12,热流
double temp_flow; //1a,升温速率
float cold_temp; //22,冷端温度
uint8_t hardware_err; //26,硬件错误
uint8_t current_gas; //27,当前气氛
float auto_pid_temp_flow; //28,自整定升温速率
uint8_t run_mode; //2c,启动模式
uint8_t reserve_buf[35]; //2d-4f,保留
struct control_data phase_data[6];//50-97,阶段控制数据
uint8_t meas_type; //98测试类型
uint8_t init_gas; //99, 初始气氛
struct pid_data temp_flow_pid_low;//9a-a5,升温速率 低pid
struct pid_data temp_flow_pid_high;//a6-B1,升温速率 高pid
float cold_temp_cali_standard; //B2,冷端标准温度
float cold_temp_cali_meas; //B6,冷端测量温度
uint8_t cold_cali_flag; //B7,冷端温度计算
float cold_temp_slope; //B8,冷端温度倍率
float sample_temp_calilow_standard;//BC,样品标准温度低倍率
float sample_temp_calilow_meas; //C0,样品测量温度低倍率
uint8_t sample_temp_cali_low_flag;//C4,样品温度计算低倍率
float sample_temp_slope_low; //C5,样品温度低倍率低倍率
float sample_temp_calimid_standard;//C9,样品标准温度中倍率
float sample_temp_calimid_meas; //CD,样品测量温度中倍率
uint8_t sample_temp_cali_mid_flag;//D1,样品温度计算中倍率
float sample_temp_slope_middle; //D2,样品温度中倍率
float sample_temp_calihigh_standard;//D6,样品标准温度高倍率
float sample_temp_calihigh_meas; //样品测量温度高倍率
uint8_t sample_temp_cali_high_flag; //样品温度计算高倍率
float sample_temp_slope_high; //样品温度高倍率
float enthalpy_equation_a; //热焓方程式系数a
float enthalpy_equation_b; //热焓方程式系数b
float enthalpy_equation_c; //热焓方程式系数c
} CommonData;
#pragma pack(pop)
@ -87,10 +87,10 @@ typedef struct com_data
#if 0
struct com_device
{
struct temp_control *temp;
struct temp_control* temp;
};
struct com_data *com_data_get(void);
void com_protocol_init(struct com_device *dev);
struct com_data* com_data_get(void);
void com_protocol_init(struct com_device* dev);
void com_protocol_data_init(void);
#endif

Binary file not shown.

View File

@ -0,0 +1,212 @@
#include <QtDebug>
#include "experimentsettingform.h"
#include "ui_experimentsettingform.h"
#include "protocol.h"
ExperimentSettingForm::ExperimentSettingForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::ExperimentSettingForm)
{
ui->setupUi(this);
uiReset();
connect(ui->checkBox_phase_2,&QCheckBox::clicked,
this,&ExperimentSettingForm::slotPhase2StateChanged);
connect(ui->checkBox_phase_3,&QCheckBox::clicked,
this,&ExperimentSettingForm::slotPhase3StateChanged);
connect(ui->checkBox_phase_4,&QCheckBox::clicked,
this,&ExperimentSettingForm::slotPhase4StateChanged);
connect(ui->pushButton_connect_to_device,&QPushButton::click,
this,&ExperimentSettingForm::slotConnectToDevice);
connect(ui->pushButton_cancel,&QPushButton::click,
this,&ExperimentSettingForm::slotCancel);
}
ExperimentSettingForm::~ExperimentSettingForm()
{
delete ui;
}
void ExperimentSettingForm::uiReset()
{
//init data and status.
ui->checkBox_phase_1->setChecked(true);
ui->checkBox_phase_1->setEnabled(false);
ui->phase_1_cutoff_temp->setText("0");
ui->phase_2_cutoff_temp->setText("0");
ui->phase_3_cutoff_temp->setText("0");
ui->phase_4_cutoff_temp->setText("0");
ui->phase_1_scan_rate->setText("0");
ui->phase_2_scan_rate->setText("0");
ui->phase_3_scan_rate->setText("0");
ui->phase_4_scan_rate->setText("0");
ui->phase_1_constant_temp->setText("0");
ui->phase_2_constant_temp->setText("0");
ui->phase_3_constant_temp->setText("0");
ui->phase_4_constant_temp->setText("0");
ui->phase_2_cutoff_temp->setEnabled(false);
ui->phase_3_cutoff_temp->setEnabled(false);
ui->phase_4_cutoff_temp->setEnabled(false);
ui->phase_2_scan_rate->setEnabled(false);
ui->phase_3_scan_rate->setEnabled(false);
ui->phase_4_scan_rate->setEnabled(false);
ui->phase_2_constant_temp->setEnabled(false);
ui->phase_3_constant_temp->setEnabled(false);
ui->phase_4_constant_temp->setEnabled(false);
ui->comboBox_phase_2_atmosphere->setEnabled(false);
ui->comboBox_phase_3_atmosphere->setEnabled(false);
ui->comboBox_phase_4_atmosphere->setEnabled(false);
ui->radioButton_OIT_not->setChecked(true);
ui->checkBox_phase_2->setTristate(false);
ui->checkBox_phase_3->setTristate(false);
ui->checkBox_phase_4->setTristate(false);
}
void ExperimentSettingForm::slotPhase2StateChanged(int state)
{
qDebug()<<"slotPhase2StateChanged:"<<state;
if(state == Qt::PartiallyChecked){
ui->phase_2_cutoff_temp->setEnabled(true);
ui->phase_2_scan_rate->setEnabled(true);
ui->phase_2_constant_temp->setEnabled(true);
ui->comboBox_phase_2_atmosphere->setEnabled(true);
}else{
if(ui->checkBox_phase_3->isChecked()){
ui->checkBox_phase_2->setCheckState(Qt::Checked);
}else {
ui->phase_2_cutoff_temp->setEnabled(false);
ui->phase_2_scan_rate->setEnabled(false);
ui->phase_2_constant_temp->setEnabled(false);
ui->comboBox_phase_2_atmosphere->setEnabled(false);
}
}
}
void ExperimentSettingForm::slotPhase3StateChanged(int state)
{
if(state == Qt::PartiallyChecked){
if(ui->checkBox_phase_2->isChecked()){
ui->phase_3_cutoff_temp->setEnabled(true);
ui->phase_3_scan_rate->setEnabled(true);
ui->phase_3_constant_temp->setEnabled(true);
ui->comboBox_phase_3_atmosphere->setEnabled(true);
}else{
ui->checkBox_phase_3->setChecked(false);
}
}else{
if(ui->checkBox_phase_4->isChecked()){
ui->checkBox_phase_3->setChecked(true);
}else{
ui->phase_3_cutoff_temp->setEnabled(false);
ui->phase_3_scan_rate->setEnabled(false);
ui->phase_3_constant_temp->setEnabled(false);
ui->comboBox_phase_3_atmosphere->setEnabled(false);
}
}
}
void ExperimentSettingForm::slotPhase4StateChanged(int state)
{
if(state == Qt::PartiallyChecked){
if(ui->checkBox_phase_3->isChecked()){
ui->phase_4_cutoff_temp->setEnabled(true);
ui->phase_4_scan_rate->setEnabled(true);
ui->phase_4_constant_temp->setEnabled(true);
ui->comboBox_phase_4_atmosphere->setEnabled(true);
}else{
ui->checkBox_phase_4->setChecked(false);
}
}else{
ui->phase_4_cutoff_temp->setEnabled(false);
ui->phase_4_scan_rate->setEnabled(false);
ui->phase_4_constant_temp->setEnabled(false);
ui->comboBox_phase_4_atmosphere->setEnabled(false);
}
}
void ExperimentSettingForm::slotConnectToDevice()
{
QVector<Phase> phaseVtr;
if(ui->checkBox_phase_1->checkState()){
Phase phase;
phase.onoff = 1;
phase.cutoff_temp = ui->phase_1_cutoff_temp->text().toFloat();
phase.temp_flow = ui->phase_1_scan_rate->text().toFloat();
phase.constant_temp_time_min = (uint16_t)ui->phase_1_constant_temp->text().toInt();
// phase.gas = ui->comboBox_phase_1_atmosphere->currentIndex();
phase.gas = GasType::N2;
phaseVtr.push_back(phase);
}
if(ui->checkBox_phase_2->checkState()){
Phase phase;
phase.onoff = 1;
phase.cutoff_temp = ui->phase_2_cutoff_temp->text().toFloat();
phase.temp_flow = ui->phase_2_scan_rate->text().toFloat();
phase.constant_temp_time_min = (uint16_t)ui->phase_2_constant_temp->text().toInt();
// phase.gas = ui->comboBox_phase_1_atmosphere->currentIndex();
phase.gas = GasType::N2;
phaseVtr.push_back(phase);
}
}
void ExperimentSettingForm::slotCancel()
{
}
void ExperimentSettingForm::slotPhaseCheck()
{
if(sender() == ui->checkBox_phase_2){
if(ui->checkBox_phase_2->isChecked()){
ui->phase_2_cutoff_temp->setEnabled(true);
ui->phase_2_scan_rate->setEnabled(true);
ui->phase_2_constant_temp->setEnabled(true);
ui->comboBox_phase_2_atmosphere->setEnabled(true);
}else{
ui->phase_2_cutoff_temp->setEnabled(false);
ui->phase_2_scan_rate->setEnabled(false);
ui->phase_2_constant_temp->setEnabled(false);
ui->comboBox_phase_2_atmosphere->setEnabled(false);
}
}else if(sender() == ui->checkBox_phase_3){
if(ui->checkBox_phase_3->isChecked()){
ui->phase_3_cutoff_temp->setEnabled(true);
ui->phase_3_scan_rate->setEnabled(true);
ui->phase_3_constant_temp->setEnabled(true);
ui->comboBox_phase_3_atmosphere->setEnabled(true);
}else{
ui->phase_3_cutoff_temp->setEnabled(false);
ui->phase_3_scan_rate->setEnabled(false);
ui->phase_3_constant_temp->setEnabled(false);
ui->comboBox_phase_3_atmosphere->setEnabled(false);
}
}else if(sender() == ui->checkBox_phase_4){
if(ui->checkBox_phase_4->isChecked()){
ui->phase_4_cutoff_temp->setEnabled(true);
ui->phase_4_scan_rate->setEnabled(true);
ui->phase_4_constant_temp->setEnabled(true);
ui->comboBox_phase_4_atmosphere->setEnabled(true);
}else{
ui->phase_4_cutoff_temp->setEnabled(false);
ui->phase_4_scan_rate->setEnabled(false);
ui->phase_4_constant_temp->setEnabled(false);
ui->comboBox_phase_4_atmosphere->setEnabled(false);
}
}
}

View File

@ -0,0 +1,31 @@
#ifndef EXPERIMENTSETTINGFORM_H
#define EXPERIMENTSETTINGFORM_H
#include <QWidget>
namespace Ui {
class ExperimentSettingForm;
}
class ExperimentSettingForm : public QWidget
{
Q_OBJECT
public:
explicit ExperimentSettingForm(QWidget *parent = nullptr);
~ExperimentSettingForm();
private:
void uiReset();
//slot
void slotPhaseCheck();
void slotPhase2StateChanged(int state);
void slotPhase3StateChanged(int state);
void slotPhase4StateChanged(int state);
void slotConnectToDevice();
void slotCancel();
private:
Ui::ExperimentSettingForm *ui;
};
#endif // EXPERIMENTSETTINGFORM_H

View File

@ -0,0 +1,492 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ExperimentSettingForm</class>
<widget class="QWidget" name="ExperimentSettingForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>851</width>
<height>338</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QWidget" name="horizontalLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>821</width>
<height>271</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="1,2">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>样品参数</string>
</property>
<widget class="QWidget" name="formLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>241</width>
<height>181</height>
</rect>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="Label">
<property name="text">
<string>样品名称:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="sampleNameLineEdit"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="Label_2">
<property name="text">
<string>样品质量:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="sampleWeightLineEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="Label_3">
<property name="text">
<string>实验日期:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="dateTimeLineEdit"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="Label_4">
<property name="text">
<string>操作员:</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="userLineEdit"/>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>实验参数</string>
</property>
<widget class="QWidget" name="gridLayoutWidget">
<property name="geometry">
<rect>
<x>10</x>
<y>40</y>
<width>491</width>
<height>211</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout" rowstretch="1,1,1,1,1,1">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>阶段</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="phase_1_cutoff_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_3">
<property name="text">
<string>截止温度</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLineEdit" name="phase_1_scan_rate">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLineEdit" name="phase_1_constant_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="label_4">
<property name="text">
<string>气氛</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="label_5">
<property name="text">
<string>恒温时间</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label">
<property name="text">
<string>扫描速率</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>测试类型:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="phase_2_cutoff_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLineEdit" name="phase_2_scan_rate">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLineEdit" name="phase_2_constant_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="phase_3_cutoff_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="phase_4_cutoff_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>100</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLineEdit" name="phase_3_scan_rate">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLineEdit" name="phase_4_scan_rate">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QLineEdit" name="phase_3_constant_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QLineEdit" name="phase_4_constant_temp">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QRadioButton" name="radioButton_OIT">
<property name="text">
<string>OIT</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QRadioButton" name="radioButton_OIT_not">
<property name="text">
<string>非OIT</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBox_phase_1">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>1</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QCheckBox" name="checkBox_phase_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>2</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QCheckBox" name="checkBox_phase_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>3</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="checkBox_phase_4">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>4</string>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QComboBox" name="comboBox_initial_atmosphere">
<item>
<property name="text">
<string>NC</string>
</property>
</item>
<item>
<property name="text">
<string>N2</string>
</property>
</item>
<item>
<property name="text">
<string>O2</string>
</property>
</item>
</widget>
</item>
<item row="4" column="4">
<widget class="QComboBox" name="comboBox_phase_4_atmosphere">
<item>
<property name="text">
<string>NC</string>
</property>
</item>
<item>
<property name="text">
<string>N2</string>
</property>
</item>
<item>
<property name="text">
<string>O2</string>
</property>
</item>
</widget>
</item>
<item row="3" column="4">
<widget class="QComboBox" name="comboBox_phase_3_atmosphere">
<item>
<property name="text">
<string>NC</string>
</property>
</item>
<item>
<property name="text">
<string>N2</string>
</property>
</item>
<item>
<property name="text">
<string>O2</string>
</property>
</item>
</widget>
</item>
<item row="2" column="4">
<widget class="QComboBox" name="comboBox_phase_2_atmosphere">
<item>
<property name="text">
<string>NC</string>
</property>
</item>
<item>
<property name="text">
<string>N2</string>
</property>
</item>
<item>
<property name="text">
<string>O2</string>
</property>
</item>
</widget>
</item>
<item row="1" column="4">
<widget class="QComboBox" name="comboBox_phase_1_atmosphere">
<item>
<property name="text">
<string>NC</string>
</property>
</item>
<item>
<property name="text">
<string>N2</string>
</property>
</item>
<item>
<property name="text">
<string>O2</string>
</property>
</item>
</widget>
</item>
<item row="5" column="3">
<widget class="QLabel" name="label_7">
<property name="text">
<string>初始气氛:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QPushButton" name="pushButton_connect_to_device">
<property name="geometry">
<rect>
<x>471</x>
<y>300</y>
<width>80</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>连接仪器</string>
</property>
</widget>
<widget class="QPushButton" name="pushButton_cancel">
<property name="geometry">
<rect>
<x>580</x>
<y>300</y>
<width>81</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>取消</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

158
src/ui/leftwidget.cpp Normal file
View File

@ -0,0 +1,158 @@
#include <qdir.h>
#include <qdebug.h>
#include <QHBoxLayout>
#include "leftwidget.h"
const QString sampleDataFloder = QDir::currentPath()+"/../experiment_data/sample_data";
const QString baseLineFolder = QDir::currentPath()+"/../experiment_data/base_line";
const QString analysisStateFolder = QDir::currentPath()+"/../experiment_data/analysis_state";
LeftWidget::LeftWidget()
{
// setStyleSheet("background-color: yellow;");
_treeWidget = new QTreeWidget();
_treeWidget->setHeaderHidden(true);
_analysisStateItem = new QTreeWidgetItem(_treeWidget);
_analysisStateItem->setText(0,"分析状态");
_baseLineItem = new QTreeWidgetItem(_treeWidget);
_baseLineItem->setText(0,"基线");
_sampleDataItem = new QTreeWidgetItem(_treeWidget);
_sampleDataItem->setText(0,"样品数据");
_treeWidget->setSortingEnabled(false);
// _treeWidget->insertTopLevelItem(0,_sampleDataItem);
// _treeWidget->insertTopLevelItem(1,_baseLineItem);
// _treeWidget->insertTopLevelItem(2,_analysisStateItem);
_treeWidget->addTopLevelItem(_sampleDataItem);
_treeWidget->addTopLevelItem(_baseLineItem);
_treeWidget->addTopLevelItem(_analysisStateItem);
#if 0
qDebug()<<"current path:"<<QDir::currentPath();
QString folderPath = QDir::currentPath()+"/../experiment_data";
qDebug()<<"experit dir:"<<folderPath;
QDir dir(folderPath);
qDebug()<<"folderPath exist:"<< dir.exists();
#endif
//init file name.
initFileName(_sampleDataItem,sampleDataFloder);
initFileName(_baseLineItem,baseLineFolder);
initFileName(_analysisStateItem,analysisStateFolder);
expandAll(_sampleDataItem);
expandAll(_baseLineItem);
expandAll(_analysisStateItem);
setWidget(_treeWidget);
}
void LeftWidget::initData()
{
const QString folderPath = QDir::currentPath()+"/../experiment_data";
#if 1
QDir dir(folderPath);
if (!dir.exists()) {
qWarning() << "文件夹不存在: " << folderPath;
return;
}
// 遍历文件
QFileInfoList fileList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);
for (const QFileInfo& fileInfo : fileList) {
QFile file(fileInfo.absoluteFilePath());
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString content = file.readAll();
qDebug() << "读取文件 " << fileInfo.absoluteFilePath() << " 内容: " << content;
file.close();
// 写入文件操作示例:这里简单在文件末尾追加一行内容
if (file.open(QIODevice::Append | QIODevice::Text)) {
file.write("\n这是通过递归写入添加的内容");
qDebug() << "已向文件 " << fileInfo.absoluteFilePath() << " 写入内容";
file.close();
} else {
qWarning() << "无法打开文件进行写入: " << fileInfo.absoluteFilePath();
}
} else {
qWarning() << "无法打开文件进行读取: " << fileInfo.absoluteFilePath();
}
}
#endif
}
void LeftWidget::initFileName(QTreeWidgetItem* parentItem,const QString &folderPath)
{
QDir dir(folderPath);
QStringList files = dir.entryList(QDir::Files);
for(const QString &fileName:files){
QTreeWidgetItem *subItem = new QTreeWidgetItem();
subItem->setText(0,fileName);
// _sampleDataItem->addChild(new QTreeWidgetItem(0,fileName));
parentItem->addChild(subItem);
}
#if 0
// 获取文件夹中的所有文件名
QStringList files = dir.entryList(QDir::Files); // 只列出文件
qDebug() << "Files in the current directory:";
foreach (const QString &fileName, files)
{
qDebug() << fileName;
}
#endif
}
void LeftWidget::expandAll(QTreeWidgetItem* item) {
item->setExpanded(true);
for (int i = 0; i < item->childCount(); ++i) {
expandAll(item->child(i));
}
}
#if 0
void LeftWidget::recursiveFolderOperation(const QString& folderPath) {
QDir dir(folderPath);
if (!dir.exists()) {
qWarning() << "文件夹不存在: " << folderPath;
return;
}
// 遍历文件
QFileInfoList fileList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);
for (const QFileInfo& fileInfo : fileList) {
QFile file(fileInfo.absoluteFilePath());
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString content = file.readAll();
qDebug() << "读取文件 " << fileInfo.absoluteFilePath() << " 内容: " << content;
file.close();
// 写入文件操作示例:这里简单在文件末尾追加一行内容
if (file.open(QIODevice::Append | QIODevice::Text)) {
file.write("\n这是通过递归写入添加的内容");
qDebug() << "已向文件 " << fileInfo.absoluteFilePath() << " 写入内容";
file.close();
} else {
qWarning() << "无法打开文件进行写入: " << fileInfo.absoluteFilePath();
}
} else {
qWarning() << "无法打开文件进行读取: " << fileInfo.absoluteFilePath();
}
}
// 递归遍历子文件夹
QFileInfoList subDirList = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const QFileInfo& subDirInfo : subDirList) {
recursiveFolderOperation(subDirInfo.absoluteFilePath());
}
}
#endif

25
src/ui/leftwidget.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef LEFTWIDGET_H
#define LEFTWIDGET_H
#include <QWidget>
#include <QDockWidget>
#include <qtreewidget.h>
#include <QTreeWidgetItem>
class LeftWidget:public QDockWidget
{
Q_OBJECT
public:
LeftWidget();
private:
void initData();
void initFileName(QTreeWidgetItem*,const QString &folderPath);
void expandAll(QTreeWidgetItem* item);
private:
QTreeWidget *_treeWidget;
QTreeWidgetItem *_analysisStateItem,
*_baseLineItem,
*_sampleDataItem;
};
#endif // LEFTWIDGET_H

Binary file not shown.