优化数据表显示管理内存泄露

This commit is contained in:
徐海 2026-03-04 14:39:47 +08:00
parent 259c798b5d
commit c020345b76
8 changed files with 51 additions and 53 deletions

View File

@ -220,27 +220,20 @@ void MainWindow::initAction()
if ( !view_exist ) { if ( !view_exist ) {
ads::CDockWidget* dock_widget = new ads::CDockWidget(view->GetViewName()); ads::CDockWidget* dock_widget = new ads::CDockWidget(view->GetViewName());
dock_widget->setWidget(view); dock_widget->setWidget(view);
dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::CustomCloseHandling);
dock_widget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContentMinimumSize); dock_widget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContentMinimumSize);
dock_widget->setProperty("TakeWidget", true); if (view->GetAnalyzeViewType() == MeasureAnalysisView::ViewType::DataTable) {
connect(dock_widget, &CDockWidget::closeRequested, [dock_widget](){
dock_widget->takeWidget();
dock_widget->deleteDockWidget();
});
auto central_area = _dock_manager->centralWidget()->dockAreaWidget();
_dock_manager->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, dock_widget, central_area);
MeasureAnalysisView::ViewType view_type = view->GetAnalyzeViewType();
switch (view_type) {
case MeasureAnalysisView::ViewType::DataTable: {
dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::DockWidgetDeleteOnClose); dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::DockWidgetDeleteOnClose);
_menu_view_data_table_list->addAction(dock_widget->toggleViewAction()); _menu_view_data_table_list->addAction(dock_widget->toggleViewAction());
} break; } else {
default: dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::CustomCloseHandling);
break; dock_widget->setProperty("TakeWidget", true);
connect(dock_widget, &CDockWidget::closeRequested, [dock_widget](){
dock_widget->takeWidget();
dock_widget->deleteDockWidget();
});
} }
auto central_area = _dock_manager->centralWidget()->dockAreaWidget();
_dock_manager->addDockWidget(ads::DockWidgetArea::CenterDockWidgetArea, dock_widget, central_area);
} }
} }
}); });

View File

