Skip to the content.
  1. Overview Testing of both CTK widgets and application built on top of CTK could leverage the capabilities offered by the QtTesting library developed by Paraview folks.

br / How added the testing framework to CTK :

  1. Adding the testing framework into your application Adding the testing framework will allow users to recover script, but also a easy way to create tutorial or to test all the widget.br / You can see the application exemple created in CTK to have an exemple:

    1. How Follow these steps to add this testing framework to your application.
  2. Create a variable ctkQtTestingUtiliy - can be added to your mainWindow class. #* And initialize this variable as following : pre this-TestUtility = new ctkQtTestingUtility(this); this-TestUtility-addEventObserver(“xml”, new ctkXMLEventObserver(this)); this-TestUtility-addEventSource(“xml”, new ctkXMLEventSource(this));/pre `` You can have your own EventObserver and EventSource
  3. Create a button Record, and link it to the ctkQtTestUtility slot record
  4. Create a button Play, and link it to the ctkQtTestingUtility slot play pre QObject::connect(Ui.RecordButton, SIGNAL(clicked(bool)), this, SLOT(record())); QObject::connect(Ui.PlayBackButton, SIGNAL(clicked(bool)), this, SLOT(play())); /pre

    1. Limits Note that there are still severals limits to this testing framework :
  5. The ctkVTKRenderView had to have the same size between the record and the playback. #* To solve the issue, ctkTestingUtility record all the application property - size, state, font … - and before a playback, if these property are differents, ask the user if he wants to load the settings.br /`` We are working on this limit to find a better solution.
  6. All the CTK Widgets are not yet tested - Below the summary table -

  7. Issues found on QtTesting * QSpinBox/QDoubleSpinBox : ** A long click on the up/down arrow - just one click even if the value change severals times. ** Fast click - Double click - no effect. ** clik on the up/down arrow just after editing the spin Box - no effect. Solve : Contribut to the QtTesting by modified the pqSpinBoxEventTranslator `` br/ Here the link to my Github for the QSpinBoxbr/ Here the link to my Github for the QDoublSpinBox

* In pq3DView : ** The scroll button has no effect - Implemented for ctk. ** Shift between the current/Expected image. Solve : new Implementation with the ctkVTKRenderViewEventTranslator and the ctkVTKRenderViewEventPlayer : ``

  1. Change the normalization into a normalization by the widget center.
  2. Implemented the scroll action
  3. Add a better rounded when we cast from double to int to not have shift issue.

