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

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 ) {
ads::CDockWidget* dock_widget = new ads::CDockWidget(view->GetViewName());
dock_widget->setWidget(view);
dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::CustomCloseHandling);
dock_widget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContentMinimumSize);
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);
MeasureAnalysisView::ViewType view_type = view->GetAnalyzeViewType();
switch (view_type) {
case MeasureAnalysisView::ViewType::DataTable: {
if (view->GetAnalyzeViewType() == MeasureAnalysisView::ViewType::DataTable) {
dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::DockWidgetDeleteOnClose);
_menu_view_data_table_list->addAction(dock_widget->toggleViewAction());
} break;
default:
break;
} else {
dock_widget->setFeatures(dock_widget->features() | ads::CDockWidget::CustomCloseHandling);
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)
: MeasureAnalysisView { parent }
, _preload_policy(PreloadPolicy::Balanced)
, _block_size(1000)
, _preload_policy(PreloadPolicy::Conservative)
, _block_size(100)
, _buffer_size(50)
{
this->setAnalyzeViewType(ViewType::DataTable);
QHBoxLayout* layout = new QHBoxLayout(this);
// 创建表格视图
_tableView = new VirtualTableView(this);
_tableView->setFixedRowHeight(25); // 设置固定行高
_tableView->setFixedRowHeight(25);
_tableView->setShowGrid(true);
_tableView->setAlternatingRowColors(false);
layout->addWidget(_tableView);

View File

@ -35,26 +35,12 @@ TreeWidget::TreeWidget(QWidget* parent)
if (item) {
TreeItemType item_type = item->GetType();
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::ParticleCountData:
case TreeItemType::ConformParticleData: {
const QString view_type_text = MeasureAnalysisView::GetAnalyzeViewTypeText(MeasureAnalysisView::ViewType::DataTable);
item->NewAnalyzeView(item->GetName(), item->GetDescription(), view_type_text);
MeasureAnalysisView* view = item->GetAnalyzeView();
MeasureAnalysisView* view = item->GetAnalyzeView(true);
if (view) {
emit currentItemViewWidget(view);
}

View File

@ -18,6 +18,14 @@ TreeItem::TreeItem()
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()
{
return this->_name;
@ -40,9 +48,13 @@ void TreeItem::SetDescription(const QString& 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)

View File

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

View File

@ -27,44 +27,44 @@ QMap<QString, MeasureAnalysisView::ViewType> MeasureAnalysisView::_s_analyze_vie
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)) {
ViewType view_type = _s_analyze_view_type_list[view_type_text];
switch (view_type) {
case ViewType::DataTable: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::CountSpectrum: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::CoincidenceEnergySpectrum3D: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::CountingRate: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::EnergyPeakFit: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::NuclideAnalysis: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::ParticleInTime: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::ParticleTimeDiff: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::CoincidenceEventTime: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::CoincidenceEnergySpectrum: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
case ViewType::AntiCoincidenceSpectrum: {
new_view = std::shared_ptr<MeasureAnalysisView>(new MeasureAnalysisDataTableView);
new_view = new MeasureAnalysisDataTableView;
} break;
default:
break;

View File

@ -24,7 +24,7 @@ public:
CoincidenceEnergySpectrum,
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);
private:
static QMap<QString, ViewType> _s_analyze_view_type_list;

View File

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