RiverWare Qt4 Port Status -- January 2010

Status: Initial writing in progress.
Edit: 1-7-2010 (b), Phil Weinstein, CADSWES

(0) Overview
(1) Major High Level Tasks in the Qt4 Port
(1.1) Converting all "Qt Designer" built UI files from Qt3 to Qt4.
(1.2) Replacing all uses of Qt3 classes (widgets, etc) with Qt4 classes.
(1.3) Removing all uses of Qt3-compatibility methods in Qt4 classes.
(2) RiverWare Qt3 and Qt4 Designer Files
(3) RiverWare uses of Q3Table
(4) RiverWare uses of Q3ListView

(0) Overview

The last few RiverWare releases (5.0, 5.1 and 5.2) have been built with Qt version 4 (4.3 or 4.4) with use of the "Qt3 Compatibility Library". Graphical user interface (GUI) modules in RiverWare are now implemented using a mix of Qt4 widgets and Qt3 widgets (adapted for use with Qt4). To complete the Qt4 port, we need to recode all uses of Qt3 widgets to use instead Qt4 widgets. Benefits of completing the Qt4 port include improved user interface capabilities, performance, and ease of maintenance. Also, it will be important for all Qt3 to be removed from RiverWare before we can move to Qt 5 further down the road. (Plans for Qt 5 have not been announced. Qt is currently at version 4.6).

The major high-level tasks in the Qt4 port completion are:

  1. Converting all "Qt Designer" built UI files from Qt3 to Qt4.
  2. Replacing all uses of Qt3 classes (widgets, etc.) with Qt4 classes.
  3. Removing all uses of Qt3-compatibility methods in Qt4 classes.

Qt 5? ... There doesn't seem to be any statement on the Trolltech / Nokia websites about Qt 5. Here is an informal comment about Qt 5 made by Qt Labs staff 2.5 years ago:

From the Qt Labs Blog:
Reply from Andreas on June 06, 2007

We have no plans to release Qt 5; it's not even on the roadmap. What is on the plan is 4.4 and 4.5, so you can rely on Qt 4 as a stable, yet innovative Qt platform, as we do both minor and patch releases quite often. I personally hope we'll do 4.4, 4.5, 4.6, 4.7, and more. If we ever do release Qt 5, it will be nowhere close to as big a change as what Qt 4 was compared to Qt 3. Now, we don't actually need a Qt 5 release any time soon. There's so much fantastic stuff we and you can do using Qt 4. I firmly believe we'll release plenty of minor versions of Qt 4 before we venture into the Qt 5 area. In fact, all the Widgets On The Canvas work we've done so far is done using unmodified Qt 4.3.

(1) Major High Level Tasks in the Qt4 Port

(1.1) Converting all "Qt Designer" built UI files from Qt3 to Qt4.

Qt Designer is a GUI building program supporting the definition and lay out of widgets for Qt dialogs and other GUI components. Designer maintains widget layout definitions in "UI" (.ui) files. Qt3 and Qt4 UI files have incompatible formats, and Qt4 Designer cannot directly read Qt3 Designer UI files. However, Qt4 provides a "uic3" (UI compiler) tool which has these two cababilities:

  1. "uic3" can be used as part of the automated "make" process to generate C++ code from Qt3 UI files (using the Qt3 Compatibility Library). This is currently done in the RiverWare "make".
  2. "uic3" can be used to convert Qt3 UI files to Qt4 UI files.

The latter capability of "uic3" will be used to convert RiverWare's Qt3 UI files to Qt4 UI files. The process is not entirely automatic. Hand recoding is required for all custom Qt signal handlers (Qt "slots") defined within the Qt3 UI file. Qt4 Designer doesn't support custom Qt slots. Those Qt slots -- and the signal connections made to them -- need to be written in our C++ code. Also, icons defined in Qt3 UI files need to be handled differently.

