diff --git a/src/CustomQwtPlot.cpp b/src/CustomQwtPlot.cpp index 522b0b0..5865f29 100644 --- a/src/CustomQwtPlot.cpp +++ b/src/CustomQwtPlot.cpp @@ -285,19 +285,6 @@ CustomQwtPlotXaxisSelector::~CustomQwtPlotXaxisSelector() qDebug() << "~CustomQwtPlotXaxisSelector"; } -bool CustomQwtPlotXaxisSelector::end(bool ok) -{ - if (!ok) { - clearSelection(); - return QwtPlotPicker::end(ok); - } - if (_overlay->isVisible()) { - _overlay->setVisible(false); - plot()->replot(); - } - emit selectionFinished(_min_x, _max_x); - return QwtPlotPicker::end(ok); -} double CustomQwtPlotXaxisSelector::selectedMinX() const { @@ -344,6 +331,21 @@ void CustomQwtPlotXaxisSelector::move(const QPoint & pos) QwtPlotPicker::move(pos); } +bool CustomQwtPlotXaxisSelector::end(bool ok) +{ + if (!ok) { + clearSelection(); + return QwtPlotPicker::end(ok); + } + if (_overlay->isVisible()) { + _overlay->setVisible(false); + plot()->replot(); + } + if ( (_max_x - _min_x) > 3 ) { + emit selectionFinished(_min_x, _max_x); + } + return QwtPlotPicker::end(ok); +} QColor getDistinctColorForManyCurves(int curve_index) diff --git a/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.cpp b/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.cpp index 860d1fa..75d2a16 100644 --- a/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.cpp +++ b/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.cpp @@ -1,5 +1,6 @@ #include "BatchEneryScaleDialog.h" #include "ui_BatchEneryScaleDialog.h" +#include #include BatchEneryScaleDialog::BatchEneryScaleDialog(QWidget* parent) @@ -7,14 +8,87 @@ BatchEneryScaleDialog::BatchEneryScaleDialog(QWidget* parent) , ui(new Ui::BatchEneryScaleDialog) { ui->setupUi(this); + this->setWindowTitle(QString(QStringLiteral(u"多通道能量刻度"))); this->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); this->setWindowModality(Qt::WindowModal); this->setModal(false); - ui->tablew_process_data->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + ui->tablew_process_data->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tablew_process_data->horizontalHeader()->setSectionResizeMode( ui->tablew_process_data->columnCount() - 1, QHeaderView::ResizeToContents); ui->tablew_process_data->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); + + ui->filter_set_enery_combo_box->addItem(QStringLiteral(u"所有设置能量")); + auto filterFunc = [this](){ + ui->tablew_process_data->setCurrentItem(nullptr); + auto row_count = ui->tablew_process_data->rowCount(); + const QString& channel_filter_text = ui->filter_channel_combo_box->currentText(); + const QString& set_enery_filter_text = ui->filter_set_enery_combo_box->currentText(); + for (int i = row_count - 1; i >= 0; i--) { + const QString& channel = ui->tablew_process_data->item(i, 0)->text(); + const QString& set_enery = ui->tablew_process_data->item(i, 2)->text(); + bool is_match_channel = false; + if (channel_filter_text != QStringLiteral(u"所有通道")) { + is_match_channel = (channel_filter_text == channel) ? false : true; + } + bool is_match_set_enery = false; + if (set_enery_filter_text != QStringLiteral(u"所有设置能量")) { + is_match_set_enery = (set_enery_filter_text == set_enery) ? false : true; + } + bool is_hidden = is_match_channel || is_match_set_enery; + ui->tablew_process_data->setRowHidden(i, is_hidden); + } + }; + connect(ui->filter_channel_combo_box, &QComboBox::currentTextChanged, filterFunc); + connect(ui->filter_set_enery_combo_box, &QComboBox::currentTextChanged, filterFunc); + + connect(ui->btn_all_select, &QPushButton::clicked, [this](){ + ui->tablew_process_data->setCurrentItem(nullptr); + auto row_count = ui->tablew_process_data->rowCount(); + for (int i = 0; i < row_count; ++i) { + if (ui->tablew_process_data->isRowHidden(i)) { + continue; + } + auto item = ui->tablew_process_data->item(i, 0); + if (item) { + item->setCheckState(Qt::Checked); + } + } + }); + connect(ui->btn_reserve_select, &QPushButton::clicked, [this](){ + ui->tablew_process_data->setCurrentItem(nullptr); + auto row_count = ui->tablew_process_data->rowCount(); + for (int i = 0; i < row_count - 1; i++) { + if (ui->tablew_process_data->isRowHidden(i)) { + continue; + } + auto item = ui->tablew_process_data->item(i, 0); + if (item) { + Qt::CheckState check_state = (item->checkState() == Qt::Checked) ? Qt::Unchecked : Qt::Checked; + item->setCheckState(check_state); + } + } + }); + connect(ui->btn_remove_selected, &QPushButton::clicked, [this](){ + auto row_count = ui->tablew_process_data->rowCount(); + for (int row = row_count - 1; row >= 0; --row) { + QTableWidgetItem* item = ui->tablew_process_data->item(row, 0); + if (Qt::Unchecked == item->checkState()) + continue; + QPushButton* btn_remove_row = dynamic_cast(ui->tablew_process_data->cellWidget(row, 8)); + if (btn_remove_row) { + ui->tablew_process_data->removeRow(row); + btn_remove_row->deleteLater(); + } + } + this->updateSetEneryFilter(); + }); + connect(ui->btn_fit, &QPushButton::clicked, [this](){ + + }); + connect(ui->btn_save, &QPushButton::clicked, [this](){ + + }); } BatchEneryScaleDialog::~BatchEneryScaleDialog() @@ -22,15 +96,121 @@ BatchEneryScaleDialog::~BatchEneryScaleDialog() delete ui; } +void BatchEneryScaleDialog::SetChannelNameList(const QStringList &ch_name_list) +{ + ui->filter_channel_combo_box->clear(); + ui->filter_channel_combo_box->addItem(QString(QStringLiteral(u"所有通道"))); + ui->filter_channel_combo_box->addItems(ch_name_list); +} + void BatchEneryScaleDialog::SetPeakResultDataModel(QAbstractTableModel* peaks_result_model) { _peaks_result_model = peaks_result_model; - qDebug() << _peaks_result_model->rowCount(); + if (_peaks_result_model) { + qDebug() << _peaks_result_model->rowCount(); + } } void BatchEneryScaleDialog::onSelectedScaleRange(double min, double max) { - qDebug() << min << ", " << max; + if (!_peaks_result_model) { + return; + } + QDialog set_enery_dlg(this, Qt::Dialog | Qt::WindowCloseButtonHint); + set_enery_dlg.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + set_enery_dlg.setFixedSize(300, 100); + set_enery_dlg.setSizeGripEnabled(false); + set_enery_dlg.setWindowTitle(QString(QStringLiteral(u"设置刻度能量"))); + + QLabel* set_enery_label = new QLabel(QString(QStringLiteral(u"刻度能量:"))); + QDoubleSpinBox* spinbox_set_enery = new QDoubleSpinBox(); + spinbox_set_enery->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + spinbox_set_enery->setRange(0.0f, std::numeric_limits::max()); + spinbox_set_enery->setSingleStep(1.0f); + spinbox_set_enery->setDecimals(3); + QHBoxLayout* layout_input = new QHBoxLayout(); + layout_input->addWidget(set_enery_label); + layout_input->addWidget(spinbox_set_enery); + + QPushButton* btn_ok = new QPushButton(QStringLiteral(u"确认")); + connect(btn_ok, &QPushButton::clicked, &set_enery_dlg, &QDialog::accept); + QPushButton* btn_cancel = new QPushButton(QStringLiteral(u"取消")); + connect(btn_cancel, &QPushButton::clicked, &set_enery_dlg, &QDialog::reject); + QHBoxLayout* layout_btns = new QHBoxLayout(); + layout_btns->addStretch(); + layout_btns->addWidget(btn_ok); + layout_btns->addWidget(btn_cancel); + + QVBoxLayout* layout = new QVBoxLayout(&set_enery_dlg); + layout->addLayout(layout_input); + layout->addStretch(); + layout->addLayout(layout_btns); + + if (QDialog::Accepted == set_enery_dlg.exec()) { + double set_enery = spinbox_set_enery->value(); + for (int i = 0; i < _peaks_result_model->rowCount(); i++) { + const QString& channel_name = _peaks_result_model->data(_peaks_result_model->index(i, 0)).toString(); + int peak_pos = _peaks_result_model->data(_peaks_result_model->index(i, 1)).toInt(); + int peak_fwhm = _peaks_result_model->data(_peaks_result_model->index(i, 6)).toInt(); + if (min < peak_pos && peak_pos > max ) { + continue; + } + int row = ui->tablew_process_data->rowCount(); + ui->tablew_process_data->insertRow(row); + ui->tablew_process_data->setItem(row, 0, new QTableWidgetItem(channel_name)); + ui->tablew_process_data->item(row, 0)->setCheckState(Qt::Unchecked); + ui->tablew_process_data->setItem(row, 1, new QTableWidgetItem(QString::number(peak_pos))); + ui->tablew_process_data->setItem(row, 2, new QTableWidgetItem(QString::number(set_enery))); + ui->tablew_process_data->setItem(row, 3, new QTableWidgetItem); + ui->tablew_process_data->setItem(row, 4, new QTableWidgetItem); + ui->tablew_process_data->setItem(row, 5, new QTableWidgetItem(QString::number(peak_fwhm))); + ui->tablew_process_data->setItem(row, 6, new QTableWidgetItem); + ui->tablew_process_data->setItem(row, 7, new QTableWidgetItem); + QTableWidgetItem* item = new QTableWidgetItem; + ui->tablew_process_data->setItem(row, 8, item); + QPushButton* btn_remove_row = new QPushButton(QStringLiteral(u"删除")); + btn_remove_row->setMaximumWidth(35); + connect(btn_remove_row, &QPushButton::clicked, [this, item, btn_remove_row]() { + item->setCheckState(Qt::Unchecked); + int remove_row = item->row(); + ui->tablew_process_data->removeRow(remove_row); + btn_remove_row->deleteLater(); + this->updateSetEneryFilter(); + }); + ui->tablew_process_data->setCellWidget(row, 8, btn_remove_row); + this->insertSetEneryValueToFilter(set_enery); + } + } +} + +void BatchEneryScaleDialog::insertSetEneryValueToFilter(double enery) +{ + int count = 0; + int index = ui->filter_set_enery_combo_box->findText(QString::number(enery)); + if (index >= 0) { + count = ui->filter_set_enery_combo_box->itemData(index).toInt() + 1; + ui->filter_set_enery_combo_box->setItemData(index, count); + } else { + ui->filter_set_enery_combo_box->addItem(QString::number(enery), count); + } +} + +void BatchEneryScaleDialog::updateSetEneryFilter() +{ + int item_count = ui->filter_set_enery_combo_box->count(); + for (int index = item_count - 1; index >= 1; --index) { + int count = ui->filter_set_enery_combo_box->itemData(index).toInt(); + count = count - 1; + ui->filter_set_enery_combo_box->setItemData(index, count); + if (0 == count) { + int current_index = ui->filter_set_enery_combo_box->currentIndex(); + if (index == current_index) { + ui->filter_set_enery_combo_box->setCurrentIndex(0); + } + ui->filter_set_enery_combo_box->removeItem(index); + } + } + } void BatchEneryScaleDialog::closeEvent(QCloseEvent *e) diff --git a/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.h b/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.h index 1a6f858..1561a30 100644 --- a/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.h +++ b/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.h @@ -17,11 +17,16 @@ public: explicit BatchEneryScaleDialog(QWidget *parent = nullptr); ~BatchEneryScaleDialog(); + void SetChannelNameList(const QStringList& ch_name_list); void SetPeakResultDataModel(QAbstractTableModel *peaks_result_model); public slots: void onSelectedScaleRange(double min, double max); +private: + void insertSetEneryValueToFilter(double enery); + void updateSetEneryFilter(); + signals: void close(); diff --git a/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.ui b/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.ui index b87dff1..f155beb 100644 --- a/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.ui +++ b/src/MeasureAnalysisParticleCountPlotView/BatchEneryScaleDialog.ui @@ -43,7 +43,7 @@ - + 75 @@ -64,7 +64,7 @@ - + 125 diff --git a/src/MeasureAnalysisParticleCountPlotView/FindPeaksResultDialog.cpp b/src/MeasureAnalysisParticleCountPlotView/FindPeaksResultDialog.cpp index 7992aca..780525c 100644 --- a/src/MeasureAnalysisParticleCountPlotView/FindPeaksResultDialog.cpp +++ b/src/MeasureAnalysisParticleCountPlotView/FindPeaksResultDialog.cpp @@ -12,8 +12,10 @@ #include FindPeaksResultDialog::FindPeaksResultDialog(QWidget *parent) + : QDialog(parent) { this->setWindowTitle(QString(QStringLiteral(u"寻峰结果"))); + this->setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); this->setWindowModality(Qt::WindowModal); this->setModal(false); @@ -75,7 +77,7 @@ FindPeaksResultDialog::FindPeaksResultDialog(QWidget *parent) connect(btn_all_select, &QPushButton::clicked, [this]() { _peaks_result_table->setCurrentItem(nullptr); auto row_count = _peaks_result_table->rowCount(); - for (int i = 0; i < row_count - 1; i++) { + for (int i = 0; i < row_count; i++) { if (_peaks_result_table->isRowHidden(i)) { continue; } @@ -88,7 +90,7 @@ FindPeaksResultDialog::FindPeaksResultDialog(QWidget *parent) connect(btn_reserve_select, &QPushButton::clicked, [this]() { _peaks_result_table->setCurrentItem(nullptr); auto row_count = _peaks_result_table->rowCount(); - for (int i = 0; i < row_count - 1; i++) { + for (int i = 0; i < row_count; i++) { if (_peaks_result_table->isRowHidden(i)) { continue; } diff --git a/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp b/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp index ba7fc7d..6698831 100644 --- a/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp +++ b/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp @@ -42,6 +42,7 @@ MeasureAnalysisParticleCountPlotView::MeasureAnalysisParticleCountPlotView(QWidg setupPlot(); setupMenu(); setupPeakResultDlg(); + setupEneryScaleDlg(); } MeasureAnalysisParticleCountPlotView::~MeasureAnalysisParticleCountPlotView() @@ -85,6 +86,22 @@ void MeasureAnalysisParticleCountPlotView::SetAnalyzeDataFilename(const QMap_plot->GetCurveList()) { + list_ch_names.append(curve->title().text()); + } + std::sort(list_ch_names.begin(), list_ch_names.end(), [](const QString& a, const QString& b) { + int num_a = ExtractNumberFromString(a); + int num_b = ExtractNumberFromString(b); + return num_a < num_b; + }); + if (_find_peaks_result_dlg ) { + _find_peaks_result_dlg->SetChannelNameList(list_ch_names); + } + if (_batch_enery_scale_dlg ) { + _batch_enery_scale_dlg->SetChannelNameList(list_ch_names); + } } void MeasureAnalysisParticleCountPlotView::setupMenu() @@ -144,7 +161,7 @@ void MeasureAnalysisParticleCountPlotView::setupPlot() _plot->SetXaxisDragScale(true); // new CustomQwtPlotXaxisPanner(_plot->canvas()); - new CustomQwtPlotXaxisMagnifier(_plot->canvas()); + // new CustomQwtPlotXaxisMagnifier(_plot->canvas()); _data_selector = new CustomQwtPlotXaxisSelector(_plot->canvas()); _data_selector->setEnabled(false); } @@ -153,22 +170,25 @@ void MeasureAnalysisParticleCountPlotView::setupPeakResultDlg() { if (!_find_peaks_result_dlg) { _find_peaks_result_dlg = new FindPeaksResultDialog(this); - QStringList list_ch_names; - for (QwtPlotCurve* curve : this->_plot->GetCurveList()) { - list_ch_names.append(curve->title().text()); - } - std::sort(list_ch_names.begin(), list_ch_names.end(), [](const QString& a, const QString& b) { - int num_a = ExtractNumberFromString(a); - int num_b = ExtractNumberFromString(b); - return num_a < num_b; - }); - _find_peaks_result_dlg->SetChannelNameList(list_ch_names); connect(_find_peaks_result_dlg, &FindPeaksResultDialog::peakInfoChanged, [this](QVariantMap peak_infos){ this->updatePlotPeakInfo(peak_infos); }); } } +void MeasureAnalysisParticleCountPlotView::setupEneryScaleDlg() +{ + if (!_batch_enery_scale_dlg) { + _batch_enery_scale_dlg = new BatchEneryScaleDialog(this); + _batch_enery_scale_dlg->SetPeakResultDataModel(_find_peaks_result_dlg->GetPeakResultDataModel()); + connect(_data_selector, &CustomQwtPlotXaxisSelector::selectionFinished, _batch_enery_scale_dlg, &BatchEneryScaleDialog::onSelectedScaleRange); + connect(_batch_enery_scale_dlg, &BatchEneryScaleDialog::close, [this](){ + this->_data_selector->setEnabled(false); + disconnect(_data_selector, &CustomQwtPlotXaxisSelector::selectionFinished, _batch_enery_scale_dlg, &BatchEneryScaleDialog::onSelectedScaleRange); + }); + } +} + void MeasureAnalysisParticleCountPlotView::loadDataFromFile(const QString& data_name, const QString& filename) { std::string address_str = QString(QStringLiteral(u"道址")).toStdString(); @@ -383,17 +403,10 @@ void MeasureAnalysisParticleCountPlotView::onActionManualFindPeaks() void MeasureAnalysisParticleCountPlotView::onActionEneryScale() { - if (!_batch_enery_scale_dlg) { - _batch_enery_scale_dlg = new BatchEneryScaleDialog(this); - _batch_enery_scale_dlg->SetPeakResultDataModel(_find_peaks_result_dlg->GetPeakResultDataModel()); - connect(_data_selector, &CustomQwtPlotXaxisSelector::selectionFinished, _batch_enery_scale_dlg, &BatchEneryScaleDialog::onSelectedScaleRange); - connect(_batch_enery_scale_dlg, &BatchEneryScaleDialog::close, [this](){ - this->_data_selector->setEnabled(false); - disconnect(_data_selector, &CustomQwtPlotXaxisSelector::selectionFinished, _batch_enery_scale_dlg, &BatchEneryScaleDialog::onSelectedScaleRange); - }); + if (_batch_enery_scale_dlg && _data_selector) { + _batch_enery_scale_dlg->show(); + _data_selector->setEnabled(true); } - _batch_enery_scale_dlg->show(); - _data_selector->setEnabled(true); } void MeasureAnalysisParticleCountPlotView::onActionPlotConfigure() diff --git a/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.h b/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.h index 3f4ecbb..d3b938e 100644 --- a/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.h +++ b/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.h @@ -29,6 +29,7 @@ private: void setupMenu(); void setupPlot(); void setupPeakResultDlg(); + void setupEneryScaleDlg(); void loadDataFromFile(const QString &data_name, const QString& filename); void loadPeaksResultToTable(QTableWidget* peaks_result_table); void updatePlotPeakInfo(const QVariantMap& peak_infos); diff --git a/src/main.cpp b/src/main.cpp index ed3fcc8..a544d7e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -50,7 +50,7 @@ int main(int argc, char *argv[]) // 设置样式 // app.setStyle(QStyleFactory::create("Fusion")); app.setWindowIcon(QIcon(":/logo/256.png")); - app.setQuitOnLastWindowClosed(true); + app.setQuitOnLastWindowClosed(false); // 在应用程序可执行文件所在目录检查并创建Projects目录 QString projects_dir_path = QDir(app.applicationDirPath()).filePath("Projects");