Explorar el Código

Control the number of decimals in the ctkMatrixWidget display

Display the matrix values with the same number of decimals used to edit the
items.
Julien Finet hace 11 años
padre
commit
f29aea9c6f

+ 3 - 0
Libs/Widgets/Testing/Cpp/CMakeLists.txt

@@ -45,6 +45,7 @@ set(TEST_SOURCES
   ctkMaterialPropertyPreviewLabelTest1.cpp
   ctkMaterialPropertyWidgetTest1.cpp
   ctkMaterialPropertyWidgetTest2.cpp
+  ctkMatrixWidgetTest.cpp
   ctkMatrixWidgetTest1.cpp
   ctkMatrixWidgetTest2.cpp
   ctkMenuButtonTest1.cpp
@@ -184,6 +185,7 @@ QT4_GENERATE_MOCS(
   ctkFlatProxyModelTest.cpp
   ctkFontButtonTest.cpp
   ctkLanguageComboBoxTest.cpp
+  ctkMatrixWidgetTest.cpp
   ctkMessageBoxDontShowAgainTest.cpp
   ctkPathListWidgetTest.cpp
   ctkPathListWidgetWithButtonsTest.cpp
@@ -253,6 +255,7 @@ SIMPLE_TEST( ctkLayoutManagerTest1 )
 SIMPLE_TEST( ctkMaterialPropertyPreviewLabelTest1 )
 SIMPLE_TEST( ctkMaterialPropertyWidgetTest1 )
 SIMPLE_TEST( ctkMaterialPropertyWidgetTest2 )
+SIMPLE_TEST( ctkMatrixWidgetTest )
 SIMPLE_TEST( ctkMatrixWidgetTest1 )
 SIMPLE_TEST( ctkMatrixWidgetTest2 )
 SIMPLE_TEST( ctkMenuButtonTest1 )

+ 72 - 0
Libs/Widgets/Testing/Cpp/ctkMatrixWidgetTest.cpp

@@ -0,0 +1,72 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0.txt
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+// Qt includes
+#include <QApplication>
+#include <QString>
+#include <QTimer>
+
+// CTK includes
+#include "ctkMatrixWidget.h"
+#include "ctkTest.h"
+
+// ----------------------------------------------------------------------------
+class ctkMatrixWidgetTester: public QObject
+{
+  Q_OBJECT
+private slots:
+  void testUI();
+
+  void testDecimals();
+};
+
+// ----------------------------------------------------------------------------
+void ctkMatrixWidgetTester::testUI()
+{
+  ctkMatrixWidget matrix;
+  matrix.setMinimum(-100.);
+  matrix.setMaximum(100.);
+
+  matrix.show();
+  QTest::qWaitForWindowShown(&matrix);
+  //qApp->exec();
+}
+
+// ----------------------------------------------------------------------------
+void ctkMatrixWidgetTester::testDecimals()
+{
+  ctkMatrixWidget matrix;
+  matrix.setDecimalsOption(
+    ctkDoubleSpinBox::DecimalsByKey | ctkDoubleSpinBox::DecimalsByShortcuts );
+  matrix.setDecimals(10);
+  matrix.setValue(0, 0, 1.000000001);
+
+  matrix.show();
+  QTest::qWaitForWindowShown(&matrix);
+  //qApp->exec();
+
+  QCOMPARE(matrix.value(0, 0), 1.000000001);
+}
+
+// ----------------------------------------------------------------------------
+CTK_TEST_MAIN(ctkMatrixWidgetTest)
+#include "moc_ctkMatrixWidgetTest.cpp"
+
+

+ 25 - 0
Libs/Widgets/ctkMatrixWidget.cpp

@@ -62,6 +62,30 @@ namespace
         matrixWidget, SLOT(setDecimals(int)));
     }
   };
+
+//-----------------------------------------------------------------------------
+// Reimplemented to display the numbers with the matrix decimals.
+class ctkMatrixItemDelegate : public QStyledItemDelegate
+{
+public:
+  ctkMatrixItemDelegate(ctkMatrixWidget* matrixWidget)
+    : QStyledItemDelegate(matrixWidget)
+  {
+  }
+  virtual QString	displayText ( const QVariant & value, const QLocale & locale ) const
+  {
+    ctkMatrixWidget* matrix = qobject_cast<ctkMatrixWidget*>(this->parent());
+    Q_ASSERT(matrix);
+    switch(value.type())
+      {
+      case QVariant::Double:
+        return locale.toString(value.toDouble(), 'f', matrix->decimals());
+      default:
+        return this->QStyledItemDelegate::displayText(value, locale);
+      }
+  }
+};
+
 }
 
 //-----------------------------------------------------------------------------
@@ -99,6 +123,7 @@ ctkMatrixWidgetPrivate::ctkMatrixWidgetPrivate(ctkMatrixWidget& object, int rows
 void ctkMatrixWidgetPrivate::init()
 {
   Q_Q(ctkMatrixWidget);
+  this->Table->setItemDelegate(new ctkMatrixItemDelegate(q));
 
   this->Table->setParent(q);
   QHBoxLayout* layout = new QHBoxLayout(q);