A reasonable initial step in the Qt3 to Qt4 UI file porting process is the removal of all Qt slots (signal handlers) and signal/slot "connections" from the Qt3 UI files, and recoding them in the each module's C++ code. Careful testing will be necessary for this step because "missing connections" will result in the absense of a feature rather than an observable bug. (Solaris is a preferable platform for this particular work because run-time Qt signal/slot connection errors are reported to the system console -- and we don't see those on Windows).

Note that both uses of Qt4 "uic3" generate both Qt3 and Qt4 widgets. Additional porting described in the next section will be required for most Qt3 to Qt4 translated UI files. That work can make use of Qt4 Designer to replace the remaining Qt3 widgets with Qt4 widgets. (And of course, supporting C++ code will also need to be changed to use the new Qt4 widgets).

Read more in this Trolltech document:

Section (2.0) lists all of the Qt3 and Qt4 UI files in RiverWare 5.2.

(1.2) Replacing all uses of Qt3 classes (widgets, etc) with Qt4 classes.

All uses of the Qt3 Compatibility Library in Qt 4 need to be removed. This applies to both converted UI files and to our own C++ code. In UI files, this can be done mostly in Qt4 Designer -- though it is sometimes convenient to (carefully) directly edit the UI files (which are XML). Conveniently, the names of all Qt3 classes (in the Qt3 Compatibility Library) start with "Q3", e.g. Q3PopupMenu or Q3ListView.

Major tasks include:

Progress on the subsequent step will be made easier when all Qt3 compatibilty classes (whose names start with "Q3") have been removed from all C++ header files. But the goal, of course, is to remove references to those classes in all RiverWare code.

(1.3) Removing all uses of Qt3-compatibility methods in Qt4 classes.

Many of the Qt4 classes include also "Qt3 support members" (generally, C++ methods). (See, for example, the Qt4 QMenu class). Many of these members are overridden methods, e.g. constructors with many initialization parameters -- those have generally been removed from Qt4. Once the prior step of removing all Qt3 classes form RiverWare header files, it will be useful to enable or disable availability of the Qt3 Compatibility Library for individual source files -- instead of having that library enabled for the entire build. [This is controlled with the QT3_SUPPORT symbol].

(2) RiverWare Qt3 and Qt4 Designer Files

Note [1-6-2009]: Not all of these are used in the RiverWare build. Some of these modules were ported to Qt4 (w/ Qt3 compatibility support) by dropping the UI file. Those UI files are currently indicated with a strikeout. (So far, just three have been found -- but there are probably others).