* QComboBox when it is editable : ** The hight-event “set_sting” crash if we edit the comboBox. ** *Exemple : If we have an item “foo”, we are going to edit the comboBox with “f”, but the item “f” doesn’t exist, and the player will crash. Solve : … ``

  1. Building
    1. Milestones
  2. Integrate QtTesting has an external projects ``
  3. Add unit test to all the widget - Below, the summuray table -
  4. Implement ctkEventTranslaterPlayerWidget ``
  5. Create custom translator/player if needed ``
  6. Implement widgets EventTranslatorTests ``
  7. Create an Application test - ctkQtTesting - ``

    1. Player/Translators Widget Testing Summury table, to know each widgets’ state.br / The state can be Done : , *Done with QtTesting issue* :, *in progress* : , or without unit test: ``.
{ class=”wikitable alternance” style=”text-align:left; width:100%; border:1px solid black;”  
  - valign=top  
  style=”width:50%;”  
{ class=”wikitable alternance” style=”text-align:left; width:100%; border:1px solid black;”  
  + CTKWidgets  
! scope=col style=”background:#cde6f8;” Widgets  
! scope=col style=”background:#cde6f8;” State  
! scope=col style=”background:#cde6f8;” Priority  
! scope=col style=”background:#cde6f8;” Notes  
  ctkActionsWidget  
  ``  
     
     
  ctkAddRemoveComboBox  
  ``  
     
     
  ctkAxesWidget  
  ``  
     
  Translator/player implemented  
  ctkBasePopupWidget  
  NA  
     
  ctkPopupWidget inherit of it. See ctkPopupWidget  
  ctkButtonGroup  
  ``  
     
     
  ctkCheckableComboBox  
  ``  
     
     
  ctkCheckableHeaderView  
  ``  
     
     
  ctkCheckBoxPixmaps  
  ``  
     
  Not used in Slicer  
  ctkCheckablePushButton  
  ``  
     
  Not used in Slicer  
  ctkComboBox  
  ``  
     
     
  ctkCompleter  
  NA  
     
     
  ctkCollapsibleButton  
  ``  
     
     
  ctkCollapsibleGroupBox  
  ``  
     
     
  ctkColorDialog  
  ``  
     
     
  ctkColorPickerButton  
  ``  
     
     
  ctkConsole  
  ``  
     
  May have a problem with the command  
  ctkConfirmExitDialog  
  ``  
     
     
  ctkCoordinatesWidget  
  ``  
     
     
  ctkCrosshairLabel  
  ``  
     
     
  ctkDateRangeWidget  
  ``  
     
  Problem with QDateTimer  
  ctkDirectoryButton  
  `` - TO VERIFY  
     
  bgcolor=”f4db9e” Value OK but no dialog
  ctkDoubleRangeSlider  
  ``  
     
     
  ctkDoubleSlider  
  ``  
     
     
  ctkDynamicSpacer  
  NA  
     
     
  ctkErrorLogStatusMessageHandler  
  NA  
     
  Not a Widget  
  ctkErrorLogWidget  
  ``  
     
     
  ctkExpandButton  
  ``  
     
     
  ctkFileDialog  
  ``  
     
     
  ctkFittedTextBrowser  
  NA  
     
  This widget just display text.  
  ctkFlowLayout  
  NA  
     
  Layout are not tested through the event translator/player mechanism  
  ctkFontButton  
  ``  
     
     
  ctkIconEnginePlugin  
  NA  
     
  Plugin are not tested through the event translator/player mechanism  
  ctkLayoutManager  
  NA  
     
     
  ctkMaterialPropertyPreviewLabel  
  NA  
     
     
  ctkMaterialPropertyWidget  
  ``  
     
     
  ctkMatrixWidget  
  ``  
     
  * no visuel effects *  
  ctkMenuButton  
  ``  
     
  '’Use in Slicer ?  
  ctkMenuComboBox  
  ``  
     
  bgcolor=”#efabab” ’’ Developer should make sure menus have a parent. See https://bugreports.qt.nokia.com/browse/QTBUG-20929
  ctkModalityWidget  
  ``  
     
     
  ctkPathLineEdit  
  ``  
     
  bgcolor=”#efabab” * Note that the first time the listview is displayed, it will show on the top left corner of the screen.*
  ctkPixmapIconEngine  
  NA  
     
     
  ctkPopupWidget  
  ``  
     
     
  ctkQImageView  
  NA  
     
     
  ctkRangeSlider  
  ``  
     
     
  ctkRangeWidget  
  ``  
     
     
  ctkScreenshotDialog  
  ``  
     
     
  ctkSearchBox  
  ``  
     
     
  ctkSettings  
  NA  
     
     
  ctkSettingsDialog  
  ``  
     
     
  ctkSettingsPanel  
  ``  
     
  See ctkSettingsDialog  
  ctkSignalMapper  
  NA  
     
  This object is not a widget and doesn’t have to be tested through the event translator/player mechanism  
  ctkSimpleLayoutManager  
  NA  
     
     
  ctkSliderWidget  
  ``  
     
  Translator and player if popup  
  ctkTestApplication  
  NA  
     
  This is a utility class. Shouldn’t be tested using the event translator/player mechanism  
  ctkThumbnailListWidget  
  ``  
     
     
  ctkThumbnailWidget  
  ``  
     
     
  ctkToolTipTrapper  
  NA  
     
  This is a utility class. Shouldn’t be tested using the event translator/player mechanism  
  ctkTransferFunctionBarsItem  
  ``  
     
     
  ctkTransferFunctionControlPointsItem  
  ``  
     
     
  ctkTransferFunctionGradientItem  
  ``  
     
     
  ctkTransferFunctionItem  
  ``  
     
     
  ctkTransferFunctionScene  
  ``  
     
     
  ctkTransferFunctionView  
  ``  
     
     
  ctkTreeComboBox  
  ``  
     
  Note: This won’t work if there multiple items with a similar name. This is not an issue in Slicer since selection is based on string  
  ctkWidgetsUtils  
  NA  
     
  This is a utility class. Shouldn’t be tested using the event translator/player mechanism  
  ctkWorkflowAbstractPagedWidget  
  ``  
     
     
  ctkWorkflowButtonBoxWidget  
  ``  
     
     
  ctkWorkflowGroupBox  
  ``  
     
     
  ctkWorkflowStackedWidget  
  ``  
     
     
  ctkWorkflowTabWidget  
  ``  
     
     
  ctkWorkflowWidget  
  ``  
     
     
  ctkWorkflowWidgetStep  
  ``  
     
     
  }  
  style=”width:50%; “text-align: center; “  
{ class=”wikitable alternance” style=”text-align:left; width:100%; border:1px solid black;”  
  + CTKVisualizationVTKWidgets  
! scope=col style=”background:#cde6f8;” Widgets  
! scope=col style=”background:#cde6f8;” State  
! scope=col style=”background:#cde6f8;” Priority  
! scope=col style=”background:#cde6f8;” Notes  
  ctkVTKAbstractMatrixWidget  
  ``  
     
  See ctkVTKMatrixWidget  
  ctkVTKAbstractView  
  ``  
     
  See ctkVTKRenderView  
  ctkVTKChartView  
  ``  
     
     
  ctkVTKDataSetArrayComboBox  
  ``  
     
     
  ctkVTKDataSetModel  
  ``  
     
     
  ctkVTKMagnifyView  
  ``  
     
  Not used in Slicer  
  ctkVTKMatrixWidget  
  ``  
     
  See ctkVTKMatrixWidget - There is no need for specific translator player  
  ctkVTKRenderView  
  ``  
     
  bgcolor=”#f4db9e” '’Translator/Player implemented br / What we want :br / - Wheel event br / - Better normalization br / - Not working if the renderView has a different size
  ctkVTKScalarBarWidget  
  ````  
     
  bgcolor=”#f4db9e” QSpinBox issue + key “.”(pad) on the line edit
  ctkVTKScalarsToColorsUtils  
  ``  
     
     
  ctkVTKScalarsToColorsView  
  ``  
     
     
  ctkVTKScalarsToColorsWidget  
  ``  
     
     
  ctkVTKSliceView  
  ``  
     
  Since it’s based on QVTKWidget - See ctkVTKRenderView translator player  
  ctkVTKSurfaceMaterialPropertyWidget  
  ``  
     
     
  ctkVTKTextPropertyWidget  
  ``  
     
     
  ctkVTKThresholdWidget  
  ``  
     
     
  ctkVTKThumbnailView  
  ``  
     
     
  ctkVTKVolumePropertyWidget  
  ``  
     
     
  ctkVTKWidgetsUtils  
  NA  
     
     
  }  
{ class=”wikitable alternance” style=”text-align:left; width:100%; border:1px solid black;”  
  + CTKDICOMWidgets  
! scope=col style=”background:#cde6f8;” Widgets  
! scope=col style=”background:#cde6f8;” State  
! scope=col style=”background:#cde6f8;” Priority  
! scope=col style=”background:#cde6f8;” Notes  
  ctkDICOMAppWidget  
  ``  
     
     
  ctkDICOMDatasetView  
  ``  
     
     
  ctkDICOMDirectoryListWidget  
  ``  
     
     
  ctkDICOMImage  
  ``  
     
     
  ctkDICOMImportWidget  
  ``  
     
     
  ctkDICOMItemTreeModel  
  ``  
     
     
  ctkDICOMListenerWidget  
  ``  
     
     
  ctkDICOMQueryResultsTabWidget  
  ``  
     
     
  ctkDICOMQueryRetrieveWidget  
  ``  
     
     
  ctkDICOMQueryWidget  
  ``  
     
     
  ctkDICOMServerNodeWidget  
  ``  
     
     
  ctkDICOMThumbnailGenerator  
  ``  
     
     
  ctkDICOMThumbnailListWidget  
  ``  
     
     
  }  
{ class=”wikitable alternance” style=”text-align:left; width:100%; border:1px solid black;”  
  + qMRMLWidgets  
! scope=col style=”background:#cde6f8;” Widgets  
! scope=col style=”background:#cde6f8;” State  
! scope=col style=”background:#cde6f8;” Priority  
! scope=col style=”background:#cde6f8;” Notes  
  qMRMLCaptureToolBar  
  ``  
     
     
  qMRMLCheckableNodeComboBox  
  ``  
     
     
  qMRMLClipNodeWidget  
  ``  
     
     
  qMRMLCollapsibleButton  
  ``  
     
     
  qMRMLColorListView  
  ``  
     
     
  qMRMLColorPickerWidget  
  ``  
     
     
  qMRMLColorTableComboBox  
  ``  
     
     
  qMRMLColorTableView  
  ``  
     
     
  qMRMLDisplayNodeWidget  
  ``  
     
     
  qMRMLEventBrokerWidget  
  ``  
     
     
  qMRMLLabelComboBox  
  ``  
     
     
  qMRMLLayoutWidget  
  ``  
     
     
  qMRMLLinearTransformSlider  
  ``  
     
     
  qMRMLListWidget  
  ``  
     
     
  qMRMLMatrixWidget  
  ``  
     
     
  qMRMLNavigationView  
  ``  
     
     
  qMRMLNodeComboBox  
  ``  
     
     
  qMRMLRangeWidget  
  ``  
     
     
  qMRMLROIWidget  
  ``  
     
     
  qMRMLScalarInvariantComboBox  
  ``  
     
     
  qMRMLSceneFactoryWidget  
  ``  
     
     
  qMRMLSceneViewMenu  
  ``  
     
     
  qMRMLScreenShotDialog  
  ``  
     
     
  qMRMLSliceControllerWidget  
  ``  
     
     
  qMRMLSliceWidget  
  ``  
     
     
  qMRMLThreeDViewControllerWidget  
  ``  
     
     
  qMRMLThreeDView  
  ``  
     
     
  qMRMLThreeDWidget  
  ``  
     
     
  qMRMLTransformSliders  
  NA  
     
     
  qMRMLTreeView  
  ``  
     
     
  qMRMLVolumeInfoWidget  
  ``  
     
     
  qMRMLVolumeThresholdWidget  
  ``  
     
     
  qMRMLWindowLevelWidget  
  ``  
     
     
  }  
  }  
  1. Screenshots gallery widths=300 px heights=200px perrow=3 Image:CtkQtTestingScreenShot.png|Simple application with recording / playing Qt testing capabilities Image:CtkEventTranslatorPlayerWidget.png|Little exemple of the widget testing /gallery