diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkImageStatisticsTreeItem.cpp b/Modules/ImageStatisticsUI/Qmitk/QmitkImageStatisticsTreeItem.cpp index 43ec8cf2f6..6c30c1bf76 100644 --- a/Modules/ImageStatisticsUI/Qmitk/QmitkImageStatisticsTreeItem.cpp +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkImageStatisticsTreeItem.cpp @@ -1,100 +1,119 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkImageStatisticsTreeItem.h" QmitkImageStatisticsTreeItem::QmitkImageStatisticsTreeItem( ImageStatisticsObject statisticsData, StatisticNameVector statisticNames, QVariant label, QmitkImageStatisticsTreeItem *parent) : m_statistics(statisticsData) , m_statisticNames(statisticNames), m_label(label), m_parentItem(parent) { } QmitkImageStatisticsTreeItem::QmitkImageStatisticsTreeItem(StatisticNameVector statisticNames, QVariant label, QmitkImageStatisticsTreeItem *parentItem) : QmitkImageStatisticsTreeItem(ImageStatisticsObject(), statisticNames, label, parentItem ) { } QmitkImageStatisticsTreeItem::QmitkImageStatisticsTreeItem() : QmitkImageStatisticsTreeItem(StatisticNameVector(), QVariant(), nullptr ) {} QmitkImageStatisticsTreeItem::~QmitkImageStatisticsTreeItem() { qDeleteAll(m_childItems); } void QmitkImageStatisticsTreeItem::appendChild(QmitkImageStatisticsTreeItem *item) { m_childItems.append(item); } QmitkImageStatisticsTreeItem *QmitkImageStatisticsTreeItem::child(int row) { return m_childItems.value(row); } int QmitkImageStatisticsTreeItem::childCount() const { return m_childItems.count(); } int QmitkImageStatisticsTreeItem::columnCount() const { return m_statisticNames.size() + 1; } +struct StatValueVisitor : boost::static_visitor +{ + QVariant operator()(const mitk::ImageStatisticsContainer::RealType& val) const + { + return QVariant(val); + } + + QVariant operator()(const mitk::ImageStatisticsContainer::VoxelCountType& val) const + { + return QVariant::fromValue(val); + } + + QVariant operator()(const mitk::ImageStatisticsContainer::IndexType& val) const + { + std::stringstream ss; + ss << val; + return QVariant(QString::fromStdString(ss.str())); + } + +}; + QVariant QmitkImageStatisticsTreeItem::data(int column) const { QVariant result; if (column > 0 && !m_statisticNames.empty()) { if (column - 1 < static_cast(m_statisticNames.size())) { auto statisticKey = m_statisticNames.at(column - 1); - std::stringstream ss; if (m_statistics.HasStatistic(statisticKey)) { - ss << m_statistics.GetValueNonConverted(statisticKey); + return boost::apply_visitor(StatValueVisitor(), m_statistics.GetValueNonConverted(statisticKey)); } else { return QVariant(); } - result = QVariant(QString::fromStdString(ss.str())); } else { return QVariant(); } } else if (column == 0) { result = m_label; } return result; } QmitkImageStatisticsTreeItem *QmitkImageStatisticsTreeItem::parentItem() { return m_parentItem; } int QmitkImageStatisticsTreeItem::row() const { if (m_parentItem) return m_parentItem->m_childItems.indexOf(const_cast(this)); return 0; } diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.cpp b/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.cpp index 6783735d7f..ab275fa514 100644 --- a/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.cpp +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.cpp @@ -1,106 +1,124 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "QmitkStatisticsModelToStringConverter.h" #include "mitkExceptionMacro.h" QmitkStatisticsModelToStringConverter::QmitkStatisticsModelToStringConverter() {} -void QmitkStatisticsModelToStringConverter::SetTableModel(QAbstractItemModel *model) +void QmitkStatisticsModelToStringConverter::SetTableModel(QmitkImageStatisticsTreeModel *model) { m_statisticsModel = model; } void QmitkStatisticsModelToStringConverter::SetRootIndex(QModelIndex rootIndex) { m_rootIndex = rootIndex; } QString QmitkStatisticsModelToStringConverter::GetString() const { if (m_statisticsModel == nullptr) { mitkThrow() << "Cannot convert TableModel to String: TableModel is nullptr"; } QString textData; int columns = m_statisticsModel->columnCount(); if (m_includeHeaderData) { for (int i = 0; i < columns; i++) { if (i > 0) { textData += m_columnDelimiter; } - textData += m_statisticsModel->headerData(i, Qt::Horizontal).toString(); + textData += m_statisticsModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); } textData += m_rowDelimiter; } textData += Iterate(m_rootIndex, m_statisticsModel); return textData; } void QmitkStatisticsModelToStringConverter::SetRowDelimiter(QChar rowDelimiter) { m_rowDelimiter = rowDelimiter; } void QmitkStatisticsModelToStringConverter::SetColumnDelimiter(QChar columnDelimiter) { m_columnDelimiter = columnDelimiter; } void QmitkStatisticsModelToStringConverter::SetIncludeHeaderData(bool includeHeaderData) { m_includeHeaderData = includeHeaderData; } QString QmitkStatisticsModelToStringConverter::Iterate(const QModelIndex &index, - const QAbstractItemModel *model, + const QmitkImageStatisticsTreeModel *model, int depth) const { QString content; + if (index.isValid()) { - content = index.data().toString(); - } - if (!model->hasChildren(index) || (index.flags() & Qt::ItemNeverHasChildren)) - { - return content; - } - else - { - content += m_rowDelimiter; + auto data = index.data(); + + if(data.type() == QMetaType::Float || data.type() == QMetaType::Double ) + { + content = QString("%L1").arg(data.toDouble(), 0, 'f'); + } + else + { + content = data.toString(); + } } auto rows = model->rowCount(index); - auto cols = model->columnCount(index); - for (int i = 0; i < rows; ++i) + for (int r = 0; r < rows; ++r) { - if (i > 0) + auto childIndex = model->index(r, 0, index); + if (model->hasChildren(childIndex)) { - content += m_rowDelimiter; + if (depth>1) + { + content += QString(" >> "); + } + content += Iterate(childIndex, model, ++depth); } - for (int j = 0; j < cols; ++j) + else { - if (j > 0) + auto cols = model->columnCount(index); + for (int c = 0; c < cols; ++c) { - content += m_columnDelimiter; + if (c > 0) + { + content += m_columnDelimiter; + } + else + { + content += QString(" >> "); + } + + auto childIndex = model->index(r, c, index); + content += Iterate(childIndex, model, ++depth); } - content += Iterate(model->index(i, j, index), model, depth + 1); + content += m_rowDelimiter; } } + return content; } diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.h b/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.h index 9fb66e10ad..091d7bdb6b 100644 --- a/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.h +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkStatisticsModelToStringConverter.h @@ -1,66 +1,63 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef QmitkTableModelToQString_H__INCLUDED #define QmitkTableModelToQString_H__INCLUDED #include -#include +#include /** \brief Converts the content of the statistics model to a string \details The content of a table model is converted to a string. Each cell is converted to a string. Default order: iteration over rows. The row separation delimiter (default: '\n') and the column separation delimiter (default: ',') can be chosen. It also can be chosen if the headers should be exported to the string. */ class MITKIMAGESTATISTICSUI_EXPORT QmitkStatisticsModelToStringConverter { public: QmitkStatisticsModelToStringConverter(); - void SetTableModel(QAbstractItemModel *model); + void SetTableModel(QmitkImageStatisticsTreeModel *model); void SetRootIndex(QModelIndex rootIndex); /** \brief Returns the string \exception throws exception if model is nullptr */ QString GetString() const; void SetRowDelimiter(QChar rowDelimiter); void SetColumnDelimiter(QChar columnDelimiter); /** \brief If header data (column/row captions) are exported */ void SetIncludeHeaderData(bool includeHeaderData); private: - /** -\brief Iterates recursively over all cells and returns their content -\details based on https://stackoverflow.com/questions/39153835/how-to-loop-over-qabstractitemview-indexes -*/ + QString Iterate(const QModelIndex &index, - const QAbstractItemModel *model, + const QmitkImageStatisticsTreeModel *model, int depth = 0) const; - QAbstractItemModel *m_statisticsModel = nullptr; + QmitkImageStatisticsTreeModel *m_statisticsModel = nullptr; QModelIndex m_rootIndex; QChar m_rowDelimiter = '\n'; QChar m_columnDelimiter = ','; bool m_includeHeaderData = false; }; #endif // QmitkTableModelToQString_H__INCLUDED