RiverWare Qt3 Designer UI Files
Count: 91
RiverWare Qt4 Designer UI Files
Count: 27
3.3   DbDmi/DatasetMgrDlgBase.ui
3.3   DbDmi/DbDmiDlgBase.ui
3.3   DbDmi/DbDmiEditDlgBase.ui
3.3   DbDmi/DbDmiImpExpDlgBase.ui
3.3   DbDmi/DssDatasetDlgBase.ui
3.3   DbDmi/HdbDatasetDlgBase.ui
3.3   DbDmi/HdbMetaDataDlgBase.ui
3.3   DbDmi/HdbModelRunIdDlgBase.ui
3.3   DbDmi/HdbModelRunIdEditDlgBase.ui
3.3   DbDmi/LoginDlgBase.ui
3.3   DbDmi/NameMapDlgBase.ui
3.3   DbDmi/NameMapMgrDlgBase.ui
4.0   DbDmi/DbDmiImpExpConfirm.ui
4.0   DbDmi/DmiInvocationMgr.ui
4.0   DbDmi/ExcelDatasetDlg.ui
3.3   Q3GUI/AccountGroupDlgBase.ui
3.3   Q3GUI/AdjustSlotValsDlgBase.ui
3.0   Q3GUI/AnnualDayIntervalEditBase.ui
3.3   Q3GUI/AxisDlgBase.ui
3.3   Q3GUI/CanvasConfigDlgBase.ui
3.3   Q3GUI/ConfigSlotsDlgBase.ui
3.3   Q3GUI/CurveDlgBase.ui
3.3   Q3GUI/DiagImpExpDlgBase.ui
3.3   Q3GUI/DiagMgrDlgBase.ui
3.3   Q3GUI/DisplayGroupDlgBase.ui
3.3   Q3GUI/FileInfoDlgBase.ui
3.0   Q3GUI/FloatValueEditorBase.ui
3.3   Q3GUI/GridDlgBase.ui
3.3   Q3GUI/LinkEditorDlgBase.ui
3.3   Q3GUI/LinkGroupDlgBase.ui
3.3   Q3GUI/ListSlotDlgBase.ui
3.3   Q3GUI/LoadFileConfirmDlgBase.ui
3.3   Q3GUI/LocatorDlgBase.ui
3.3   Q3GUI/MarkerDlgBase.ui
3.0   Q3GUI/MarkerMgrDlgBase.ui
3.3   Q3GUI/ObjectGroupDlgBase.ui
3.3   Q3GUI/OpenObjectDlgBase.ui
3.3   Q3GUI/OutputManagerBase.ui
3.3   Q3GUI/PeriodTimeSelectorBase.ui
3.1   Q3GUI/PeriodicSlotCfgBase.ui
3.3   Q3GUI/PlotDlgSettingsBase.ui
3.1   Q3GUI/PlotMembershipDlgBase.ui
3.0   Q3GUI/PlotOpenDlgBase.ui
3.0   Q3GUI/PlotSaveAsDlgBase.ui
3.0   Q3GUI/PlotTitleDlgBase.ui
3.0   Q3GUI/PropagateDlgBase.ui
3.3   Q3GUI/ScenarioMgrDlgBase.ui
3.3   Q3GUI/ScenarioTabForm.ui
3.3   Q3GUI/SlotListDlgBase.ui
3.1   Q3GUI/SpecifyDimsDlgBase.ui
3.3   Q3GUI/StatSlotFilterDlgBase.ui
3.3   Q3GUI/StatTableSlotDlgBase.ui
3.3   Q3GUI/SupplyGroupDlgBase.ui
3.3   Q3GUI/TablePlotColsDlgBase.ui
3.3   Q3GUI/WorkspaceBase.ui
4.0   Q3GUI/AddSlotNotesWidgets.ui
4.0   Q3GUI/FileTypeAssocMgrDlgWidgets.ui
4.0   Q3GUI/GreenBookConfigPanelWidgets.ui
4.0   Q3GUI/NoteGroupMgrDlgWidgets.ui
4.0   Q3GUI/OutputConfigWidgets.ui
4.0   Q3GUI/RplParamDlgWidgets.ui
3.3   QtAccounting/AccountingSystemConfigBase.ui
3.1   QtAccounting/AutoPassThroughAcctDlgBase.ui
3.3   QtAccounting/ExchangeCfgDlgBase.ui
3.3   QtAccounting/ExchangeMgrDlgBase.ui
3.3   QtAccounting/QtAcctMgrDlgBase.ui
3.3   QtAccounting/QtSplyMgrDlgBase.ui
3.3   QtAccounting/SupplyEditorBase.ui
4.0   QtAccounting/DataObjExchBuilderWidgets.ui
3.3   QtDmi/DmiEditorDlgBase.ui
3.3   QtDmi/DmiHandlerDlgBase.ui
3.3   QtDmi/DmiMgrDlgBase.ui
3.3   QtDmi/DmiParamDlgBase.ui
3.1   QtDmi/ListCellDlgBase.ui
3.1   QtDmi/MinMaxCellDlgBase.ui
3.1   QtDmi/RadioBtnDlgBase.ui
 