@ -6,15 +6,15 @@
MeasureAnalysisDataTableView::MeasureAnalysisDataTableView(QWidget* parent) MeasureAnalysisDataTableView::MeasureAnalysisDataTableView(QWidget* parent)
: MeasureAnalysisView { parent } : MeasureAnalysisView { parent }
, _preload_policy(PreloadPolicy::Balanced) , _preload_policy(PreloadPolicy::Conservative)
, _block_size(1000) , _block_size(100)
, _buffer_size(50) , _buffer_size(50)
{ {
this->setAnalyzeViewType(ViewType::DataTable); this->setAnalyzeViewType(ViewType::DataTable);
QHBoxLayout* layout = new QHBoxLayout(this); QHBoxLayout* layout = new QHBoxLayout(this);
// 创建表格视图 // 创建表格视图
_tableView = new VirtualTableView(this); _tableView = new VirtualTableView(this);
_tableView->setFixedRowHeight(25); // 设置固定行高 _tableView->setFixedRowHeight(25);
_tableView->setShowGrid(true); _tableView->setShowGrid(true);
_tableView->setAlternatingRowColors(false); _tableView->setAlternatingRowColors(false);
layout->addWidget(_tableView); layout->addWidget(_tableView);

View File

@ -35,26 +35,12 @@ TreeWidget::TreeWidget(QWidget* parent)
if (item) { if (item) {
TreeItemType item_type = item->GetType(); TreeItemType item_type = item->GetType();
switch (item_type) { switch (item_type) {
// case TreeItem::TreeItemType::None:
// break;
// case TreeItem::TreeItemType::MeasureAnalysisProject:
// this->expandItem(item);
// break;
// case TreeItem::TreeItemType::MeasureCtrlGroup:
// this->expandItem(item);
// break;
// case TreeItem::TreeItemType::AnalyzeDataGroup:
// this->expandItem(item);
// break;
// case TreeItem::TreeItemType::AnalyzeViewGroup:
// this->expandItem(item);
// break;
case TreeItemType::ParticleData: case TreeItemType::ParticleData:
case TreeItemType::ParticleCountData: case TreeItemType::ParticleCountData:
case TreeItemType::ConformParticleData: { case TreeItemType::ConformParticleData: {
const QString view_type_text = MeasureAnalysisView::GetAnalyzeViewTypeText(MeasureAnalysisView::ViewType::DataTable); const QString view_type_text = MeasureAnalysisView::GetAnalyzeViewTypeText(MeasureAnalysisView::ViewType::DataTable);
item->NewAnalyzeView(item->GetName(), item->GetDescription(), view_type_text); item->NewAnalyzeView(item->GetName(), item->GetDescription(), view_type_text);
MeasureAnalysisView* view = item->GetAnalyzeView(); MeasureAnalysisView* view = item->GetAnalyzeView(true);
if (view) { if (view) {
emit currentItemViewWidget(view); emit currentItemViewWidget(view);
} }

View File

@ -18,6 +18,14 @@ TreeItem::TreeItem()
this->_type = TreeItemType::None; this->_type = TreeItemType::None;
} }
TreeItem::~TreeItem()
{
if (this->_ptr_analyze_view) {
delete this->_ptr_analyze_view;
this->_ptr_analyze_view = nullptr;
}
}
const QString& TreeItem::GetName() const QString& TreeItem::GetName()
{ {
return this->_name; return this->_name;
@ -40,9 +48,13 @@ void TreeItem::SetDescription(const QString& desc)
this->setStatusTip(0, desc); this->setStatusTip(0, desc);
} }
MeasureAnalysisView* TreeItem::GetAnalyzeView() const MeasureAnalysisView* TreeItem::GetAnalyzeView(bool b_take)
{ {
return this->_ptr_analyze_view.get(); MeasureAnalysisView* view = this->_ptr_analyze_view;
if ( b_take ) {
this->_ptr_analyze_view = nullptr;
}
return view;
} }
void TreeItem::NewAnalyzeView(const QString &name, const QString &description, const QString &view_type_text) void TreeItem::NewAnalyzeView(const QString &name, const QString &description, const QString &view_type_text)

View File

@ -31,13 +31,15 @@ public:
public: public:
TreeItem(); TreeItem();
virtual ~TreeItem();
const QString& GetName(); const QString& GetName();
void SetName(const QString& name); void SetName(const QString& name);
const QString& GetDescription(); const QString& GetDescription();
void SetDescription(const QString& desc); void SetDescription(const QString& desc);
public: public:
MeasureAnalysisView* GetAnalyzeView() const; MeasureAnalysisView* GetAnalyzeView(bool b_take = false);
void NewAnalyzeView(const QString& name, const QString& description, const QString& view_type_text); void NewAnalyzeView(const QString& name, const QString& description, const QString& view_type_text);
public: public:
@ -45,7 +47,7 @@ public:
friend QDataStream& operator>>(QDataStream& in, TreeItem& item); friend QDataStream& operator>>(QDataStream& in, TreeItem& item);
protected: protected:
std::shared_ptr<MeasureAnalysisView> _ptr_analyze_view; MeasureAnalysisView* _ptr_analyze_view { nullptr };
private: private:
TreeItemType _type; TreeItemType _type;

View File

@ -27,44 +27,44 @@ QMap<QString, MeasureAnalysisView::ViewType> MeasureAnalysisView::_s_analyze_vie
MeasureAnalysisView::ViewType::AntiCoincidenceSpectrum } MeasureAnalysisView::ViewType::AntiCoincidenceSpectrum }
}; };
std::shared_ptr<MeasureAnalysisView> MeasureAnalysisView::NewAnalyzeView(const QString& view_type_text) MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(const QString& view_type_text)
{ {
std::shared_ptr<MeasureAnalysisView> new_view; MeasureAnalysisView* new_view = nullptr;
if (_s_analyze_view_type_list.contains(view_type_text)) { if (_s_analyze_view_type_list.contains(view_type_text)) {
ViewType view_type = _s_analyze_view_type_list[view_type_text]; ViewType view_type = _s_analyze_view_type_list[view_type_text];
switch (view_type) { switch (view_type) {
case ViewType::DataTable: { case ViewType::DataTable: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::CountSpectrum: { case ViewType::CountSpectrum: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::CoincidenceEnergySpectrum3D: { case ViewType::CoincidenceEnergySpectrum3D: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::CountingRate: { case ViewType::CountingRate: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::EnergyPeakFit: { case ViewType::EnergyPeakFit: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::NuclideAnalysis: { case ViewType::NuclideAnalysis: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::ParticleInTime: { case ViewType::ParticleInTime: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::ParticleTimeDiff: { case ViewType::ParticleTimeDiff: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::CoincidenceEventTime: { case ViewType::CoincidenceEventTime: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::CoincidenceEnergySpectrum: { case ViewType::CoincidenceEnergySpectrum: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
case ViewType::AntiCoincidenceSpectrum: { case ViewType::AntiCoincidenceSpectrum: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView); new_view = new MeasureAnalysisDataTableView;
} break; } break;
default: default:
break; break;

View File

@ -24,7 +24,7 @@ public:
CoincidenceEnergySpectrum, CoincidenceEnergySpectrum,
AntiCoincidenceSpectrum AntiCoincidenceSpectrum
}; };
static std::shared_ptr<MeasureAnalysisView> NewAnalyzeView(const QString& view_type_text); static MeasureAnalysisView* NewAnalyzeView(const QString& view_type_text);
static const QString& GetAnalyzeViewTypeText(ViewType type); static const QString& GetAnalyzeViewTypeText(ViewType type);
private: private:
static QMap<QString, ViewType> _s_analyze_view_type_list; static QMap<QString, ViewType> _s_analyze_view_type_list;

View File

@ -71,6 +71,11 @@ VirtualTableView::~VirtualTableView()
{ {
m_updateTimer.stop(); m_updateTimer.stop();
m_scrollSpeedTimer.stop(); m_scrollSpeedTimer.stop();
if (m_virtualModel) {
delete m_virtualModel;
m_virtualModel = nullptr;
}
} }
void VirtualTableView::setVirtualModel(VirtualTableModel* model) void VirtualTableView::setVirtualModel(VirtualTableModel* model)