| 
									
										
										
										
											2009-10-26 12:08:05 +01:00
										 |  |  | /************************************************************************** | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator | 
					
						
							|  |  |  | ** | 
					
						
							| 
									
										
										
										
											2010-03-05 11:25:49 +01:00
										 |  |  | ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-06-16 17:26:44 +02:00
										 |  |  | ** Contact: Nokia Corporation (qt-info@nokia.com) | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-10-26 12:08:05 +01:00
										 |  |  | ** Commercial Usage | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-10-26 12:08:05 +01:00
										 |  |  | ** Licensees holding valid Qt Commercial licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the Qt Commercial License Agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and Nokia. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | ** | 
					
						
							|  |  |  | ** GNU Lesser General Public License Usage | 
					
						
							| 
									
										
										
										
											2009-10-26 12:08:05 +01:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
					
						
							|  |  |  | ** General Public License version 2.1 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation and appearing in the file LICENSE.LGPL included in the | 
					
						
							|  |  |  | ** packaging of this file.  Please review the following information to | 
					
						
							|  |  |  | ** ensure the GNU Lesser General Public License version 2.1 requirements | 
					
						
							|  |  |  | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** If you are unsure which license is appropriate for your use, please | 
					
						
							| 
									
										
										
										
											2009-08-14 09:30:56 +02:00
										 |  |  | ** contact the sales department at http://qt.nokia.com/contact. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | ** | 
					
						
							| 
									
										
										
										
											2009-10-26 12:08:05 +01:00
										 |  |  | **************************************************************************/ | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*! | 
					
						
							|  |  |  |     \page tutorials-addressbook-sdk.html | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \startpage {index.html}{Qt Reference Documentation} | 
					
						
							| 
									
										
										
										
											2009-06-09 12:40:10 +02:00
										 |  |  |     \nextpage {examples/addressbook-sdk/part1}{Chapter 1} | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \title Address Book Tutorial | 
					
						
							|  |  |  |     \brief An introduction to GUI programming with Qt and Qt Creator, | 
					
						
							|  |  |  |     describing in detail how to put together a simple yet fully- | 
					
						
							|  |  |  |     functioning application. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This tutorial gives an introduction to GUI programming using the Qt SDK. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 17:02:16 +02:00
										 |  |  |     \image addressbook-tutorial-screenshot.png | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In the process, you will learn about some basic technologies provided by | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |     Qt, such as: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \list | 
					
						
							|  |  |  |         \o  Widgets and layout managers | 
					
						
							|  |  |  |         \o  Container classes | 
					
						
							|  |  |  |         \o  Signals and slots | 
					
						
							|  |  |  |         \o  Input and output devices | 
					
						
							|  |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-25 15:43:40 +02:00
										 |  |  |     All these technologies will be introduced via the Qt Creator Integrated | 
					
						
							|  |  |  |     Development Environment (IDE). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |     If you are completely new to Qt, please read \l{How to Learn Qt} if you | 
					
						
							|  |  |  |     have not already done so. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The tutorial's source code is located in Qt's | 
					
						
							|  |  |  |     \c{examples/tutorials/addressbook} directory. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Tutorial chapters: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \list 1 | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  |         \o \l{examples/addressbook-sdk/part1}{Designing the User Interface} | 
					
						
							|  |  |  |         \o \l{examples/addressbook-sdk/part2}{Adding Addresses} | 
					
						
							|  |  |  |         \o \l{examples/addressbook-sdk/part3}{Navigating between Entries} | 
					
						
							|  |  |  |         \o \l{examples/addressbook-sdk/part4}{Editing and Removing Addresses} | 
					
						
							|  |  |  |         \o \l{examples/addressbook-sdk/part5}{Adding a Find Function} | 
					
						
							|  |  |  |         \o \l{examples/addressbook-sdk/part6}{Loading and Saving} | 
					
						
							|  |  |  |         \o \l{examples/addressbook-sdk/part7}{Additional Features} | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Although this little application does not look much like a fully-fledged | 
					
						
							|  |  |  |     modern GUI application, it uses many of the basic techniques that are used | 
					
						
							|  |  |  |     in more complex applications. After you have worked through it, we | 
					
						
							|  |  |  |     recommend checking out the \l{mainwindows/application}{Application} | 
					
						
							|  |  |  |     example, which presents a small GUI application, with menus, toolbars, a | 
					
						
							|  |  |  |     status bar, and so on. | 
					
						
							| 
									
										
										
										
											2009-06-18 12:55:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*! | 
					
						
							|  |  |  |     \page tutorials-addressbook-sdk-part1.html | 
					
						
							|  |  |  |     \contentspage {Address Book Tutorial}{Contents} | 
					
						
							| 
									
										
										
										
											2009-06-10 11:25:51 +02:00
										 |  |  |     \nextpage {examples/addressbook-sdk/part2}{Chapter 2} | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  |     \example examples/addressbook-sdk/part1 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |     \title Address Book 1 - Designing the User Interface | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The first part of this tutorial covers the design of the basic graphical | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     user interface (GUI) you use for the Address Book application. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     The first step to creating a GUI program is to design the user interface. | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In this chapter, your goal is to set up the labels and input fields needed | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |     to implement a basic address book application. The figure below is a | 
					
						
							|  |  |  |     screenshot of our expected output. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \image addressbook-tutorial-part1-screenshot.png | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Begin by launching Qt Creator and use it to generate a new project. To | 
					
						
							|  |  |  |     do this, select \gui{File} > \gui{New File or Project...} > | 
					
						
							|  |  |  |     \gui{Qt Application Project} > \gui{Qt Gui Application} and | 
					
						
							| 
									
										
										
										
											2009-08-05 15:30:48 +02:00
										 |  |  |     click \gui OK. Set your project name to \bold part1 with the QtCore and | 
					
						
							|  |  |  |     QtGui modules checked. Ensure that you select QWidget as your base class | 
					
						
							|  |  |  |     and name it \c AddressBook. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-05 15:30:48 +02:00
										 |  |  |     When you click \gui Next, \e five files will be generated in this | 
					
						
							|  |  |  |     \gui{Project}: | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \list | 
					
						
							| 
									
										
										
										
											2009-08-05 15:30:48 +02:00
										 |  |  |         \o  \c{main.cpp} - the file containing a \c main() function, with an | 
					
						
							|  |  |  |             instance of \c AddressBook, | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |         \o  \c{addressbook.cpp} - the implementation file for the | 
					
						
							|  |  |  |             \c AddressBook class, | 
					
						
							| 
									
										
										
										
											2009-08-05 15:30:48 +02:00
										 |  |  |         \o  \c{addressbook.h} - the definition file for the \c AddressBook | 
					
						
							|  |  |  |             class, | 
					
						
							|  |  |  |         \o  \c{addressbook.ui} - the user interface file created with \QD, | 
					
						
							|  |  |  |             and | 
					
						
							|  |  |  |         \o  \c{part1.pro} - the project file. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Now that you have all the files you need, click \gui Finish so you can | 
					
						
							|  |  |  |     start designing the user interface. | 
					
						
							| 
									
										
										
										
											2009-08-05 15:30:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \note For more details on how to create a \gui Project with Qt Creator, | 
					
						
							|  |  |  |     refer to \l{Creating a Project}. | 
					
						
							| 
									
										
										
										
											2009-06-02 15:21:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     \section1 Placing Widgets on The Form | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-05 16:03:20 +02:00
										 |  |  |     \image addressbook-tutorial-part1-creator-screenshot.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     In the \gui{Projects} sidebar, double-click on the \c{addressbook.ui} file. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  |     The \QD plugin will be launched, allowing you to design your program's user | 
					
						
							|  |  |  |     interface. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-05 16:03:20 +02:00
										 |  |  |     \image addressbook-tutorial-part1-designer-screenshot.png | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You require two \l{QLabel}s to label the input fields as well as a | 
					
						
							|  |  |  |     QLineEdit and a QTextEdit for the input fields. To create this follow the | 
					
						
							|  |  |  |     steps mentioned below: | 
					
						
							|  |  |  |     \list | 
					
						
							|  |  |  |        \o  Drag those widgets from the \gui{Widget Box} to your form. | 
					
						
							|  |  |  |        \o  In the \gui{Property Editor}, set their \gui{objectName} property to | 
					
						
							|  |  |  |            \c nameLabel and \c addressLabel for the \l{QLabel}s, \c nameLine | 
					
						
							|  |  |  |            for the QLineEdit and finally, \c addressText for the QTextEdit. | 
					
						
							|  |  |  |        \o  Position the widgets properly, according to the screenshot above. | 
					
						
							|  |  |  |        \o  Use a QGridLayout to position our labels and input fields in a | 
					
						
							|  |  |  |            structured manner. QGridLayout divides the available space into | 
					
						
							|  |  |  |            a grid and places widgets in the cells you specify with row and | 
					
						
							|  |  |  |            column numbers. | 
					
						
							|  |  |  |        \o  Place the caption of the \c addressLabel on the top, change the | 
					
						
							|  |  |  |            vertical alignment property to \c AlignTop. | 
					
						
							|  |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The figure below shows the layout cells and the position of our widgets. | 
					
						
							|  |  |  |     Place your widgets accordingly and save the form by choosing | 
					
						
							|  |  |  |     \gui{File} > \gui{Save} or use the shortcut key \key{Ctrl+S}. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \image addressbook-tutorial-part1-labeled-screenshot.png | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 15:19:21 +02:00
										 |  |  |     A common mistake when designing user interfaces with \QD is overlooking the | 
					
						
							|  |  |  |     top level widget's layout. Unlike sub-layouts, which \QD displays with a | 
					
						
							|  |  |  |     red border, top level layouts have no graphical representation. Layouts are | 
					
						
							|  |  |  |     necessary for top level widgets, in this case QWidget, to ensure that when | 
					
						
							|  |  |  |     the window is resized, the widgets on the form will resize accordingly. You | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     can try this out by pressing \key{Ctrl+Alt+R} now. To correct it, click | 
					
						
							| 
									
										
										
										
											2009-06-02 15:19:21 +02:00
										 |  |  |     anywhere on the form and select \gui{Lay out Horizontally} or | 
					
						
							|  |  |  |     \gui{Lay out Vertically}. The output will be the same. Now your widgets | 
					
						
							|  |  |  |     will resize correctly. | 
					
						
							| 
									
										
										
										
											2009-05-29 18:32:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \note Refer to the \l{Layout Classes} document for more | 
					
						
							|  |  |  |     details on Qt's layout management classes. In addition, the | 
					
						
							|  |  |  |     \l{Getting to Know Qt Designer} document explains how to use | 
					
						
							|  |  |  |     layouts with \QD. | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     \section1 The AddressBook Class | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     The \l{examples/addressbook-sdk/part1/addressbook.h}{\c addressbook.h} file | 
					
						
							|  |  |  |     is used to define the \c AddressBook class. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     Let's take a look at what is already provided for us by Qt Creator. The | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  |     \c AddressBook class has been defined as a QWidget subclass with a | 
					
						
							| 
									
										
										
										
											2009-04-20 10:51:40 +02:00
										 |  |  |     constructor and destructor.The Q_OBJECT macro is used to indicate that this | 
					
						
							| 
									
										
										
										
											2009-05-25 15:43:40 +02:00
										 |  |  |     class uses internationalization as well as Qt's signals and slots features. | 
					
						
							|  |  |  |     Although the macro implements some of Qt's more advanced features, for now, | 
					
						
							|  |  |  |     it is useful to think of it as a shortcut that allows us to use the | 
					
						
							| 
									
										
										
										
											2009-04-20 10:51:40 +02:00
										 |  |  |     \l{QObject::}{tr()} and \l{QObject::}{connect()} functions. | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part1/addressbook.h class definition | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Qt Creator's \gui{Project Wizard} provides you with the \c Ui object as a | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     way to access the widgets on our form. | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     The \l{examples/addressbook-sdk/part1/addressbook.cpp}{\c addressbook.cpp} | 
					
						
							|  |  |  |     file is used to implement the \c AddressBook class. The constructor sets up | 
					
						
							|  |  |  |     the \c ui file; the destructor deletes it. | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part1/addressbook.cpp class implementation | 
					
						
							| 
									
										
										
										
											2009-04-15 17:28:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     \section1 The \c{main()} Function | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     The \l{examples/addressbook-sdk/part1/main.cpp}{\c main.cpp} file contains | 
					
						
							|  |  |  |     the \c{main()} function  It is generated by the \gui{Project Wizard}. | 
					
						
							|  |  |  |     Within this function, a QApplication object, \c a, is instantiated. | 
					
						
							|  |  |  |     QApplication is responsible for various application-wide resources, such as | 
					
						
							|  |  |  |     the default font and cursor, and for running an event loop. Hence, there is | 
					
						
							| 
									
										
										
										
											2009-04-20 15:35:28 +02:00
										 |  |  |     always one QApplication object in every GUI application using Qt. | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 14:17:24 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part1/main.cpp main function | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-29 21:33:57 +01:00
										 |  |  |     The code constructs a new \c AddressBook widget on the stack and | 
					
						
							|  |  |  |     invokes its \l{QWidget::}{show()} function to display it. | 
					
						
							| 
									
										
										
										
											2009-06-17 19:01:36 +02:00
										 |  |  |     However, the widget will not be shown until the application's event | 
					
						
							| 
									
										
										
										
											2009-05-25 15:43:40 +02:00
										 |  |  |     loop is started. This is done by calling the application's | 
					
						
							|  |  |  |     \l{QApplication::}{exec()} function. Finally, the result returned by | 
					
						
							|  |  |  |     \l{QApplication::}{exec()} is used as the \c main() function's return | 
					
						
							|  |  |  |     value. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 Running the Application | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To run your application with Qt Creator, simply click, | 
					
						
							|  |  |  |     \inlineimage qtcreator-run.png. | 
					
						
							|  |  |  |     A bare bones Address Book will be displayed. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 15:35:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \section1 Qt Programming - Subclassing | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     When writing Qt programs, you usually subclass Qt objects to add | 
					
						
							| 
									
										
										
										
											2009-04-20 15:35:28 +02:00
										 |  |  |     functionality. This is one of the essential concepts behind creating custom | 
					
						
							|  |  |  |     widgets or collections of standard widgets. Subclassing to extend or change | 
					
						
							|  |  |  |     the behavior of a widget has the following advantages: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \list | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  You can write implementations of virtual or pure virtual functions | 
					
						
							|  |  |  |             to obtain exactly what you need, falling back on the base class's | 
					
						
							| 
									
										
										
										
											2009-04-20 15:35:28 +02:00
										 |  |  |             implementation when necessary. | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  It allows you to encapsulate parts of the user interface within a | 
					
						
							| 
									
										
										
										
											2009-04-20 15:35:28 +02:00
										 |  |  |             class, so that the other parts of the application do not need to | 
					
						
							|  |  |  |             know about the individual widgets in the user interface. | 
					
						
							|  |  |  |         \o  The subclass can be used to create multiple custom widgets in the | 
					
						
							|  |  |  |             same application or library, and the code for the subclass can be | 
					
						
							|  |  |  |             reused in other projects. | 
					
						
							|  |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Since Qt does not provided a specific address book widget, you subclass a | 
					
						
							| 
									
										
										
										
											2009-04-20 15:35:28 +02:00
										 |  |  |     standard Qt widget class and add features to it. The \c AddressBook class | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     you create in this tutorial can be reused in situations where a basic | 
					
						
							| 
									
										
										
										
											2009-04-20 15:35:28 +02:00
										 |  |  |     address book is needed. | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-02 10:41:35 +02:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-25 15:43:40 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | /*! | 
					
						
							|  |  |  |     \page tutorials-addressbook-sdk-part2.html | 
					
						
							|  |  |  |     \previouspage Address Book 1 - Designing the User Interface | 
					
						
							|  |  |  |     \contentspage {Address Book Tutorial}{Contents} | 
					
						
							| 
									
										
										
										
											2009-06-10 11:25:51 +02:00
										 |  |  |     \nextpage {examples/addressbook-sdk/part3}{Chapter 3} | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  |     \example examples/addressbook-sdk/part2 | 
					
						
							|  |  |  |     \title Address Book 2 - Adding Addresses | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The next step to creating our basic address book application is to allow a | 
					
						
							|  |  |  |     little bit of user interaction. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 17:26:15 +02:00
										 |  |  |     \image addressbook-tutorial-part2-add-contact.png | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You will provide a push button that the user can click to add a new | 
					
						
							|  |  |  |     contact. Also, some form of data structure is needed to store these | 
					
						
							|  |  |  |     contacts in an organized way. | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     \section1 Placing Widgets on The Form | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You can continue with the form from the last chapter; you have the | 
					
						
							|  |  |  |     labels and input fields set up, but you need to add push buttons to | 
					
						
							|  |  |  |     complete the process of adding a contact. Break the existing layouts by | 
					
						
							|  |  |  |     following the steps below: | 
					
						
							|  |  |  |     \list | 
					
						
							|  |  |  |         \o Select, \gui{Break Layout} from the context menu. You might have to | 
					
						
							|  |  |  |            do a \gui{Select All} with \key{Ctrl+A} first.. | 
					
						
							|  |  |  |         \o Add three push buttons and double-click on each of them to set | 
					
						
							|  |  |  |            their text to "Add", "Submit", and "Cancel". | 
					
						
							|  |  |  |         \o Set the \c objectName of the buttons to \c addButton, | 
					
						
							|  |  |  |            \c submitButton and \c cancelButton respectively. | 
					
						
							|  |  |  |         \o A \gui{Vertical Spacer} is required to ensure that the push buttons | 
					
						
							|  |  |  |            will be laid out neatly; drag one from the \gui{Widget Box}. | 
					
						
							|  |  |  |         \o Lay out these three push buttons and the spacer vertically, by | 
					
						
							|  |  |  |            selecting all three of them using \key{Ctrl + click} and selecting | 
					
						
							|  |  |  |            \gui{Lay out Vertically} from the context menu. Alternatively you | 
					
						
							|  |  |  |            can  use the \key{Ctrl+L} shortcut key. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |            \note Use the spacer as you do not want the buttons to be evenly | 
					
						
							|  |  |  |            spaced, but arranged closer to the top of the widget. | 
					
						
							|  |  |  |         \o The figure below shows the difference between using the spacer and | 
					
						
							|  |  |  |            not using it. | 
					
						
							|  |  |  |            \image addressbook-tutorial-part2-stretch-effects.png | 
					
						
							|  |  |  |         \o Select all the objects on the form using, \key{Ctrl+A} and lay them | 
					
						
							|  |  |  |            out in a grid. | 
					
						
							|  |  |  |         \o Lastly, set the top level widget's layout by right-clicking anywhere | 
					
						
							|  |  |  |            on the widget and selecting \gui{Lay out Horizontally} or | 
					
						
							|  |  |  |            \gui{Lay out Vertically}. | 
					
						
							|  |  |  |     \endlist | 
					
						
							| 
									
										
										
										
											2009-05-29 18:32:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-02 17:42:27 +02:00
										 |  |  |     The final design of the form is shown in the screenshot below: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \image addressbook-tutorial-part2-form-design.png | 
					
						
							| 
									
										
										
										
											2009-06-02 17:42:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 The AddressBook Class | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To ensure that the Address Book reacts to user interaction, you need to | 
					
						
							|  |  |  |     write slots for each push button that you added earlier. A slot is a | 
					
						
							|  |  |  |     function that responds to a particular signal. This concept will be | 
					
						
							|  |  |  |     discussed further in detail below. However, for an overview of Qt's signals | 
					
						
							| 
									
										
										
										
											2009-06-02 17:42:27 +02:00
										 |  |  |     and slots concept, you can refer to the \l{Signals and Slots} document. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     In the \l{examples/addressbook-sdk/part2/addressbook.h}{\c addressbook.h} | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     file, add the following code: | 
					
						
							| 
									
										
										
										
											2009-06-02 17:42:27 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.h slot definition | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 18:20:03 +02:00
										 |  |  |     Since the \c AddressBook class is a subclass of QWidget, Qt Creator | 
					
						
							| 
									
										
										
										
											2009-08-06 12:23:38 +02:00
										 |  |  |     includes QWidget in the header file. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 15:42:17 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.h include | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You need a container to store our address book contacts, so that you can | 
					
						
							| 
									
										
										
										
											2009-06-02 17:42:27 +02:00
										 |  |  |     traverse and display them. A QMap object, \c contacts, is used for this | 
					
						
							|  |  |  |     purpose as it holds a key-value pair: the contact's name as the \e key, and | 
					
						
							|  |  |  |     the contact's address as the \e value. | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 18:20:03 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.h members | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You also declare two private QString objects, \c oldName and \c oldAddress. | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     These objects are needed to hold the name and address of the contact that | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     was last displayed, before you click \gui Add. So, when you | 
					
						
							|  |  |  |     click \gui Cancel, you can revert to displaying the details of the last | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  |     contact. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-06 12:23:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     Let's move on to implementing the slots defined earlier. Within the | 
					
						
							|  |  |  |     constructor of \c AddressBook, you set up our fields by ensuring that | 
					
						
							|  |  |  |     \c nameLine and \c addressText are read-only, so that you can only display | 
					
						
							|  |  |  |     but not edit existing contact details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \note In order to prevent crashes, you need make sure that the | 
					
						
							|  |  |  |     autogenerated \c setupUi() call is always first in the constructor. | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-16 18:20:03 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.cpp setup fields | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You also hide both \c submitButton and \c cancelButton as they will only be | 
					
						
							|  |  |  |     displayed when you click \gui Add, and this is handled by the | 
					
						
							| 
									
										
										
										
											2009-07-16 18:20:03 +02:00
										 |  |  |     \c addContact() function discussed below. | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.cpp signal slot | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You connect the push buttons' \l{QAbstractButton::}{clicked()} signal to | 
					
						
							| 
									
										
										
										
											2009-06-03 11:11:43 +02:00
										 |  |  |     their respective slots. The figure below illustrates this. | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 17:26:15 +02:00
										 |  |  |     \image addressbook-tutorial-part2-signals-and-slots.png | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Finally, set the window title to "Simple Address Book" using the | 
					
						
							| 
									
										
										
										
											2009-08-06 12:23:38 +02:00
										 |  |  |     \l{QWidget::}{setWindowTitle()} function. The tr() method allows us | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     to translate user interface strings. | 
					
						
							| 
									
										
										
										
											2009-06-03 11:11:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.cpp window title | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \section2 The \c addContact() Function | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In this function, begin by storing the last displayed contact details | 
					
						
							|  |  |  |     in \c oldName and \c oldAddress. Then clear these input fields and turn | 
					
						
							|  |  |  |     off the read-only mode. The focus is set on \c nameLine and display | 
					
						
							|  |  |  |     \c submitButton and \c cancelButton; but disable \c addButton. | 
					
						
							| 
									
										
										
										
											2009-06-03 10:50:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-03 11:11:43 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.cpp addContact | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \section2 The \c submitContact() Function | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     This function can be divided into three parts: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \list 1 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  Extract the contact's detail from \c nameLine and \c addressText | 
					
						
							|  |  |  |             and store them in QString objects. Also validate to ensure that | 
					
						
							|  |  |  |             you did not click \gui Submit with empty input fields; | 
					
						
							|  |  |  |             otherwise, a QMessageBox is displayed to remind you for a name | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  |             and address. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             \snippet examples/addressbook-sdk/part2/addressbook.cpp submitContact part1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  Then proceed to check if the contact already exists. If it does | 
					
						
							|  |  |  |             not exist, add the contact to \c contacts and display a | 
					
						
							|  |  |  |             QMessageBox to inform you about this, preventing you from | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  |             adding duplicate contacts. Our \c contacts object is based on | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |             key-value pairs or name and address, hence, you want to ensure that | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  |             \e key is unique. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             \snippet examples/addressbook-sdk/part2/addressbook.cpp submitContact part2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  Once you have handled both cases mentioned above, restore the | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  |             push buttons to their normal state with the following code: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             \snippet examples/addressbook-sdk/part2/addressbook.cpp submitContact part3 | 
					
						
							|  |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     The screenshot below shows the QMessageBox object used to display | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  |     information messages to the user. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 17:52:05 +02:00
										 |  |  |     \image addressbook-tutorial-part2-add-successful.png | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \section2 The \c cancel() Function | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     This function restores the last displayed contact details and enables | 
					
						
							|  |  |  |     \c addButton, as well as hides \c submitButton and \c cancelButton. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part2/addressbook.cpp cancel | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     The general idea behind adding a contact is to give you the | 
					
						
							| 
									
										
										
										
											2009-06-03 14:24:12 +02:00
										 |  |  |     flexibility to click \gui Submit or \gui Cancel at any time. The flowchart | 
					
						
							|  |  |  |     below further explains this concept: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \image addressbook-tutorial-part2-add-flowchart.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 Running the Application | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Run your application now. You will be able to add as many unique contacts | 
					
						
							|  |  |  |     as you like. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-20 16:42:58 +02:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*! | 
					
						
							|  |  |  |     \page tutorials-addressbook-sdk-part3.html | 
					
						
							|  |  |  |     \previouspage Address Book 2 - Adding Addresses | 
					
						
							|  |  |  |     \contentspage {Address Book Tutorial}{Contents} | 
					
						
							| 
									
										
										
										
											2009-06-10 11:25:51 +02:00
										 |  |  |     \nextpage {examples/addressbook-sdk/part4}{Chapter 4} | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  |     \example examples/addressbook-sdk/part3 | 
					
						
							| 
									
										
										
										
											2009-06-10 16:24:35 +02:00
										 |  |  |     \title Address Book 3 - Navigating between Entries | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     The address book application is now half complete. You need to add some | 
					
						
							|  |  |  |     functions to navigate between contacts. But first, you have to decide what | 
					
						
							|  |  |  |     sort of a data structure you would like to use to hold these contacts. | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In Chapter 2, you used a QMap of key-value pairs with the contact's name as | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  |     the \e key, and the contact's address as the \e value. This works well for | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     your case. However, in order to navigate and display each entry, a little | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  |     bit of enhancement is needed. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Enhance the QMap by making it replicate a data structure similar to a | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  |     circularly-linked list, where all elements are connected, including the | 
					
						
							|  |  |  |     first element and the last element. The figure below illustrates this data | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     structure. | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \image addressbook-tutorial-part3-linkedlist.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     \section1 Placing Widgets on The Form | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     So far, your application allows us to add new contacts. However, you also | 
					
						
							|  |  |  |     need to traverse the existing contacts. To do so follow the steps | 
					
						
							|  |  |  |     mentioned below: | 
					
						
							|  |  |  |     \list | 
					
						
							|  |  |  |         \o Add two push buttons at the bottom of your application and name | 
					
						
							|  |  |  |            them: \gui Next and \gui Previous. | 
					
						
							|  |  |  |         \o The buttons' \c objectName should be \c nextButton and | 
					
						
							|  |  |  |            \c previousButton, respectively. | 
					
						
							|  |  |  |         \o Break your top level layout by right-clicking on \c AddressBook in | 
					
						
							|  |  |  |            the \gui{Object Inspector} and then select \gui{Lay out|Break Layout}. | 
					
						
							|  |  |  |         \o Place the \gui Next and \gui Previous buttons in a horizontal | 
					
						
							|  |  |  |            layout. | 
					
						
							|  |  |  |         \o Drag and drop the buttons together with their layout into the | 
					
						
							|  |  |  |            existing grid layout. | 
					
						
							|  |  |  |         \o Set a top level layout for the widget again. | 
					
						
							|  |  |  |     \endlist | 
					
						
							| 
									
										
										
										
											2009-06-05 12:07:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     The screenshot below illustrates what you will see as the button layout | 
					
						
							|  |  |  |     approaches the grid layout; drop it then. | 
					
						
							| 
									
										
										
										
											2009-06-05 12:07:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \image addressbook-tutorial-part3-drop-in-gridlayout.png | 
					
						
							| 
									
										
										
										
											2009-06-04 14:25:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \note Follow basic conventions for \c next() and \c previous() functions | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     by placing the \c nextButton on the right and the \c previousButton on the | 
					
						
							|  |  |  |     left. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-04 14:25:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  |     \section1 The AddressBook Class | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In order to add navigation functions to the address book application, | 
					
						
							|  |  |  |     you need to add two more slots to our \c AddressBook class: \c next() and | 
					
						
							|  |  |  |     \c previous(). | 
					
						
							| 
									
										
										
										
											2009-06-05 12:07:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part3/addressbook.h slot definition | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In the \c AddressBook constructor, you setup your fields and disable them | 
					
						
							|  |  |  |     by default. This is because navigation is only enabled when there is more | 
					
						
							|  |  |  |     than one contact in the address book. | 
					
						
							| 
									
										
										
										
											2009-06-05 12:07:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-06 12:23:38 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part3/addressbook.cpp setup fields | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Next, connect the buttons to their respective slots: | 
					
						
							| 
									
										
										
										
											2009-06-05 12:07:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part3/addressbook.cpp signal slot | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     The screenshot below is your expected graphical user interface. Notice that | 
					
						
							|  |  |  |     it is getting closer to your final application. | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-11 17:52:05 +02:00
										 |  |  |     \image addressbook-tutorial-part3-screenshot.png | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Within your \c addContact() function, you have to disable the \gui Next and | 
					
						
							|  |  |  |     \gui Previous buttons so that you do not attempt to navigate while | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     adding a contact. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part3/addressbook.cpp disable navigation | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Also, in your \c submitContact() function, enable the navigation buttons, | 
					
						
							|  |  |  |     depending on the size of \c contacts. As mentioned earlier, navigation is | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     only enabled when there is more than one contact in the address book. The | 
					
						
							|  |  |  |     following lines of code demonstrates how to do this: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part3/addressbook.cpp enable navigation | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Also include these lines of code in the \c cancel() function. | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Recall that you intend to emulate a circularly-linked list with your QMap | 
					
						
							|  |  |  |     object, \c contacts. So in the \c next() function, obtain an iterator | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     for \c contacts and then: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \list | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o If the iterator is not at the end of \c contacts, increment it by | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |            one. | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o If the iterator is at the end of \c contacts, move it to the | 
					
						
							|  |  |  |            beginning of \c contacts. This gives an illusion that our QMap | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |            is working like a circularly-linked list. | 
					
						
							|  |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part3/addressbook.cpp next | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Once you have iterated to the current object in \c contacts, display its | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     contents on \c nameLine and \c addressText. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Similarly, for the \c previous() function, obtain an iterator for | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     \c contacts and then: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \list | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  If the iterator is at the end of \c contacts, clear the display | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |             and return. | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  If the iterator is at the beginning of \c contacts, move it to | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |             the end. | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o  Then decrement the iterator by one. | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     \endlist | 
					
						
							| 
									
										
										
										
											2009-06-05 12:07:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-05 12:31:14 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part3/addressbook.cpp previous | 
					
						
							| 
									
										
										
										
											2009-06-05 12:07:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Again, display the contents of the current object in \c contacts. | 
					
						
							| 
									
										
										
										
											2009-06-04 14:25:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-03 17:00:30 +02:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-24 16:36:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | /*! | 
					
						
							|  |  |  |     \page tutorials-addressbook-sdk-part4.html | 
					
						
							|  |  |  |     \previouspage Address Book 3 - Navigating between Entries | 
					
						
							|  |  |  |     \contentspage {Address Book Tutorial}{Contents} | 
					
						
							| 
									
										
										
										
											2009-06-10 11:25:51 +02:00
										 |  |  |     \nextpage {examples/addressbook-sdk/part5}{Chapter 5} | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     \example examples/addressbook-sdk/part4 | 
					
						
							| 
									
										
										
										
											2009-06-10 16:24:35 +02:00
										 |  |  |     \title Address Book 4 - Editing and Removing Addresses | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     This chapter looks at ways to modify the contents of contacts stored | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     in the address book application. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \image addressbook-tutorial-part4-screenshot.png | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     You now have an address book that not only holds contacts in an organized | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     manner, but also allows navigation. It would be convenient to include edit | 
					
						
							|  |  |  |     and remove functions so that a contact's details can be changed when | 
					
						
							|  |  |  |     needed. However, this requires a little improvement, in the form of enums. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In our previous chapters, you had two modes: \c AddingMode and | 
					
						
							|  |  |  |     \c NavigationMode - but they were not defined as enums. Instead, you | 
					
						
							|  |  |  |     enabled and disabled the corresponding buttons manually, resulting in | 
					
						
							|  |  |  |     multiple lines of repeated code. | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In this chapter, define the \c Mode enum with three different values: | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     \list | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |         \o \c{NavigationMode} | 
					
						
							|  |  |  |         \o \c{AddingMode} | 
					
						
							|  |  |  |         \o \c{EditingMode} | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     \endlist | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     \section1 Placing Widgets on The Form | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To edit and remove contacts, you need two push buttons. Drag them and name | 
					
						
							| 
									
										
										
										
											2009-06-05 17:57:47 +02:00
										 |  |  |     them accordingly. Their \c objectName properties should be \c editButton | 
					
						
							|  |  |  |     and \c removeButton, respectively. The quickest way to place these two | 
					
						
							|  |  |  |     buttons into our existing layout, is to simply drag and drop them. Use the | 
					
						
							|  |  |  |     screenshot below as a guide: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \image addressbook-tutorial-part4-drop-in-gridlayout.png | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     \section1 The AddressBook Class | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Update the header file to contain the \c Mode enum: | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.h enum | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Also add two new slots, \c editContact() and \c removeContact(), to your | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     current list of public slots. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.h slot definition | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In order to switch between modes, introduce the \c updateInterface() | 
					
						
							| 
									
										
										
										
											2009-07-20 12:42:06 +02:00
										 |  |  |     function to control the enabling and disabling of all push buttons. | 
					
						
							| 
									
										
										
										
											2009-06-05 17:57:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-05 16:25:57 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.h updateInterface | 
					
						
							| 
									
										
										
										
											2009-06-05 17:57:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Lastly, declare \c currentMode to keep track of the enum's current mode. | 
					
						
							| 
									
										
										
										
											2009-06-05 17:57:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.h current mode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Let's begin by implementing the mode-changing features of the address book | 
					
						
							| 
									
										
										
										
											2009-07-20 12:42:06 +02:00
										 |  |  |     application. The \c editButton and \c removeButton are disabled by default, | 
					
						
							|  |  |  |     as the address book starts up with zero contacts in memory. | 
					
						
							| 
									
										
										
										
											2009-06-05 17:57:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp extract objects | 
					
						
							| 
									
										
										
										
											2009-06-05 17:57:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     These buttons are then connected to their respective slots, | 
					
						
							|  |  |  |     \c editContact() and \c removeContact. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp signal slot | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Now look at the \c editContact() and \c removeContact() functions in | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     detail. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \section2 The \c editContact() Function | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     This function stores the contact's old details in \c oldName and | 
					
						
							|  |  |  |     \c oldAddress, before switching the mode to \c EditingMode. In this mode, | 
					
						
							|  |  |  |     the \c submitButton and \c cancelButton are both enabled. Hence, the user | 
					
						
							|  |  |  |     can change the contact's details and click either button. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp editContact | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Since you will reuse the \c submitButton for both: adding a new contact and | 
					
						
							|  |  |  |     editing an existing contact, you need to modify our existing | 
					
						
							|  |  |  |     \c submitContact() function. So, divide it in two with an \c{if-else} | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     statement. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     First, check \c currentMode to see if it is in \c AddingMode. If it is, | 
					
						
							|  |  |  |     proceed with your adding process. | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp submitContact part1 | 
					
						
							|  |  |  |     \dots | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp submitContact part2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Otherwise, check to see if \c currentMode is in \c EditingMode. If it | 
					
						
							|  |  |  |     is, compare \c oldName with \c name. If the name has changed, remove | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     the old contact from \c contacts and insert the newly updated contact. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp submitContact part3 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     If only the contact's address has changed, that is the \c oldAddress is | 
					
						
							|  |  |  |     not the  same as \c address, update the contact's address. Lastly, set | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     \c currentMode to \c NavigationMode. This is an important step as it | 
					
						
							|  |  |  |     re-enables all the disabled push buttons. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To remove a contact from the address book, implement the | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     \c removeContact() function. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp removeContact | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This function first checks to see if the contact exists in \c contacts. If | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     it does, display a QMessageBox, to confirm the removal with the user. | 
					
						
							|  |  |  |     Once the user has confirmed, call \c previous() to ensure that the | 
					
						
							|  |  |  |     user interface shows another contact, and remove the contact using | 
					
						
							|  |  |  |     \l{QMap}'s \l{QMap::}{remove()} function. As a courtesy, display a | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     QMessageBox to inform the user. Both the message boxes used in this | 
					
						
							|  |  |  |     function are shown below: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \image addressbook-tutorial-part4-confirm.png | 
					
						
							|  |  |  |     \image addressbook-tutorial-part4-remove.png | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \section2 The \c updateInterface() Function | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     This function is mentioned earlier as a means to enable and disable the | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     push buttons, depending on the current mode. The function updates the | 
					
						
							|  |  |  |     current mode according to the \c mode argument passed to it, assigning it | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     to \c currentMode, before checking its value. | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Each of the push buttons is then enabled or disabled, depending on the | 
					
						
							|  |  |  |     current mode. The code for \c AddingMode and \c EditingMode is shown below: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp updateInterface part1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     For \c NavigationMode, however, include conditions within the parameters | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     of the QPushButton::setEnabled() function. This is to ensure that | 
					
						
							|  |  |  |     \c editButton and \c removeButton are enabled when there is at least one | 
					
						
							|  |  |  |     contact in the address book; \c nextButton and \c previousButton are only | 
					
						
							|  |  |  |     enabled when there is more than one contact in the address book. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp updateInterface part2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     By performing the task of setting the mode and updating the user interface | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     in the same function, you avoid the possibility of the user interface | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     getting "out of sync" with the internal state of the application. | 
					
						
							| 
									
										
										
										
											2009-06-05 17:57:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To maintain consistency, you need to modify our \c addContact() and | 
					
						
							| 
									
										
										
										
											2009-06-08 17:17:20 +02:00
										 |  |  |     \c cancel() functions respectively. Below is the code: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp addContact | 
					
						
							|  |  |  |     \dots | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part4/addressbook.cpp cancel | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*! | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     \page tutorials-addressbook-sdk-part5.html | 
					
						
							|  |  |  |     \previouspage Address Book 4 - Editing and Removing Addresses | 
					
						
							|  |  |  |     \contentspage {Address Book Tutorial}{Contents} | 
					
						
							| 
									
										
										
										
											2009-06-10 11:25:51 +02:00
										 |  |  |     \nextpage {examples/addressbook-sdk/part6}{Chapter 6} | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  |     \example examples/addressbook-sdk/part5 | 
					
						
							| 
									
										
										
										
											2009-06-10 16:24:35 +02:00
										 |  |  |     \title Address Book 5 - Adding a Find Function | 
					
						
							| 
									
										
										
										
											2009-06-05 16:25:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     This chapter looks at ways to locate contacts and addresses in the | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  |     address book application. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part5-screenshot.png | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     As you keep adding contacts to your address book, it becomes tedious to | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  |     navigate them with the \gui Next and \gui Previous buttons. In this case, | 
					
						
							|  |  |  |     a \gui Find function would be more efficient in looking up contacts. The | 
					
						
							|  |  |  |     screenshot above shows the \gui Find button and its position on the panel | 
					
						
							|  |  |  |     of buttons. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     When you click on the \gui Find button, it is useful to display a | 
					
						
							| 
									
										
										
										
											2009-07-21 18:15:51 +02:00
										 |  |  |     dialog prompting the user for a contact's name. Qt provides QDialog, which | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     you subclass in this chapter, to implement a FindDialog class. | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 15:42:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 15:57:45 +02:00
										 |  |  |     \section1 Designing The FindDialog | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part5-finddialog-in-designer.png | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Begin by adding a new \c{.ui} file and a corresponding class to our | 
					
						
							|  |  |  |     project. Right click on your project and select | 
					
						
							|  |  |  |     \gui{Add New...} > \gui{Qt} > \gui{Qt Designer Form Class}. | 
					
						
							|  |  |  |     In the \gui{Qt Designer Form Class} dialog, select | 
					
						
							|  |  |  |     \e{Dialog without buttons}. Name the class \c{FindDialog} and add the files | 
					
						
							|  |  |  |     it to your project. Open your new form in the \QD form editor within | 
					
						
							|  |  |  |     Qt Creator by double-clicking on the \c{finddialog.ui} file in | 
					
						
							|  |  |  |     the \gui{Project Sidebar}. | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To replicate the screenshot above, you need a label, a line edit, and a push | 
					
						
							| 
									
										
										
										
											2009-06-08 17:35:08 +02:00
										 |  |  |     button. Drag these onto your form. Set their text accordingly and name them | 
					
						
							|  |  |  |     \c label, \c lineEdit, and \c findButton, respectively. Place these widgets | 
					
						
							|  |  |  |     in a horizontal layout. Then set a top level layout - either horizontal or | 
					
						
							|  |  |  |     vertical. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 15:42:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 15:57:45 +02:00
										 |  |  |     \section1 Implementing The FindDialog Class | 
					
						
							| 
									
										
										
										
											2009-06-24 17:32:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Let's look at \c{FindDialog}'s header file. Define a public function, | 
					
						
							| 
									
										
										
										
											2009-07-21 18:15:51 +02:00
										 |  |  |     \c findText(), to be used by classes that instantiate \c FindDialog. This | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     function allows the classes to obtain the search string entered by | 
					
						
							|  |  |  |     you. A public slot, \c findClicked(), is also defined to handle the | 
					
						
							|  |  |  |     search string when you click the \gui Find button. | 
					
						
							| 
									
										
										
										
											2009-06-24 17:32:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 18:15:51 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part5/finddialog.h findText | 
					
						
							| 
									
										
										
										
											2009-06-30 15:42:17 +02:00
										 |  |  |     \dots | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part5/finddialog.h findClicked | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 18:15:51 +02:00
										 |  |  |     Now, lets look at our constructor in the \c{finddialog.cpp} file. | 
					
						
							| 
									
										
										
										
											2009-06-30 15:42:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part5/finddialog.cpp constructor | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     In \c findClicked(), validate to ensure that you did not click the | 
					
						
							|  |  |  |     \gui Find button without entering a contact's name. Then, set | 
					
						
							| 
									
										
										
										
											2009-06-30 15:42:17 +02:00
										 |  |  |     \c findText to the search string, extracted from \c lineEdit. After that, | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     clear the contents of \c lineEdit and hide the dialog. | 
					
						
							| 
									
										
										
										
											2009-06-24 17:32:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 15:42:17 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part5/finddialog.cpp findClicked | 
					
						
							| 
									
										
										
										
											2009-06-30 15:57:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \c findText() is public, which makes it easy for classes instantiating | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     and using \c FindDialog to access the search string that you have entered | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     and accepted. | 
					
						
							| 
									
										
										
										
											2009-06-30 15:57:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-04 14:15:15 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part5/finddialog.cpp findText | 
					
						
							| 
									
										
										
										
											2009-06-30 15:57:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Finally, connect your signals to their respective slots. Notice that | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \c{findButton}'s \l{QPushButton::}{clicked()} signal is connected to | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \c findClicked(), which calls \l{QDialog::}{accept()} or | 
					
						
							|  |  |  |     \l{QDialog::}{reject()}. The \l{QDialog::}{accept()} slot provided by | 
					
						
							|  |  |  |     QDialog hides the dialog and sets the result code to | 
					
						
							|  |  |  |     \l{QDialog::}{Accepted}, while \l{QDialog::}{reject()} | 
					
						
							|  |  |  |     sets it to \l{QDialog::}{Rejected} accordingly. Use this function to help | 
					
						
							|  |  |  |     \c{AddressBook}'s \c findContact() function know when the \c FindDialog | 
					
						
							|  |  |  |     object has been closed. This logic will be explained in further detail | 
					
						
							|  |  |  |     when discussing the \c findContact() function. | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \image addressbook-tutorial-part5-signals-and-slots.png | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 15:57:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \section1 The AddressBook Class | 
					
						
							| 
									
										
										
										
											2009-06-30 16:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To ensure that you can use \c FindDialog from within your \c AddressBook | 
					
						
							|  |  |  |     class, include \c finddialog.h in the \c addressbook.h file. | 
					
						
							| 
									
										
										
										
											2009-06-30 16:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part5/addressbook.h include | 
					
						
							| 
									
										
										
										
											2009-06-30 16:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     So far, all your address book features have a QPushButton and a | 
					
						
							|  |  |  |     corresponding slot. Similarly, the \gui Find feature, has | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \c{ui->findButton} and \c findContact(). | 
					
						
							| 
									
										
										
										
											2009-06-30 16:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-02 11:25:33 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part5/addressbook.h slot definition | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Once you have instantiated a dialog, you might want to use it more than | 
					
						
							|  |  |  |     once; using a private variable allows you to refer to it from more than one | 
					
						
							|  |  |  |     place in the class. | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Within the \c AddressBook class's constructor, connect the | 
					
						
							| 
									
										
										
										
											2009-08-04 14:15:15 +02:00
										 |  |  |     \c{findButton}'s \l{QPushButton::}{clicked()} signal to \c findContact(). | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part5/addressbook.cpp signal slot | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Now, all that is left is the code for our \c findContact() function: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part5/addressbook.cpp findContact | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Start out by displaying the \c FindDialog instance, \c dialog. This is | 
					
						
							|  |  |  |     when you enter a contact name to look up. Once you click the | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  |     dialog's \c findButton, the dialog is hidden and the result code is set to | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     either QDialog::Accepted or QDialog::Rejected by the FindDialog's | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     \c findClicked() method. This ensures that you only search for a contact | 
					
						
							|  |  |  |     if you have typed something in the FindDialog's line edit. | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Then proceed to extract the search string, which in this case is | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \c contactName, using \c{FindDialog}'s \c findText() function. If the | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     contact exists in our address book, display it immediately. Otherwise, | 
					
						
							|  |  |  |     display the QMessageBox shown below to indicate that their search | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  |     failed. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part5-dialogbox.png | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     The concept behind finding a contact only applies for cases where you have | 
					
						
							|  |  |  |     more than two contacts in our address book. Hence, implement this | 
					
						
							|  |  |  |     behavior by modifying our \c{Navigation Mode} within your | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  |     \c updateInterface() function, by only enabling the \gui Find button when | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     you have more than two contacts. | 
					
						
							| 
									
										
										
										
											2009-06-30 16:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 14:04:05 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part5/addressbook.cpp enable | 
					
						
							| 
									
										
										
										
											2009-06-30 16:57:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-24 16:36:58 +02:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-24 16:36:58 +02:00
										 |  |  | /*! | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     \page tutorials-addressbook-sdk-part6.html | 
					
						
							|  |  |  |     \previouspage Address Book 5 - Adding a Find Function | 
					
						
							|  |  |  |     \contentspage {Address Book Tutorial}{Contents} | 
					
						
							| 
									
										
										
										
											2009-06-10 11:25:51 +02:00
										 |  |  |     \nextpage {examples/addressbook-sdk/part7}{Chapter 7} | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     \example examples/addressbook-sdk/part6 | 
					
						
							| 
									
										
										
										
											2009-06-10 16:24:35 +02:00
										 |  |  |     \title Address Book 6 - Loading and Saving | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     This chapter covers the file handling features of Qt that is used to write | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     loading and saving routines for the address book application. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part6-screenshot.png | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Although browsing and searching for contacts are useful features, your | 
					
						
							|  |  |  |     address book is not really ready for use until you can save existing | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     contacts and load them again at a later time. Qt provides a number of | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     classes for \l{Input/Output and Networking}{input and output}, but you have | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     chosen to use two which are simple to use in combination: QFile and | 
					
						
							|  |  |  |     QDataStream. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     A QFile object represents a file on disk that can be read from and written | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     to. QFile is a subclass of the more general QIODevice class which represents | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     many different kinds of devices. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     A QDataStream object is used to serialize binary data so that it can be | 
					
						
							|  |  |  |     stored in a QIODevice and retrieved again later. Reading from a QIODevice | 
					
						
							|  |  |  |     and writing to it is as simple as opening the stream - with the respective | 
					
						
							|  |  |  |     device as a parameter - and reading from or writing to it. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-13 13:24:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  |     \section1 Placing Widgets on The Form | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To load and save files containing contact details, you need two push | 
					
						
							| 
									
										
										
										
											2009-07-13 13:24:54 +02:00
										 |  |  |     buttons. Drag them and name them accordingly. Their \c objectName | 
					
						
							|  |  |  |     properties should be \c loadButton and \c saveButton, respectively. Then, | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     similar to \l{Address Book 5 - Adding a Find Function}{Chapter 5}, place | 
					
						
							| 
									
										
										
										
											2009-07-13 13:24:54 +02:00
										 |  |  |     these buttons in our layout simply by dragging and dropping them. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     The \c text property of our push buttons are \gui{Load...} and | 
					
						
							|  |  |  |     \gui{Save...} respectively. Ideally, it would be more user-friendly to set | 
					
						
							|  |  |  |     the push buttons' labels to \gui{Load contacts from file} and | 
					
						
							|  |  |  |     \gui{Save contacts to file}. However, due to the size of our push buttons, | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     set the labels to \gui{Load...} and \gui{Save...} instead. | 
					
						
							| 
									
										
										
										
											2009-07-22 21:09:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Fortunately, Qt Creator's \QD plugin provides a simple way to set tooltips | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     with the \c toolTip property. So, set your buttons' tooltips to | 
					
						
							| 
									
										
										
										
											2009-07-22 21:09:58 +02:00
										 |  |  |     \gui{Load contacts from file} and \gui{Save contacts to file} respectively. | 
					
						
							|  |  |  |     To test your tooltip, use \key{Ctrl+Alt+R} and hover your mouse cursor on | 
					
						
							|  |  |  |     the push buttons. | 
					
						
							| 
									
										
										
										
											2009-07-13 13:24:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part6-propertyeditor.png | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 The AddressBook Class | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Declare two public slots, \c saveToFile() and \c loadFromFile(). | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-22 21:09:58 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.h slot definition | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     Now lets look at the \c saveToFile() and \c loadFromFile() functions in | 
					
						
							|  |  |  |     detail. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section2 The \c saveToFile() Function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To save a contact, first obtain \c fileName using | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     QFileDialog::getSaveFileName(). This is a convenience function provided by | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     QFileDialog, which pops up a modal file dialog and allows you to enter | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     a file name or select any existing \c{.abk} file. The \c{.abk} file is our | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Address Book extension that you create when you save contacts. | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.cpp saveToFile part1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-22 19:52:28 +02:00
										 |  |  |     The file dialog that pops up is displayed in the screenshot below: | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part6-savedialog.png | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     If \c fileName is not empty, create a QFile object, \c file, with | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \c fileName. The QFile object works with QDataStream as QFile is a | 
					
						
							|  |  |  |     QIODevice. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Next, attempt to open the file in \l{QIODevice::}{WriteOnly} mode. If | 
					
						
							|  |  |  |     this is unsuccessful, display a QMessageBox to inform the user. | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.cpp saveToFile part2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Otherwise, instantiate a QDataStream object, \c out, to write the open | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     file. QDataStream requires that the same version of the stream is used for | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     reading and writing. Ensure that this is the case by setting the version | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     used to the version introduced with Qt 4.5 before serializing the data into | 
					
						
							|  |  |  |     \c file. | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.cpp saveToFile part3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section2 The \c loadFromFile() Function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To load a contact, also obtain \c fileName using | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     QFileDialog::getOpenFileName(). This function, the counterpart to | 
					
						
							|  |  |  |     QFileDialog::getSaveFileName(), also pops up the modal file dialog and | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     allows you to enter a file name or select any existing \c{.abk} file | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     to load it into the address book. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.cpp loadFromFile part1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     On Windows, for example, this function pops up a native file dialog, as | 
					
						
							|  |  |  |     shown in the following screenshot. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part6-opendialog.png | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     If \c fileName is not empty, again, use a QFile object, \c file, and | 
					
						
							|  |  |  |     attempt to open it in \l{QIODevice::}{ReadOnly} mode. Similar to your | 
					
						
							|  |  |  |     implementation of \c saveToFile(), if this attempt is unsuccessful, | 
					
						
							| 
									
										
										
										
											2009-07-07 13:37:33 +02:00
										 |  |  |     display a QMessageBox to inform the user. | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.cpp loadFromFile part2 | 
					
						
							| 
									
										
										
										
											2009-07-07 13:37:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Otherwise, instantiate a QDataStream object, \c in, set its version as | 
					
						
							| 
									
										
										
										
											2009-07-07 13:37:33 +02:00
										 |  |  |     above and read the serialized data into hte \c contacts data structure. The | 
					
						
							|  |  |  |     \c contacs object is emptied before data is read into it to simplify the | 
					
						
							|  |  |  |     file reading process. A more advanced method would be to read the contacts | 
					
						
							|  |  |  |     into a temporary QMap object, and copy over non-duplicate contacts into | 
					
						
							|  |  |  |     \c contacts. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-06 15:40:48 +02:00
										 |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.cpp loadFromFile part3 | 
					
						
							| 
									
										
										
										
											2009-07-01 16:47:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     To display the contacts that have been read from the file, you must first | 
					
						
							|  |  |  |     validate the data obtained to ensure that the file you read from actually | 
					
						
							|  |  |  |     contains address book contacts. If it does, display the first contact; | 
					
						
							|  |  |  |     otherwise, display a QMessageBox to inform you about the problem. | 
					
						
							|  |  |  |     Lastly, connect the \c clicked() signal of the push buttons | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     with the \c loadFromFile() and \c saveToFile(): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \snippet examples/addressbook-sdk/part6/addressbook.cpp connectSlots | 
					
						
							| 
									
										
										
										
											2009-07-07 13:37:33 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-24 16:36:58 +02:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-24 16:36:58 +02:00
										 |  |  | /*! | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  |     \page tutorials-addressbook-sdk-part7.html | 
					
						
							|  |  |  |     \previouspage Address Book 6 - Loading and Saving | 
					
						
							|  |  |  |     \contentspage {Address Book Tutorial}{Contents} | 
					
						
							|  |  |  |     \example examples/addressbook-sdk/part7 | 
					
						
							| 
									
										
										
										
											2009-06-10 16:24:35 +02:00
										 |  |  |     \title Address Book 7 - Additional Features | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Although your address book application is useful in its own right, it would | 
					
						
							|  |  |  |     be useful if you could exchange contact data with other applications. The | 
					
						
							| 
									
										
										
										
											2009-07-07 17:10:45 +02:00
										 |  |  |     vCard format is a popular file format that can be used for this purpose. In | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     this chapter, you extend our address book client to allow contacts to be | 
					
						
							| 
									
										
										
										
											2009-07-07 17:10:45 +02:00
										 |  |  |     exported to vCard \c{.vcf} files. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     \section1 Placing Widgets on The Form | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Add a push button into our layout by dragging and dropping it in, with | 
					
						
							| 
									
										
										
										
											2009-07-22 21:09:58 +02:00
										 |  |  |     \c exportButton as its \c objectName. The \c toolTip property is set to | 
					
						
							|  |  |  |     \gui{Export as vCard}. | 
					
						
							| 
									
										
										
										
											2009-07-22 20:02:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-12 14:29:40 +02:00
										 |  |  |     \image addressbook-tutorial-part7-screenshot.png | 
					
						
							| 
									
										
										
										
											2009-07-13 13:24:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-07 17:10:45 +02:00
										 |  |  |     \section1 The AddressBook Class | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Declare a public slot, \c exportAsVCard(), in your header file. | 
					
						
							| 
									
										
										
										
											2009-07-22 20:02:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-08 14:54:13 +05:30
										 |  |  |     Within the \c AddressBook constructor, connect \c{exportButton}'s | 
					
						
							| 
									
										
										
										
											2009-07-22 20:02:57 +02:00
										 |  |  |     \l{QPushButton::}{clicked()} signal to \c exportAsVCard(). | 
					
						
							| 
									
										
										
										
											2009-06-08 16:02:34 +02:00
										 |  |  | */ |