3.3   QtRpl/RplAnalysisDlgBase.ui
3.3   QtRpl/RplArgEditDlgBase.ui
3.3   QtRpl/RplImportDlgBase.ui
3.3   QtRpl/RplLayoutDlgBase.ui
3.3   QtRpl/RplPaletteDlgBase.ui
3.3   QtRpl/RplPrintDlgBase.ui
3.3   QtRpl/RplSearchDlgBase.ui
3.3   QtRpl/RplSearchReplaceDlgBase.ui
4.0   QtRpl/RplBlockDlgWidgets.ui
4.0   QtRpl/RplDebuggerDlgWidgets.ui
4.0   QtRpl/RplDocConfigDlgWidgets.ui
4.0   QtRpl/RplDocConfigPanelWidgets.ui
4.0   QtRpl/RplFunctionDlgWidgets.ui
4.0   QtRpl/RplGroupDlgWidgets.ui
4.0   QtRpl/RplSetDlgWidgets.ui
3.3   QtRun/MultiRunControlDlgBase.ui
3.3   QtRun/MultiRunEditDlgBase.ui
3.3   QtRun/OptParamDlgBase.ui
3.3   QtRun/OptParamSubDlgBase.ui
3.3   QtRun/ResumeRunDlgBase.ui
3.3   QtRun/RunControlDlgBase.ui
3.3   QtRun/RunStatusDlgBase.ui
3.3   QtRun/RunSyncDlgBase.ui
3.3   QtRun/SimParamDlgBase.ui
3.3   QtRun/movebuttonpanel.ui
 
3.1   QtSCT/SctColorDlgBase.ui
3.3   QtSCT/SctConfigDlgBase.ui
3.3   QtSCT/SctFindSlotDialogBase.ui
3.1   QtSCT/SctLabelFnDlgBase.ui
3.1   QtSCT/SctTimestepAggCfgDlgBase.ui
4.0   QtSCT/SctClipboardExportDlgWidgets.ui
3.3   QtUtils/MessageListBoxBase.ui
3.3   QtUtils/SyncHeaderTestBase.ui
4.0   QtUtils/BgImageConfigPanelWidgets.ui
4.0   QtUtils/ClipboardImportDlgWidgets.ui
4.0   QtUtils/CloseAllDialogsWidgets.ui
4.0   QtUtils/DescriptDisplayWidgets.ui
4.0   QtUtils/FindSlotsWithInputsWidgets.ui
4.0   QtUtils/GeoRefCoordEditorWidgets.ui
4.0   QtUtils/ModelPeriodInfoPanelWidgets.ui
4.0   QtUtils/ReportGenDlgWidgets.ui (mockup)
4.0   QtUtils/SlotIdPanelWidgets.ui

(3) RiverWare uses of Q3Table

There are far fewer Q3Tables in RiverWare than Q3ListViews (see next section). See the tables below.

The Q3Tables for the Open Slot Dialogs (for Series and Table Slots) and for the SCT have a common base class (SlotDataQTable), and are quite complicated. These should be ported to the model-based QTableView (not QTableWidget) with a QAbstractTableModel subclass (to support an item-less implementation) and QItemDelegate (to support custom cell drawing). See our implmentation for the Run Analysis Dialog "grid" table classes: RunAnalGridQTableView, RunAnalGridQItemDelegate, and RunAnalGridQTableModel.

Q3Table Subclasses:

Q3GUI:
  StatTableSlotDlg.hpp : StatTableSlotDlg::SlotTable : Q3Table  (with items)
  SlotDataQTable.hpp : SlotDataQTable : Q3Table  (itemless)
  SlotQDlgTable.hpp : SlotQDlgTable : SlotDataQTable
  SctQTable.hpp : SctQTable : SlotDataQTable

Q3Table Direct Instances:

Q3GUI:
  RowColLabelEditor.hpp: Q3Table*  _labelTable;

(4) RiverWare uses of Q3ListView

