------------------------------------------- Porting (Qt3) AccountingSystemConfigBase.ui to (Qt4) AccountingSysConfigWidgets.ui ------------------------------------------- RiverWare 5.3 -- Phil Weinstein -- 3-9-2010 Old Qt3 files: QtAccounting/AccountingSystemConfig.cpp QtAccounting/AccountingSystemConfig.hpp QtAccounting/AccountingSystemConfigBase.ui New Qt4 files: QtAccounting/AccountingSysConfigDlg.cpp QtAccounting/AccountingSysConfigDlg.hpp QtAccounting/AccountingSysConfigWidgets.ui -------------- SPECIAL ISSUES -------------- (1) Embedded Icons: Add (Plus), Remove (Minus) (2) Custom Widgets: DateTimeQtSpinner: DateTimeQtSpinner.hpp UnitsListView: UnitsListView.hpp -------- OVERVIEW -------- Two Qt 4.4.3 tools were used: uic3 and designer. uic3 was used to create a Qt4 UI file from the Qt3 UI file. Then the new Qt4 file was round-tripped through Qt4 designer. The icons embedded in the original UI file were not dropped from the Qt4 UI file until being round-tripped through designer. (That is, uic3 didn't drop those icons!). These tools did a reasonable job with the custom widgets in the Qt3 UI file, representing them in the Qt4 UI file as just QWidget subclasses instead of something more specific. (That's OK). The new UI file was initially checked in before being round-tripped through designer. See the CVS log for this file: QtAccounting/AccountingSysConfigWidgets.ui -------------- MODIFIED FILES -------------- Q3GUI/QGui.cpp Q3GUI/SlotQtDlg.cpp Q3GUI/Workspace.LoadSave.cpp Q3GUI/Workspace.cpp QtAccounting/AcctSubordinationViewerDlg.cpp QtAccounting/ExchangeCfgDlg.cpp QtAccounting/ExchangeMgrDlg.cpp QtAccounting/OpenAccountDlg.cpp QtAccounting/QtAcctMgrDlg.cpp QtAccounting/QtSplyMgrDlg.cpp QtAccounting/libQtAccountingInit.cpp QtAccounting/Make.package QtAccounting/QtAccounting.pro QtAccounting/QtAccounting.vcproj QtAccounting/QtAccountingGenerated.pro QtAccounting/QtAccountingGenerated.vcproj ------------------------- PORTING PROCEDURE / NOTES ------------------------- (1) Apply UIC3 uic3 -convert AccountingSystemConfigBase.ui > AccountingSysConfigWidgets.ui :1,$s/AccountingSystemConfigBase/AccountingSysConfigWidgets/g (2) Add new UI file to Make.package QT4_UI := \ AccountingSysConfigWidgets.ui \ DataObjExchBuilderWidgets.ui \ InitAccountListSlotsWidgets.ui QT4_Q_OBJECT := \ AccountingSysConfigDlg.hpp \ DataObjExchBuilderDlg.hpp \ InitAccountListSlotsDlg.hpp LIB_SRC := \ ... AccountingSysConfigDlg.cpp \ ... (3) Create new HPP and CPP files. cp AccountingSystemConfig.hpp AccountingSysConfigDlg.hpp cp AccountingSystemConfig.cpp AccountingSysConfigDlg.cpp :1,$s/AccountingSystemConfig/AccountingSysConfigDlg/g OLD: class AccountingSystemConfig : public AccountingSystemConfigBase NEW: class AccountingSysConfigDlg : public QDialog (4) In AccountingSysConfigDlg.hpp OLD: #ifndef ACCOUNTINGSYSTEMCONFIGBASE_H #include "qt/AccountingSysConfigDlgBase.h" #endif NEW: #include ... class Ui_AccountingSysConfigWidgets; ... Ui_AccountingSysConfigWidgets& _ui; (5) In AccountingSysConfigDlg.cpp #include "qt/ui_AccountingSysConfigWidgets.h" in constructor: OLD: : AccountingSysConfigDlgBase (parent), NEW: : QDialog (parent), _ui (*(new Ui_AccountingSysConfigWidgets())), ... _ui.setupUi (this); at end of desctructor: NEW: // Delete ui structure built from Qt4 Designer Ui_AccountingSysConfigWidgets* uiPtr (&_ui); delete uiPtr; *** UPDATE TO THIS STEP: NOT THE BESET WAY, SEE BELOW. (6) Capture errors, e.g. ... Dlg.cpp", line 411: Error: _unitsList is not defined. ... Dlg.cpp", line 487: Error: _waterOwnerList is not defined. ... Dlg.cpp", line 487: Error: _waterOwnerList is not defined. ... Dlg.cpp", line 488: Error: _waterTypeList is not defined. ... ... ... and generate subsitutions: (1) isolate identifiers ... sort ... uniq ... (2) :1,$s/.*/:1,$s\/&\/_ui.&\/g/g ... creates: :1,$s/_addWaterType/_ui._addWaterType/g :1,$s/_applyButton/_ui._applyButton/g :1,$s/_applyToAll/_ui._applyToAll/g :1,$s/_cancelButton/_ui._cancelButton/g :1,$s/_destinationTypeList/_ui._destinationTypeList/g :1,$s/_okButton/_ui._okButton/g :1,$s/_releaseTypeList/_ui._releaseTypeList/g :1,$s/_unitsList/_ui._unitsList/g :1,$s/_waterOwnerList/_ui._waterOwnerList/g :1,$s/_waterTypeList/_ui._waterTypeList/g ... apply to AccountingSysConfigDlg.cpp ... YIKES! this needs to be repeated because the original compilation didn't generate all of the necessary "errors". Some identifiers were left out. It will be better to pull the identifiers from the old generated qt/*.h file: AccountingSystemConfigBase.h ... (6B) BETTER WAY: Pull the widget identifiers out of the old generated header file: AccountingSystemConfigBase.h QVBoxLayout *vboxLayout; QGridLayout *gridLayout; DateTimeQtSpinner *_rentReturn; QLabel *_beginLabel; DateTimeQtSpinner *_beginAP; DateTimeQtSpinner *_beginAccrual; QLabel *_beginPLabel; QLabel *_endPLabel; DateTimeQtSpinner *_endAP; ... ... ... QCheckBox *_applyToAll; QFrame *_horzLine2; QHBoxLayout *hboxLayout8; QPushButton *_okButton; QPushButton *_applyButton; QPushButton *_cancelButton; (1) isolate identifiers ... sort ... uniq ... (2) :1,$s/.*/:1,$s\/&\/_ui.&\/g/g ... apply to AccountingSysConfigDlg.cpp (7) Remove old module from build, and update references to new dialog: Removing from Make.package: LIB_SRC := ... AccountingSystemConfig.cpp QT_UI := ... AccountingSystemConfigBase.ui QT_Q_OBJECT := ... AccountingSystemConfig.hpp Changes in QtAccounting.pro QtAccountingGenerated.pro ... :1,$s/AccountingSystemConfigBase/AccountingSysConfigWidgets/g :1,$s/AccountingSystemConfig/AccountingSysConfigDlg/g ... and move the UI file from FORMS3 to FORMS Change to new dialog class in these clients: Q3GUI/QGui.cpp Q3GUI/SlotQtDlg.cpp Q3GUI/Workspace.LoadSave.cpp Q3GUI/Workspace.cpp QtAccounting/libQtAccountingInit.cpp QtAccounting/ExchangeCfgDlg.cpp QtAccounting/ExchangeMgrDlg.cpp QtAccounting/OpenAccountDlg.cpp QtAccounting/QtAcctMgrDlg.cpp QtAccounting/QtSplyMgrDlg.cpp :1,$s/AccountingSystemConfig/AccountingSysConfigDlg/g From top of obj area: rm `grep -l AccountingSystemConfig */depend/*` rm QtAccounting/AccountingSystemConfig*.o (8) Round-trip the new UI file through (Qt4) Designer. This drops the internal images! Replace those in our C++ code. const QIcon addIcon (RwQPixmap16::greenPlus()); const QIcon remIcon (RwQPixmap16::redMinus()); const QSize addIconSize (RwQPixmap16::greenPlus().size()); const QSize remIconSize (RwQPixmap16::redPlus().size()); _ui._addWaterOwner -> setIcon (addIcon); _ui._addWaterType -> setIcon (addIcon); _ui._addReleaseType -> setIcon (addIcon); _ui._addDestType -> setIcon (addIcon); _ui._removeWaterOwner -> setIcon (remIcon); _ui._removeWaterType -> setIcon (remIcon); _ui._removeReleaseType -> setIcon (remIcon); _ui._removeDestType -> setIcon (remIcon); _ui._addWaterOwner -> setIconSize (addIconSize); _ui._addWaterType -> setIconSize (addIconSize); _ui._addReleaseType -> setIconSize (addIconSize); _ui._addDestType -> setIconSize (addIconSize); _ui._removeWaterOwner -> setIconSize (remIconSize); _ui._removeWaterType -> setIconSize (remIconSize); _ui._removeReleaseType -> setIconSize (remIconSize); _ui._removeDestType -> setIconSize (remIconSize); ---