summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJannis Voelker <jannis.voelker@basyskom.com>2018-05-04 11:28:10 +0200
committerRainer Keller <Rainer.Keller@qt.io>2018-05-09 06:35:14 +0000
commit724dac7d3c0327f39cf6b96d40d5684be3d5f58c (patch)
tree856be8f7cac726f804a5f1f8aed7ae76015638d2
parent69676c44db819261005256f7b1b97ef7df3bbac4 (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.cpp1
-rw-r--r--examples/opcua/opcuaviewer/treeitem.cpp93
-rw-r--r--examples/opcua/opcuaviewer/treeitem.h6
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;