See the two tables in this section: (1) Q3ListView Subclasses, and (2) Q3ListView Direct Instances. Generally, each of the subclasses have only one or two clients, with one or two instances each, so both of these types of items (subclasses and direct instances) have about the same level of complexity in porting. Those that implement flat lists (not multiple-level treeviews), and which have a relatively small number of items (e.g. not rows for series timesteps) can be replaced with either of these two widgets:

  1. Our new general Qt4 list widget: RwQListView (a Qt4 QTreeWidget) -- used by either subclassing or instantiating.
  2. For Slots, our new SlotListPanel, containing an RwQListView instance.

Also, our general Qt4 widget utilities module may be useful: RwQt4Utils.

Q3ListView Subclasses:

Q3GUI:
  AcctOrderListView.hpp : AcctOrderListView : Q3ListView
  DiagOutputListView.hpp : DiagOutputListView : Q3ListView
  DisplayGroupListView.hpp : DisplayGroupListView : Q3ListView
  DragDropSimListView.hpp : DragDropSimListView : Q3ListView
  GusListView.hpp : GusListView : Q3ListView
  SlotQListView.hpp : SlotQListView : Q3ListView
  SnapMgrObjListView.hpp : SnapMgrObjListView : Q3ListView
  SnapMgrSlotListView.hpp : SnapMgrSlotListView : Q3ListView
  SubbasinMgrListView.hpp : SubbasinMgrListView : Q3ListView
  TimeStepSelListView.hpp : TimeStepSelListView : Q3ListView
  WorkspaceListView.hpp : WorkspaceListView : Q3ListView
QtAccounting:
  AcctSubordListView.hpp : AcctSubordListView : Q3ListView
  ExchBalanceKeyListView.hpp : ExchBalanceKeyListView : Q3ListView
  UnitsListView.hpp : UnitsListView : Q3ListView
QtRpl:
  RplListView.hpp : RplListView : Q3ListView
QtRun:
  DispatchInfoListView.hpp : DispatchInfoListView : Q3ListView
  DmiListView.hpp : DmiListView : Q3ListView
  QtMultiRunEditDlg.hpp : QtMultiRunEditDlg::IterListView : Q3ListView
  RulesEffectsListView.hpp : RulesEffectsListView : Q3ListView
QtUtils:
  GenListView.hpp : GenListView : Q3ListView

Q3ListView Direct Instances:

DbDmi:
  DbDmiMgr.hpp: Q3ListView* _listview;
  DatasetMgrDlgBase.ui: Q3ListView* _datasetListView;
  DbDmiImpExpDlgBase.ui: Q3ListView* _objListview;
  HdbMetaDataDlgBase.ui: Q3ListView* _metaDataListView;
  HdbModelRunIdDlgBase.ui: Q3ListView* _mridListView;
  NameMapMgrDlgBase.ui: Q3ListView* _nameMapListView;
Q3GUI:
  AnnoGroupEditor.hpp: Q3ListView* _annoItemListView;
  AnnoGroupEditor.hpp: Q3ListView* _slotListView;
  AnnoGroupMgrDlg.hpp: Q3ListView* _groupListView;
  DiagCfgDlg.Panel.hpp: Q3ListView* _catListView;
  OpenObjectDlg.hpp: Q3ListView* _methodsListView;
  OpenObjectDlg.hpp: Q3ListView* _accountsListView;
  RestoreListState.hpp: Q3ListView* _listView;
  ScenarioMgrDlg.hpp: Q3ListView* _slotList;
  ConfigSlotsDlgBase.ui: Q3ListView* _slotSelectListView;
  FileInfoDlgBase.ui: Q3ListView* _saveList;
  LinkEditorDlgBase.ui: Q3ListView* _srcListView;
  LinkEditorDlgBase.ui: Q3ListView* _destListView;
  MarkerMgrDlgBase.ui: Q3ListView* _listView;
  PlotMembershipDlgBase.ui: Q3ListView* _listView;
  PropagateDlgBase.ui: Q3ListView* _listview;
  SlotListDlgBase.ui: Q3ListView* _slotListView;
