| 1 | /****************************************************************************
|
|---|
| 2 | **
|
|---|
| 3 | ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
|---|
| 4 | ** Contact: Qt Software Information (qt-info@nokia.com)
|
|---|
| 5 | **
|
|---|
| 6 | ** This file is part of the documentation of the Qt Toolkit.
|
|---|
| 7 | **
|
|---|
| 8 | ** $QT_BEGIN_LICENSE:LGPL$
|
|---|
| 9 | ** Commercial Usage
|
|---|
| 10 | ** Licensees holding valid Qt Commercial licenses may use this file in
|
|---|
| 11 | ** accordance with the Qt Commercial License Agreement provided with the
|
|---|
| 12 | ** Software or, alternatively, in accordance with the terms contained in
|
|---|
| 13 | ** a written agreement between you and Nokia.
|
|---|
| 14 | **
|
|---|
| 15 | ** GNU Lesser General Public License Usage
|
|---|
| 16 | ** Alternatively, this file may be used under the terms of the GNU Lesser
|
|---|
| 17 | ** General Public License version 2.1 as published by the Free Software
|
|---|
| 18 | ** Foundation and appearing in the file LICENSE.LGPL included in the
|
|---|
| 19 | ** packaging of this file. Please review the following information to
|
|---|
| 20 | ** ensure the GNU Lesser General Public License version 2.1 requirements
|
|---|
| 21 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|---|
| 22 | **
|
|---|
| 23 | ** In addition, as a special exception, Nokia gives you certain
|
|---|
| 24 | ** additional rights. These rights are described in the Nokia Qt LGPL
|
|---|
| 25 | ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
|
|---|
| 26 | ** package.
|
|---|
| 27 | **
|
|---|
| 28 | ** GNU General Public License Usage
|
|---|
| 29 | ** Alternatively, this file may be used under the terms of the GNU
|
|---|
| 30 | ** General Public License version 3.0 as published by the Free Software
|
|---|
| 31 | ** Foundation and appearing in the file LICENSE.GPL included in the
|
|---|
| 32 | ** packaging of this file. Please review the following information to
|
|---|
| 33 | ** ensure the GNU General Public License version 3.0 requirements will be
|
|---|
| 34 | ** met: http://www.gnu.org/copyleft/gpl.html.
|
|---|
| 35 | **
|
|---|
| 36 | ** If you are unsure which license is appropriate for your use, please
|
|---|
| 37 | ** contact the sales department at qt-sales@nokia.com.
|
|---|
| 38 | ** $QT_END_LICENSE$
|
|---|
| 39 | **
|
|---|
| 40 | ****************************************************************************/
|
|---|
| 41 |
|
|---|
| 42 | /*!
|
|---|
| 43 | \page porting4-designer.html
|
|---|
| 44 | \title Porting .ui Files to Qt 4
|
|---|
| 45 | \contentspage {Porting Guides}{Contents}
|
|---|
| 46 | \previouspage Porting to Qt 4 - Drag and Drop
|
|---|
| 47 | \nextpage Porting to Graphics View
|
|---|
| 48 | \ingroup porting
|
|---|
| 49 | \brief Information about changes to the .ui file format in Qt 4.
|
|---|
| 50 |
|
|---|
| 51 | Qt Designer has changed significantly in the Qt 4 release. We
|
|---|
| 52 | have moved away from viewing Qt Designer as an IDE and
|
|---|
| 53 | concentrated on creating a robust form builder which can be
|
|---|
| 54 | extended and embedded in existing IDEs. Our efforts are ongoing
|
|---|
| 55 | and include the \l{Visual Studio Integration},
|
|---|
| 56 | as well as integrating Designer with KDevelop and possibly other
|
|---|
| 57 | IDEs.
|
|---|
| 58 |
|
|---|
| 59 | The most important changes in Qt Designer 4 which affect porting
|
|---|
| 60 | for \c .ui files are summarized below:
|
|---|
| 61 |
|
|---|
| 62 | \list
|
|---|
| 63 | \o \bold{Removed project manager.}
|
|---|
| 64 | Qt Designer now only reads and edits \c .ui
|
|---|
| 65 | files. It has no notion of a project (\c .pro file).
|
|---|
| 66 |
|
|---|
| 67 | \o \bold{Removed code editor.}
|
|---|
| 68 | Qt Designer can no longer be used to edit source files.
|
|---|
| 69 |
|
|---|
| 70 | \o \bold{Changed format of \c .ui files.}
|
|---|
| 71 | Qt Designer 4 cannot read files created by Qt Designer 3 and
|
|---|
| 72 | vice versa. However, we provide the tool \c uic3 to generate Qt
|
|---|
| 73 | 4 code out of Qt 3 \c .ui files, and to convert old \c .ui files
|
|---|
| 74 | into a format readable by Qt Designer 4.
|
|---|
| 75 |
|
|---|
| 76 | \o \bold{Changed structure of the code generated by \c uic.}
|
|---|
| 77 | The \c myform.ui file containing the form \c MyForm is now
|
|---|
| 78 | converted into a single header file \c ui_myform.h, which
|
|---|
| 79 | contains the declaration and inline definition of a POD class
|
|---|
| 80 | \c Ui::MyForm.
|
|---|
| 81 |
|
|---|
| 82 | \o \bold{New resource file system.} Icon data is no longer
|
|---|
| 83 | stored in the \c .ui file. Instead, icons are put into resource
|
|---|
| 84 | files (\c .qrc).
|
|---|
| 85 | \endlist
|
|---|
| 86 |
|
|---|
| 87 | The rest of this document explains how to deal with the main
|
|---|
| 88 | differences between Qt Designer 3 and Qt Designer 4:
|
|---|
| 89 |
|
|---|
| 90 | \tableofcontents
|
|---|
| 91 |
|
|---|
| 92 | See \l{Porting to Qt 4} and \l{qt3to4 - The Qt 3 to 4 Porting
|
|---|
| 93 | Tool} for more information about porting from Qt 3 to Qt 4. See
|
|---|
| 94 | also the \l{Qt Designer Manual}.
|
|---|
| 95 |
|
|---|
| 96 | \section1 uic Output
|
|---|
| 97 |
|
|---|
| 98 | In Qt 3, \c uic generated a header file and an implementation for
|
|---|
| 99 | a class, which inherited from one of Qt's widgets. To use the
|
|---|
| 100 | form, the programmer included the generated sources into the
|
|---|
| 101 | application and created an instance of the class.
|
|---|
| 102 |
|
|---|
| 103 | In Qt 4, \c uic creates a header file containing a POD class. The
|
|---|
| 104 | name of this class is the object name of the main container,
|
|---|
| 105 | qualified with the \c Ui namespace (e.g., \c Ui::MyForm). The
|
|---|
| 106 | class is implemented using inline functions, removing the need of
|
|---|
| 107 | a separate \c .cpp file. Just as in Qt 3, this class contains
|
|---|
| 108 | pointers to all the widgets inside the form as public members. In
|
|---|
| 109 | addition, the generated class provides the public method \c
|
|---|
| 110 | setupUi().
|
|---|
| 111 |
|
|---|
| 112 | The class generated by \c uic is not a QWidget; in fact, it's not
|
|---|
| 113 | even a QObject. Instead, it is a class which knows how to
|
|---|
| 114 | populate an instance of a main container with the contents of the
|
|---|
| 115 | form. The programmer creates the main container himself, then
|
|---|
| 116 | passes it to \c setupUi().
|
|---|
| 117 |
|
|---|
| 118 | For example, here's the \c uic output for a simple \c
|
|---|
| 119 | helloworld.ui form (some details were removed for simplicity):
|
|---|
| 120 |
|
|---|
| 121 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 0
|
|---|
| 122 |
|
|---|
| 123 | In this case, the main container was specified to be a QWidget
|
|---|
| 124 | (or any subclass of QWidget). Had we started with a QMainWindow
|
|---|
| 125 | template in Qt Designer, \c setupUi()'s parameter would be of
|
|---|
| 126 | type QMainWindow.
|
|---|
| 127 |
|
|---|
| 128 | There are two ways to create an instance of our form. One
|
|---|
| 129 | approach is to create an instance of the \c Ui::HelloWorld class,
|
|---|
| 130 | an instance of the main container (a plain QWidget), and call \c
|
|---|
| 131 | setupUi():
|
|---|
| 132 |
|
|---|
| 133 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 1
|
|---|
| 134 |
|
|---|
| 135 | The second approach is to inherit from both the \c Ui::HelloWorld
|
|---|
| 136 | class and the main container, and to call \c setupUi() in the
|
|---|
| 137 | constructor of the subclass. In that case, QWidget (or one of
|
|---|
| 138 | its subclasses, e.g. QDialog) must appear first in the base class
|
|---|
| 139 | list so that \l{moc} picks it up correctly. For example:
|
|---|
| 140 |
|
|---|
| 141 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 2
|
|---|
| 142 |
|
|---|
| 143 | This second method is useful when porting Qt 3 forms to Qt 4. \c
|
|---|
| 144 | HelloWorldWidget is a class whose instance is the actual form
|
|---|
| 145 | and which contains public pointers to all the widgets in it. It
|
|---|
| 146 | therefore has an interface identical to that of a class generated
|
|---|
| 147 | by \c uic in Qt 3.
|
|---|
| 148 |
|
|---|
| 149 | Creating POD classes from \c .ui files is more flexible and
|
|---|
| 150 | generic than the old approach of creating widgets. Qt Designer
|
|---|
| 151 | doesn't need to know anything about the main container apart from
|
|---|
| 152 | the base widget class it inherits. Indeed, \c Ui::HelloWorld can
|
|---|
| 153 | be used to populate any container that inherits QWidget.
|
|---|
| 154 | Conversely, all non-GUI aspects of the main container may be
|
|---|
| 155 | implemented by the programmer in the application's sources
|
|---|
| 156 | without reference to the form.
|
|---|
| 157 |
|
|---|
| 158 | \section1 Working with uic3
|
|---|
| 159 |
|
|---|
| 160 | Qt 4 comes with the tool \c uic3 for working with old \c .ui
|
|---|
| 161 | files. It can be used in two ways:
|
|---|
| 162 |
|
|---|
| 163 | \list 1
|
|---|
| 164 | \o To generate headers and source code for a widget to implement any
|
|---|
| 165 | custom signals and slots added using Qt Designer 3.
|
|---|
| 166 | \o To generate a new \c .ui file that can be used with Qt Designer 4.
|
|---|
| 167 | \endlist
|
|---|
| 168 |
|
|---|
| 169 | You can use both these methods in combination to obtain \c{.ui}, header
|
|---|
| 170 | and source files that you can use as a starting point when porting
|
|---|
| 171 | your user interface to Qt 4.
|
|---|
| 172 |
|
|---|
| 173 | The first method generates a Qt 3 style header and implementation
|
|---|
| 174 | which uses Qt 4 widgets (this includes the Qt 3 compatibility classes
|
|---|
| 175 | present in the Qt3Support library). This process should be familiar to
|
|---|
| 176 | anyone used to working with Qt Designer 3:
|
|---|
| 177 |
|
|---|
| 178 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 3
|
|---|
| 179 |
|
|---|
| 180 | The resulting files \c myform.h and \c myform.cpp implement the
|
|---|
| 181 | form in Qt 4 using a QWidget that will include custom signals,
|
|---|
| 182 | slots and connections specified in the \c .ui file. However,
|
|---|
| 183 | see below for the \l{#Limitations of uic3}{limitations} of this
|
|---|
| 184 | method.
|
|---|
| 185 |
|
|---|
| 186 | The second method is to use \c uic3 to convert a Qt Designer 3 \c .ui
|
|---|
| 187 | file to the Qt Designer 4 format:
|
|---|
| 188 |
|
|---|
| 189 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 4
|
|---|
| 190 |
|
|---|
| 191 | The resulting file \c myform4.ui can be edited in Qt Designer 4. The
|
|---|
| 192 | header file for the form is generated by Qt 4's \c uic. See the
|
|---|
| 193 | \l{Using a Designer .ui File in Your Application} chapter of the
|
|---|
| 194 | \l{Qt Designer Manual} for information about the preferred ways to
|
|---|
| 195 | use forms created with Qt Designer 4.
|
|---|
| 196 |
|
|---|
| 197 | \c uic3 tries very hard to map Qt 3 classes and their properties to
|
|---|
| 198 | Qt 4. However, the behavior of some classes changed significantly
|
|---|
| 199 | in Qt 4. To keep the form working, some Qt 3 classes are mapped
|
|---|
| 200 | to classes in the Qt3Support library. Table 1 shows a list of
|
|---|
| 201 | classes this applies to.
|
|---|
| 202 |
|
|---|
| 203 | \table
|
|---|
| 204 | \header \o Qt 3 class \o Qt 4 class
|
|---|
| 205 | \row \o \c QButtonGroup \o Q3ButtonGroup
|
|---|
| 206 | \row \o \c QDateEdit \o Q3DateEdit
|
|---|
| 207 | \row \o \c QDateTimeEdit \o Q3DateTimeEdit
|
|---|
| 208 | \row \o \c QGroupBox \o Q3GroupBox
|
|---|
| 209 | \row \o \c QListBox \o Q3ListBox
|
|---|
| 210 | \row \o \c QListView \o Q3ListView
|
|---|
| 211 | \row \o \c QMainWindow \o Q3MainWindow
|
|---|
| 212 | \row \o \c QTextEdit \o Q3TextEdit
|
|---|
| 213 | \row \o \c QTextView \o Q3TextView
|
|---|
| 214 | \row \o \c QTimeEdit \o Q3TimeEdit
|
|---|
| 215 | \row \o \c QWidgetStack \o Q3WidgetStack
|
|---|
| 216 | \row \o \c QWizard \o Q3Wizard
|
|---|
| 217 | \endtable
|
|---|
| 218 |
|
|---|
| 219 | \section1 Limitations of uic3
|
|---|
| 220 |
|
|---|
| 221 | Converting Qt 3 \c .ui files to Qt 4 has some limitations. The
|
|---|
| 222 | most noticeable limitation is the fact that since \c uic no
|
|---|
| 223 | longer generates a QObject, it's not possible to define custom
|
|---|
| 224 | signals or slots for the form. Instead, the programmer must
|
|---|
| 225 | define these signals and slots in the main container and connect
|
|---|
| 226 | them to the widgets in the form after calling \c setupUi(). For
|
|---|
| 227 | example:
|
|---|
| 228 |
|
|---|
| 229 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 5
|
|---|
| 230 |
|
|---|
| 231 | A quick and dirty way to port forms containing custom signals and
|
|---|
| 232 | slots is to generate the code using \c uic3, rather than \c uic. Since
|
|---|
| 233 | \c uic3 does generate a QWidget, it will populate it with custom
|
|---|
| 234 | signals, slots and connections specified in the \c .ui file.
|
|---|
| 235 | However, \c uic3 can only generate code from Qt 3 \c .ui files, which
|
|---|
| 236 | implies that the \c .ui files never get translated and need to be
|
|---|
| 237 | edited using Qt Designer 3.
|
|---|
| 238 |
|
|---|
| 239 | Note also that it is possible to create implicit connections
|
|---|
| 240 | between the widgets in a form and the main container. After \c
|
|---|
| 241 | setupUi() populates the main container with child widgets it
|
|---|
| 242 | scans the main container's list of slots for names with the form
|
|---|
| 243 | \tt{on_\e{objectName}_\e{signalName}().}
|
|---|
| 244 |
|
|---|
| 245 | If the form contains a widget whose object name is
|
|---|
| 246 | \tt{\e{objectName}}, and if that widget has a signal called
|
|---|
| 247 | \tt{\e{signalName}}, then this signal will be connected to the
|
|---|
| 248 | main container's slot. For example:
|
|---|
| 249 |
|
|---|
| 250 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 6
|
|---|
| 251 |
|
|---|
| 252 | Because of the naming convention, \c setupUi() automatically
|
|---|
| 253 | connects \c pushButton's \c clicked() signal to \c
|
|---|
| 254 | HelloWorldWidget's \c on_pushButton_clicked() slot.
|
|---|
| 255 |
|
|---|
| 256 | \section1 Icons
|
|---|
| 257 |
|
|---|
| 258 | In Qt 3, the binary data for the icons used by a form was stored
|
|---|
| 259 | in the \c .ui file. In Qt 4 icons and any other external files
|
|---|
| 260 | can be compiled into the application by listing them in a \l{The
|
|---|
| 261 | Qt Resource System}{resource file} (\c .qrc). This file is
|
|---|
| 262 | translated into a C++ source file using Qt's resource compiler
|
|---|
| 263 | (\c rcc). The data in the files is then available to any Qt class
|
|---|
| 264 | which takes a file name argument.
|
|---|
| 265 |
|
|---|
| 266 | Imagine that we have two icons, \c yes.png and \c no.png. We
|
|---|
| 267 | create a resource file called \c icons.qrc with the following
|
|---|
| 268 | contents:
|
|---|
| 269 |
|
|---|
| 270 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 7
|
|---|
| 271 |
|
|---|
| 272 | Next, we add the resource file to our \c .pro file:
|
|---|
| 273 |
|
|---|
| 274 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 8
|
|---|
| 275 |
|
|---|
| 276 | When \c qmake is run, it will create the appropriate Makefile
|
|---|
| 277 | rules to call \c rcc on the resource file, and compile and link
|
|---|
| 278 | the result into the application. The icons may be accessed as
|
|---|
| 279 | follows:
|
|---|
| 280 |
|
|---|
| 281 | \snippet doc/src/snippets/code/doc_src_porting4-designer.qdoc 9
|
|---|
| 282 |
|
|---|
| 283 | In each case, the leading colon tells Qt to look for the file in
|
|---|
| 284 | the virtual file tree defined by the set of resource files
|
|---|
| 285 | compiled into the application instead of the file system.
|
|---|
| 286 |
|
|---|
| 287 | In the \c .qrc file, the \c qresource tag's \c prefix attribute
|
|---|
| 288 | is used to arrange the files into categories and set a virtual
|
|---|
| 289 | path where the files will be accessed.
|
|---|
| 290 |
|
|---|
| 291 | Caveat: If the resource file was not linked directly into the
|
|---|
| 292 | application, but instead into a dynamic or static library that
|
|---|
| 293 | was later linked with the application, its virtual file tree will
|
|---|
| 294 | not be available to QFile and friends until the Q_INIT_RESOURCE()
|
|---|
| 295 | macro is called. This macro takes one argument, which is the name
|
|---|
| 296 | of the \c .qrc file, without the path or the file extension. A
|
|---|
| 297 | convenient place to initialize resources is at the top of the
|
|---|
| 298 | application's \c main() function.
|
|---|
| 299 |
|
|---|
| 300 | In Qt Designer 4, we can associate any number of resource files
|
|---|
| 301 | with a form using the resource editor tool. The widgets in the
|
|---|
| 302 | form can access all icons specified in its associated resource
|
|---|
| 303 | files.
|
|---|
| 304 |
|
|---|
| 305 | In short, porting of icons from a Qt 3 to a Qt 4 form involves
|
|---|
| 306 | the following steps:
|
|---|
| 307 |
|
|---|
| 308 | \list 1
|
|---|
| 309 | \o Use \c{uic3 -convert} to obtain a \c .ui file understood by
|
|---|
| 310 | Qt Designer 4.
|
|---|
| 311 |
|
|---|
| 312 | \o Create a \c .qrc file with a list of all the icon files.
|
|---|
| 313 |
|
|---|
| 314 | \o Add the resource file to the \c .pro file.
|
|---|
| 315 |
|
|---|
| 316 | \o Open the form in Qt Designer 4 and add the resource file to the
|
|---|
| 317 | form's resource editor.
|
|---|
| 318 |
|
|---|
| 319 | \o Set the icon properties for the appropriate widgets.
|
|---|
| 320 | \endlist
|
|---|
| 321 |
|
|---|
| 322 | \section1 Custom Widgets
|
|---|
| 323 |
|
|---|
| 324 | Qt Designer 3 supported defining custom widgets by specifying
|
|---|
| 325 | their name, header file and methods. In Qt Designer 4, a custom
|
|---|
| 326 | widget is always created by "promoting" an existing Qt widget to
|
|---|
| 327 | a custom class. Qt Designer 4 assumes that the custom widget will
|
|---|
| 328 | inherit from the widget that has been promoted. In the form
|
|---|
| 329 | editor, the custom widget will retain the looks, behavior,
|
|---|
| 330 | properties, signals and slots of the base widget. It is not
|
|---|
| 331 | currently possible to tell Qt Designer 4 that the custom widget
|
|---|
| 332 | will have additional signals or slots.
|
|---|
| 333 |
|
|---|
| 334 | \c{uic3 -convert} handles the conversion of custom widgets to the
|
|---|
| 335 | new \c .ui format, however all custom signals and slots are lost.
|
|---|
| 336 | Furthermore, since Qt Designer 3 never knew the base widget class
|
|---|
| 337 | of a custom widget, it is taken to be QWidget. This is often
|
|---|
| 338 | sufficient. If not, the custom widgets have to be inserted
|
|---|
| 339 | manually into the form.
|
|---|
| 340 |
|
|---|
| 341 | Custom widget plugins, which contain custom widgets to be used in
|
|---|
| 342 | Qt Designer, must themselves be ported before they can be used in
|
|---|
| 343 | forms ported with \c{uic3}.
|
|---|
| 344 | The \l{Porting to Qt 4} document contains information about general
|
|---|
| 345 | porting issues that may apply to the custom widget code itself, and
|
|---|
| 346 | the \l{Creating Custom Widgets for Qt Designer} chapter of the
|
|---|
| 347 | \l{Qt Designer Manual} describes how the ported widget should be
|
|---|
| 348 | built in order to work in Qt Designer 4.
|
|---|
| 349 | */
|
|---|