diff options
author | Jannis Voelker <jannis.voelker@basyskom.com> | 2018-05-04 11:28:10 +0200 |
---|---|---|
committer | Rainer Keller <Rainer.Keller@qt.io> | 2018-05-09 06:35:14 +0000 |
commit | 724dac7d3c0327f39cf6b96d40d5684be3d5f58c (patch) | |
tree | 856be8f7cac726f804a5f1f8aed7ae76015638d2 | |
parent | 69676c44db819261005256f7b1b97ef7df3bbac4 (diff) |
Improve value display in opcuaviewer
This patch adds string conversion for all Qt OPC UA types.
Alternate row colors are enabled to improve the readability
of array values.
Change-Id: I6131c90ada787851d279f48b035af69bb6ce4aed
Reviewed-by: Rainer Keller <Rainer.Keller@qt.io>
-rw-r--r-- | examples/opcua/opcuaviewer/mainwindow.cpp | 1 | ||||
-rw-r--r-- | examples/opcua/opcuaviewer/treeitem.cpp | 93 | ||||
-rw-r--r-- | examples/opcua/opcuaviewer/treeitem.h | 6 |
3 files changed, 94 insertions, 6 deletions
diff --git a/examples/opcua/opcuaviewer/mainwindow.cpp b/examples/opcua/opcuaviewer/mainwindow.cpp index 7f87083..f9759b1 100644 --- a/examples/opcua/opcuaviewer/mainwindow.cpp +++ b/examples/opcua/opcuaviewer/mainwindow.cpp @@ -147,6 +147,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) mTreeView->setModel(mOpcUaModel); mTreeView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); mTreeView->setTextElideMode(Qt::ElideRight); + mTreeView->setAlternatingRowColors(true); if (mOpcUaPlugin->count() == 0) { mOpcUaPlugin->setDisabled(true); diff --git a/examples/opcua/opcuaviewer/treeitem.cpp b/examples/opcua/opcuaviewer/treeitem.cpp index 934503b..6ce1628 100644 --- a/examples/opcua/opcuaviewer/treeitem.cpp +++ b/examples/opcua/opcuaviewer/treeitem.cpp @@ -129,12 +129,7 @@ QVariant TreeItem::data(int column) const auto type = mOpcNode->attribute(QOpcUa::NodeAttribute::DataType).toString(); const auto value = mOpcNode->attribute(QOpcUa::NodeAttribute::Value); - if (value.type() == QVariant::Type::List) - return value.toStringList().join("\n"); - else if (type == "ns=0;i=3") - return QLatin1String("0x") + QString::number(value.toUInt(), 16); - else - return mOpcNode->attribute(QOpcUa::NodeAttribute::Value); + return variantToString(value, type); } else if (column == 2) { QMetaEnum metaEnum = QMetaEnum::fromType<QOpcUa::NodeClass>(); QString name = metaEnum.valueToKey((uint)mNodeClass); @@ -253,4 +248,90 @@ void TreeItem::browseFinished(QVector<QOpcUaReferenceDescription> children, QOpc emit mModel->dataChanged(mModel->createIndex(row(), 0, this), mModel->createIndex(row(), numberOfDisplayColumns - 1, this)); } +QString TreeItem::variantToString(const QVariant &value, const QString &typeNodeId) const +{ + if (value.type() == QVariant::List) { + const auto list = value.toList(); + QStringList concat; + + for (auto it : list) + concat.append(variantToString(it, typeNodeId)); + + return concat.join("\n"); + } + + if (typeNodeId == QLatin1String("ns=0;i=2")) // Char + return QString::number(value.toInt()); + else if (typeNodeId == QLatin1String("ns=0;i=3")) // SChar + return QString::number(value.toUInt()); + else if (typeNodeId == QLatin1String("ns=0;i=4")) // Int16 + return QString::number(value.toInt()); + else if (typeNodeId == QLatin1String("ns=0;i=5")) // UInt16 + return QString::number(value.toUInt()); + else if (value.type() == QVariant::ByteArray) + return QLatin1String("0x") + value.toByteArray().toHex(); + else if (value.type() == QVariant::DateTime) + return value.toDateTime().toString(Qt::ISODate); + + else if (value.canConvert<QOpcUa::QQualifiedName>()) { + const auto name = value.value<QOpcUa::QQualifiedName>(); + return QStringLiteral("%1, \"%2\"").arg(name.namespaceIndex).arg(name.name); + } else if (value.canConvert<QOpcUa::QLocalizedText>()) { + const auto text = value.value<QOpcUa::QLocalizedText>(); + return localizedTextToString(text); + } else if (value.canConvert<QOpcUa::QRange>()) { + const auto range = value.value<QOpcUa::QRange>(); + return rangeToString(range); + } else if (value.canConvert<QOpcUa::QComplexNumber>()) { + const auto complex = value.value<QOpcUa::QComplexNumber>(); + return QStringLiteral("%1 %2 %3i").arg(complex.real).arg(complex.imaginary >= 0 ? "+" : "-").arg(complex.imaginary); + } else if (value.canConvert<QOpcUa::QDoubleComplexNumber>()) { + const auto complex = value.value<QOpcUa::QDoubleComplexNumber>(); + return QStringLiteral("%1 %2 %3i").arg(complex.real).arg(complex.imaginary >= 0 ? "+" : "-").arg(complex.imaginary); + } else if (value.canConvert<QOpcUa::QXValue>()) { + const auto xv = value.value<QOpcUa::QXValue>(); + return QStringLiteral("x: %1, y: %2").arg(xv.x).arg(xv.value); + } else if (value.canConvert<QOpcUa::QEUInformation>()) { + const auto info = value.value<QOpcUa::QEUInformation>(); + return euInformationToString(info); + } else if (value.canConvert<QOpcUa::QAxisInformation>()) { + const auto info = value.value<QOpcUa::QAxisInformation>(); + + return QStringLiteral("EngineeringUnits: %1, EURange: %2, Title: %3 , AxisScaleType: %4, AxisSteps: %5").arg( + euInformationToString(info.engineeringUnits)).arg(rangeToString(info.eURange)).arg(localizedTextToString(info.title)).arg( + info.axisScaleType == QOpcUa::AxisScale::Linear ? "Linear" : (info.axisScaleType == QOpcUa::AxisScale::Ln) ? "Ln" : "Log").arg( + axisStepsToString(info.axisSteps)); + } + + if (value.canConvert<QString>()) + return value.toString(); + + return QString(); +} + +QString TreeItem::localizedTextToString(const QOpcUa::QLocalizedText &text) const +{ + return QStringLiteral("\"%1\", \"%2\"").arg(text.locale).arg(text.text); +} + +QString TreeItem::rangeToString(const QOpcUa::QRange &range) const +{ + return QStringLiteral("[%1, %2]").arg(range.low).arg(range.high); +} + +QString TreeItem::euInformationToString(const QOpcUa::QEUInformation &info) const +{ + return QStringLiteral("UnitId: %1; NamespaceUri: \"%2\"; DisplayName: %3; Description: %4").arg(info.unitId).arg( + info.namespaceUri).arg(localizedTextToString(info.displayName)).arg(localizedTextToString(info.description)); +} + +QString TreeItem::axisStepsToString(const QVector<double> &vec) const +{ + QStringList list; + for (auto it : vec) + list.append(QString::number(it)); + + return list.join(", "); +} + QT_END_NAMESPACE diff --git a/examples/opcua/opcuaviewer/treeitem.h b/examples/opcua/opcuaviewer/treeitem.h index ea7f99b..7f97cf5 100644 --- a/examples/opcua/opcuaviewer/treeitem.h +++ b/examples/opcua/opcuaviewer/treeitem.h @@ -87,6 +87,12 @@ protected: OpcUaModel *mModel = nullptr; private: + QString variantToString(const QVariant &value, const QString &typeNodeId = QString()) const; + QString localizedTextToString(const QOpcUa::QLocalizedText &text) const; + QString rangeToString(const QOpcUa::QRange &range) const; + QString euInformationToString(const QOpcUa::QEUInformation &info) const; + QString axisStepsToString(const QVector<double> &vec) const; + bool mAttributesReady = false; bool mBrowseStarted = false; QList<TreeItem *> mChildItems; |