QtAccounting:
  OpenAccountDlg.hpp: Q3ListView* _methodsListView;
  OpenAccountDlg.hpp: Q3ListView* _supplyListView;
  OpenAccountDlg.hpp: Q3ListView* _demandListView;
  AccountingSystemConfigBase.ui: Q3ListView* _waterOwnerList;
  AccountingSystemConfigBase.ui: Q3ListView* _waterTypeList;
  AccountingSystemConfigBase.ui: Q3ListView* _releaseTypeList;
  AccountingSystemConfigBase.ui: Q3ListView* _destinationTypeList;
  ExchangeCfgDlgBase.ui: Q3ListView* _paySourceListView;
  ExchangeCfgDlgBase.ui: Q3ListView* _exchangeListView;
  QtAcctMgrDlgBase.ui: Q3ListView* _accountsListView;
  QtSplyMgrDlgBase.ui: Q3ListView* _suppliesListView;
QtDmi:
  DmiEditorDlgBase.ui: Q3ListView* _listview;
  DmiHandlerDlgBase.ui: Q3ListView* _msgListView;
  DmiMgrDlgBase.ui: Q3ListView* _listview;
  DmiParamDlgBase.ui: Q3ListView* _listview;
  ListCellDlgBase.ui: Q3ListView* _listview;
QtRpl:
  RplBlockSelectorDlg.hpp: Q3ListView* _setListView;
  RplAnalysisDlgBase.ui: Q3ListView* _groupsListView;
  RplAnalysisDlgBase.ui: Q3ListView* _descListView;
  RplAnalysisDlgBase.ui: Q3ListView* _ascListView;
  RplImportDlgBase.ui: Q3ListView* _importListView;
  RplLayoutDlgBase.ui: Q3ListView* _breaksListView;
  RplPaletteDlgBase.ui: Q3ListView* _userDefinedListView;
  RplPaletteDlgBase.ui: Q3ListView* _predefinedListView;
  RplSearchReplaceDlgBase.ui: Q3ListView* _searchResultsListView;
QtRun:
  MultiRunControlDlgBase.ui: Q3ListView* _configListView;
  OptParamSubDlgBase.ui: Q3ListView* _paramListView;

(5) RiverWare uses of (Qt4) QTableView and QTableWidget

The following tables list the Qt4 QTableViews and QTableWidgets currently implemented in RiverWare (5.2).

(Qt4) QTableView and QTableWidget Subclasses:

QtRun:
  RunAnalGridQTableView.hpp : RunAnalGridQTableView : QTableView  (itemless)

(Qt4) QTableView and QTableWidget Direct Instances:

DbDmi:
  DbDmiImpExpConfirm.ui: QTableWidget*  _objTable;
QtRun:
  DistribPanel.hpp: QTableWidget*  _hostTable;
  DistribPanel.hpp: QTableWidget*  _envTable;
QtUtils:
  ClipboardImportDlgWidgets.ui: QTableWidget*  _clipboardDataTable;

(6) RiverWare uses of (Qt4) QTreeView and QTreeWidget

The following tables list the Qt4 QTableViews and QTableWidgets currently implemented in RiverWare (5.2).

(Qt4) QTableView and QTableWidget Subclasses:

QtRun:
  RunAnalGridQTableView.hpp : RunAnalGridQTableView : QTableView  (itemless)

(Qt4) QTableView and QTableWidget Direct Instances:

DbDmi:
  DbDmiImpExpConfirm.ui: QTableWidget*  _objTable;
QtRun:
  DistribPanel.hpp: QTableWidget*  _hostTable;
  DistribPanel.hpp: QTableWidget*  _envTable;
QtUtils:
  ClipboardImportDlgWidgets.ui: QTableWidget*  _clipboardDataTable;

 

 

--- (end) ---