484 lines
11 KiB
C++
484 lines
11 KiB
C++
#ifndef SIGNALMEASUREMENTWIDGET_H
|
|
#define SIGNALMEASUREMENTWIDGET_H
|
|
|
|
#include <QWidget>
|
|
#include <QVBoxLayout>
|
|
#include <QHBoxLayout>
|
|
#include <QStackedWidget>
|
|
#include <QScrollArea>
|
|
#include <QLabel>
|
|
#include <QPushButton>
|
|
#include <QComboBox>
|
|
#include <QLineEdit>
|
|
#include <QDoubleSpinBox>
|
|
#include <QGroupBox>
|
|
#include <QTableWidget>
|
|
#include <QHeaderView>
|
|
#include <QTimer>
|
|
#include <QRadioButton>
|
|
#include <QButtonGroup>
|
|
#include <QCheckBox>
|
|
#include <QProgressBar>
|
|
#include <QSplitter>
|
|
#include "../hardware/channelmanager.h"
|
|
#include "channelstatuswidget.h"
|
|
|
|
/**
|
|
* @brief 信号测量功能模块基类
|
|
* 提供统一的工业风格UI框架
|
|
*/
|
|
class MeasurementModuleBase : public QWidget
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit MeasurementModuleBase(const QString &title, QWidget *parent = nullptr);
|
|
|
|
protected:
|
|
// 创建标准样式的输入控件
|
|
QLineEdit *createStyledInput(const QString &placeholder = "", int width = 120);
|
|
QDoubleSpinBox *createStyledSpinBox(double min, double max, int decimals = 2, int width = 120);
|
|
QComboBox *createStyledComboBox(const QStringList &items, int width = 150);
|
|
QPushButton *createPrimaryButton(const QString &text, int width = 120);
|
|
QPushButton *createSecondaryButton(const QString &text, int width = 100);
|
|
QLabel *createValueDisplay(const QString &value = "---", int width = 180);
|
|
QGroupBox *createStyledGroupBox(const QString &title);
|
|
|
|
// 添加带标签的输入行
|
|
QHBoxLayout *createLabeledRow(const QString &label, QWidget *widget, const QString &unit = "");
|
|
|
|
// 统一样式常量
|
|
static const QString CARD_STYLE;
|
|
static const QString INPUT_STYLE;
|
|
static const QString PRIMARY_BTN_STYLE;
|
|
static const QString SECONDARY_BTN_STYLE;
|
|
static const QString VALUE_DISPLAY_STYLE;
|
|
static const QString LABEL_STYLE;
|
|
static const QString GROUPBOX_STYLE;
|
|
|
|
QVBoxLayout *m_mainLayout;
|
|
QString m_title;
|
|
};
|
|
|
|
/**
|
|
* @brief 热电阻测量模块
|
|
* 支持2/3/4线热电阻测量和PT100输出
|
|
* 整合ChannelManager进行通道管理
|
|
*/
|
|
class RTDMeasurementWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
enum RTDType
|
|
{
|
|
PT100,
|
|
PT1000,
|
|
CU50,
|
|
CU100
|
|
};
|
|
enum MeasurementMode
|
|
{
|
|
TWO_WIRE_MODE,
|
|
THREE_WIRE_MODE,
|
|
FOUR_WIRE_MODE
|
|
};
|
|
|
|
explicit RTDMeasurementWidget(QWidget *parent = nullptr);
|
|
~RTDMeasurementWidget();
|
|
|
|
signals:
|
|
void measurementDataReady(double resistance, double temperature);
|
|
|
|
protected:
|
|
bool eventFilter(QObject *obj, QEvent *event) override;
|
|
|
|
private slots:
|
|
void onMeasureClicked();
|
|
void onStopClicked();
|
|
void onWireTypeChanged(int index);
|
|
void onChannelSelected(ChannelManager::ChannelId channelId);
|
|
void updateMeasurement();
|
|
|
|
private:
|
|
void setupUI();
|
|
void setupChannelSelection();
|
|
void updateChannelSelection();
|
|
void updateConnectionModeVisibility();
|
|
void generateSimulatedData();
|
|
double convertResistanceToTemperature(double resistance);
|
|
bool validateChannelForMode();
|
|
|
|
// 通道管理
|
|
ChannelManager *m_channelManager;
|
|
QMap<ChannelManager::ChannelId, ChannelStatusWidget *> m_channelWidgets;
|
|
ChannelManager::ChannelId m_selectedChannel;
|
|
ChannelManager::ChannelId m_currentChannel;
|
|
QTimer *m_measurementTimer;
|
|
|
|
// 测量状态
|
|
bool m_isMeasuring;
|
|
MeasurementMode m_currentMode;
|
|
RTDType m_currentRTDType;
|
|
double m_currentResistance;
|
|
double m_currentTemperature;
|
|
|
|
// UI控件
|
|
QWidget *m_channelSelectionWidget;
|
|
QComboBox *m_wireTypeCombo;
|
|
QComboBox *m_rtdTypeCombo;
|
|
QLabel *m_resistanceDisplay;
|
|
QLabel *m_temperatureDisplay;
|
|
QLabel *m_lineResDisplay;
|
|
QLabel *m_channelStatusLabel;
|
|
QLabel *m_wiringDiagramLabel;
|
|
QPushButton *m_measureBtn;
|
|
QPushButton *m_stopBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief PT100输出模块 - 双通道
|
|
* 支持两个通道的PT100温度输出
|
|
*/
|
|
class RTDOutputWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit RTDOutputWidget(QWidget *parent = nullptr);
|
|
~RTDOutputWidget();
|
|
|
|
private slots:
|
|
void onChannel1OutputClicked();
|
|
void onChannel1StopClicked();
|
|
void onChannel2OutputClicked();
|
|
void onChannel2StopClicked();
|
|
void onChannel1TempChanged(double value);
|
|
void onChannel2TempChanged(double value);
|
|
|
|
private:
|
|
void setupUI();
|
|
double convertTemperatureToResistance(double temperature);
|
|
|
|
// 输出状态
|
|
bool m_isChannel1Outputting;
|
|
bool m_isChannel2Outputting;
|
|
|
|
// 通道1控件
|
|
QDoubleSpinBox *m_channel1TempSpin;
|
|
QLabel *m_channel1ResDisplay;
|
|
QPushButton *m_channel1OutputBtn;
|
|
QPushButton *m_channel1StopBtn;
|
|
|
|
// 通道2控件
|
|
QDoubleSpinBox *m_channel2TempSpin;
|
|
QLabel *m_channel2ResDisplay;
|
|
QPushButton *m_channel2OutputBtn;
|
|
QPushButton *m_channel2StopBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 热电偶测量模块
|
|
* 支持热电偶电压测量和毫伏输出
|
|
*/
|
|
class ThermocoupleMeasurementWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit ThermocoupleMeasurementWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onMeasureClicked();
|
|
void onOutputClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QComboBox *m_tcTypeCombo; // K/J/T/E/S/R/B型选择
|
|
QLabel *m_voltageDisplay; // 电压显示(mV)
|
|
QLabel *m_temperatureDisplay; // 温度显示
|
|
QDoubleSpinBox *m_outputTempSpin; // 输出温度设置
|
|
QLabel *m_outputVoltageDisplay; // 输出电压显示
|
|
QPushButton *m_measureBtn;
|
|
QPushButton *m_outputBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 绝缘电阻测量模块
|
|
* 支持50V/100V绝缘电阻测量
|
|
*/
|
|
class InsulationMeasurementWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit InsulationMeasurementWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onMeasureClicked();
|
|
void onAutoTestToggled(bool enabled);
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QRadioButton *m_50vRadio;
|
|
QRadioButton *m_100vRadio;
|
|
QCheckBox *m_autoTestCheck; // 自动测试
|
|
QLabel *m_insulationDisplay; // 绝缘电阻显示
|
|
QLabel *m_statusDisplay; // 状态显示
|
|
QProgressBar *m_dischargeProgress; // 放电进度
|
|
QPushButton *m_measureBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 直流电流信号模块
|
|
* 支持0-20mA电流输出/测量
|
|
*/
|
|
class DCCurrentWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit DCCurrentWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onMeasureClicked();
|
|
void onOutputClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QRadioButton *m_activeRadio; // 有源模式
|
|
QRadioButton *m_passiveRadio; // 无源模式
|
|
QLabel *m_currentDisplay; // 电流显示
|
|
QLabel *m_maxDisplay; // 最大值
|
|
QLabel *m_minDisplay; // 最小值
|
|
QLabel *m_avgDisplay; // 平均值
|
|
QDoubleSpinBox *m_outputSpin; // 输出设置
|
|
QPushButton *m_measureBtn;
|
|
QPushButton *m_outputBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 直流电压信号模块
|
|
* 支持0-20V电压输出/测量
|
|
*/
|
|
class DCVoltageWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit DCVoltageWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onMeasureClicked();
|
|
void onOutputClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QLabel *m_voltageDisplay;
|
|
QLabel *m_maxDisplay;
|
|
QLabel *m_minDisplay;
|
|
QLabel *m_avgDisplay;
|
|
QDoubleSpinBox *m_outputSpin;
|
|
QPushButton *m_measureBtn;
|
|
QPushButton *m_outputBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 频率信号模块
|
|
* 支持频率测量和方波/正弦波输出
|
|
*/
|
|
class FrequencyWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit FrequencyWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onMeasureClicked();
|
|
void onOutputClicked();
|
|
void onWaveTypeChanged(int index);
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QLabel *m_frequencyDisplay;
|
|
QComboBox *m_waveTypeCombo; // 方波/正弦波
|
|
QDoubleSpinBox *m_freqSpin; // 频率设置
|
|
QDoubleSpinBox *m_amplitudeSpin; // 幅值设置
|
|
QPushButton *m_measureBtn;
|
|
QPushButton *m_outputBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 220VAC测量模块
|
|
*/
|
|
class ACVoltageWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit ACVoltageWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onMeasureClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QLabel *m_voltageDisplay;
|
|
QLabel *m_frequencyDisplay;
|
|
QPushButton *m_measureBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 开关量检测模块
|
|
*/
|
|
class SwitchDetectionWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit SwitchDetectionWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onDetectClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QRadioButton *m_resistanceMode; // 电阻通断模式
|
|
QRadioButton *m_voltageMode; // 电压模式
|
|
QLabel *m_statusDisplay; // 通断状态
|
|
QLabel *m_valueDisplay; // 测量值
|
|
QPushButton *m_detectBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 信号采集记录模块
|
|
*/
|
|
class SignalAcquisitionWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit SignalAcquisitionWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onStartClicked();
|
|
void onStopClicked();
|
|
void onExportClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QComboBox *m_channel1Type; // 通道1类型
|
|
QComboBox *m_channel2Type; // 通道2类型
|
|
QDoubleSpinBox *m_rateSpin; // 采集速率
|
|
QTableWidget *m_dataTable; // 数据表格
|
|
QPushButton *m_startBtn;
|
|
QPushButton *m_stopBtn;
|
|
QPushButton *m_exportBtn;
|
|
QTimer *m_acquisitionTimer;
|
|
};
|
|
|
|
/**
|
|
* @brief 斜波信号输出模块
|
|
*/
|
|
class RampSignalWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit RampSignalWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onStartClicked();
|
|
void onStopClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QComboBox *m_signalType; // 电压/电流
|
|
QDoubleSpinBox *m_startValue; // 起始值
|
|
QDoubleSpinBox *m_endValue; // 结束值
|
|
QDoubleSpinBox *m_rampRate; // 斜波速率
|
|
QLabel *m_currentValueDisplay; // 当前值
|
|
QProgressBar *m_rampProgress;
|
|
QPushButton *m_startBtn;
|
|
QPushButton *m_stopBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 电源纹波检测模块
|
|
*/
|
|
class RippleDetectionWidget : public MeasurementModuleBase
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit RippleDetectionWidget(QWidget *parent = nullptr);
|
|
|
|
private slots:
|
|
void onDetectClicked();
|
|
void onDiagnoseClicked();
|
|
|
|
private:
|
|
void setupUI();
|
|
|
|
QLabel *m_rippleDisplay; // 纹波值
|
|
QLabel *m_diagnosisDisplay; // 诊断结果
|
|
QLabel *m_confidenceDisplay; // 置信度
|
|
QPushButton *m_detectBtn;
|
|
QPushButton *m_diagnoseBtn;
|
|
};
|
|
|
|
/**
|
|
* @brief 信号测量主页面
|
|
* 包含所有测量功能模块的导航
|
|
*/
|
|
class SignalMeasurementWidget : public QWidget
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit SignalMeasurementWidget(QWidget *parent = nullptr);
|
|
|
|
void setModule(int moduleIndex);
|
|
|
|
signals:
|
|
void backRequested();
|
|
|
|
private slots:
|
|
void onBackClicked();
|
|
void onModuleSelected(int index);
|
|
|
|
private:
|
|
void setupUI();
|
|
void setupContentArea();
|
|
|
|
QStackedWidget *m_contentStack;
|
|
QLabel *m_titleLabel;
|
|
int m_currentModuleIndex;
|
|
|
|
// 各功能模块
|
|
RTDMeasurementWidget *m_rtdWidget;
|
|
RTDOutputWidget *m_rtdOutputWidget;
|
|
ThermocoupleMeasurementWidget *m_tcWidget;
|
|
InsulationMeasurementWidget *m_insulationWidget;
|
|
DCCurrentWidget *m_dcCurrentWidget;
|
|
DCVoltageWidget *m_dcVoltageWidget;
|
|
FrequencyWidget *m_frequencyWidget;
|
|
ACVoltageWidget *m_acVoltageWidget;
|
|
SwitchDetectionWidget *m_switchWidget;
|
|
SignalAcquisitionWidget *m_acquisitionWidget;
|
|
RampSignalWidget *m_rampWidget;
|
|
RippleDetectionWidget *m_rippleWidget;
|
|
};
|
|
|
|
#endif // SIGNALMEASUREMENTWIDGET_H
|