summaryrefslogtreecommitdiffstats
path: root/doc/application-walkthrough.doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/application-walkthrough.doc')
-rw-r--r--doc/application-walkthrough.doc435
1 files changed, 435 insertions, 0 deletions
diff --git a/doc/application-walkthrough.doc b/doc/application-walkthrough.doc
new file mode 100644
index 000000000..e3a5aa6a8
--- /dev/null
+++ b/doc/application-walkthrough.doc
@@ -0,0 +1,435 @@
+/****************************************************************************
+**
+** Application example documentation
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the Qt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing retquirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.QPL
+** included in the packaging of this file. Licensees holding valid Qt
+** Commercial licenses may use this file in accordance with the Qt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+/*!
+\page simple-application.html
+
+\ingroup step-by-step-examples
+
+\title Walkthrough: A Simple Application
+
+This walkthrough shows simple use of \l QMainWindow, \l QMenuBar, \l
+QPopupMenu, \l QToolBar and \l QStatusBar - classes that every
+modern application window tends to use. (See also \link tutorial2.html
+Tutorial #2\endlink.)
+
+It also illustrates some aspects of \l QWhatsThis (for simple help) and a
+typical \c main() using \l QApplication.
+
+Finally, it shows a typical print function based on \l QPrinter.
+
+\section1 The declaration of ApplicationWindow
+
+Here's the header file in full:
+
+\include application/application.h
+
+It declares a class that inherits \l QMainWindow, with slots and private
+variables. The class pre-declaration of \l QTextEdit at the beginning
+(instead of an include) helps to speed up compilation. With this
+trick, \c{make depend} won't insist on recompiling every \c .cpp file that
+includes \c application.h when \c qtextedit.h changes.
+
+\target simplemain
+\section1 A simple main()
+
+Here is \c main.cpp in full:
+
+\include application/main.cpp
+
+Now we'll look at \c main.cpp in detail.
+
+\quotefile application/main.cpp
+\skipto argc
+\printline argc
+\printline QApplication
+
+With the above line, we create a QApplication object with the usual
+constructor and let it
+parse \e argc and \e argv. QApplication itself takes care of X11-specific
+command-line options like \e -geometry, so the program will automatically
+behave the way X clients are expected to.
+
+\printline ApplicationWindow
+\printline setCaption
+\printline show
+
+We create an \e ApplicationWindow as a top-level widget, set its window
+system caption to "Document 1", and \e show() it.
+
+\target close
+\printline connect
+
+When the application's last window is closed, it should tquit. Both
+the signal and the slot are predefined members of QApplication.
+
+\printline exec
+
+Having completed the application's initialization, we start the main
+event loop (the GUI), and eventually return the error code
+that QApplication returns when it leaves the event loop.
+
+\printline }
+
+\target ApplicationWindow
+\section1 The Implementation of ApplicationWindow
+
+\quotefile application/application.cpp
+
+Since the implementation is tquite large (almost 300 lines) we
+won't list the whole thing. (The source code is included in the
+examples/application directory.) Before we start with the constructor
+there are three \c{#include}s worth mentioning:
+
+\skipto "filesave.xpm"
+\printuntil "fileprint.xpm"
+
+The tool buttons in our application wouldn't look good without icons!
+These icons can be found in the XPM files included above. If you ever
+moved a program to a different location and wondered why icons were
+missing afterwards you will probably agree that it is a good idea to
+compile them into the binary. This is what we are doing here.
+
+\skipto ApplicationWindow::ApplicationWindow
+\printline ApplicationWindow::ApplicationWindow
+\printuntil {
+
+\e ApplicationWindow inherits QMainWindow, the Qt class that provides
+typical application main windows, with menu bars, toolbars, etc.
+
+\printuntil QPrinter
+
+The application example can print things, and we chose to have a
+QPrinter object lying around so that when the user changes a setting
+during one printing, the new setting will be the default next time.
+
+\printline QPixmap
+
+For the sake of simplicity, our example only has a few commands in the
+toolbar. The above variables are used to hold an icon for each of
+them.
+
+\printline QToolBar
+
+We create a toolbar in \e this window ...
+
+\printline "File Operations"
+
+... and define a title for it. When a user drags the toolbar out of
+its location and floats it over the desktop, the toolbar-window will
+show "File Operations" as caption.
+
+\printline fileopen
+\printuntil SLOT(choose())
+
+Now we create the first tool button for the \e fileTools toolbar
+with the appropriate icon and the tool-tip text "Open File".
+The \c fileopen.xpm we included at the beginning
+contains the definition of a pixmap called \e fileopen.
+We use this icon to illustrate our first tool button.
+
+\printuntil SLOT(print())
+
+In a similar way we create two more tool buttons in this toolbar, each with
+appropriate icons and tool-tip text. All three buttons are connected
+to appropriate slots in this object; for example, the "Print File" button
+to \link #printer ApplicationWindow::print()\endlink.
+
+\printline whatsThisButton
+
+The fourth button in the toolbar is somewhat peculiar: it's the one that
+provides "What's This?" help. This must be set up using a special
+function, as its mouse interface is unusual.
+
+\printuntil fileOpenText )
+
+With the above line we add the "What's This?" help-text to the
+\e fileOpen button...
+
+\printline openIcon
+
+... and tell the rich-text engine that when a help-text (like the one
+saved in \e fileOpenText) requests an image named "fileopen", the \e
+openIcon pixmap is used.
+
+\printuntil fileSaveText )
+\printuntil filePrintText )
+
+The "What's This?" help of the remaining two buttons doesn't make use
+of pixmaps, therefore all we need to do is to add the help-text to the
+button. Be careful though: To invoke the rich-text elements in \c
+fileSaveText(), the entire string must be surrounded by \<p\> and
+\</p\>. In \c filePrintText(), we don't have rich-text elements, so
+this is not necessary.
+
+\printuntil &File
+
+Next we create a \l QPopupMenu for the \e File menu and
+add it to the menu bar. With the ampersand in front of the letter F,
+we allow the user to use the shortcut \e Alt+F to pop up this menu.
+
+\printline &New
+
+Its first entry is connected to the (yet to be implemented) slot \c
+newDoc(). When the user chooses this \e New entry (e.g. by typing the
+letter N as marked by the ampersand) or uses the
+\e Ctrl+N accelerator, a new editor-window will pop up.
+
+\printuntil &Open
+\printuntil &Save
+\printuntil Save &As
+\printuntil fileSaveText
+
+We populate the \e File menu with three more commands (\e Open, \e Save and
+\e{Save As}), and set "What's This?" help for them. Note in particular
+that "What's This?" help and pixmaps are used in both the toolbar (above)
+and the menu bar (here). (See QAction and the \c examples/action
+example for a shorter and easier approach.)
+
+\printline insertSeparator(
+
+Then we insert a separator, ...
+
+\printline &Print
+\printuntil &Close
+\printline &Quit
+
+... the \e Print command with "What's This?" help, another separator and
+two more commands (\e Close and \e Quit) without "What's This?" and pixmaps.
+In case of the \e Close command, the signal is connected
+to the \e close() slot of the respective \e ApplicationWindow object whilst
+the \e Quit command affects the entire application.
+
+Because \e ApplicationWindow is a QWidget, the \e close() function
+triggers a call to \link #closeEvent closeEvent()\endlink which we
+will implement later.
+
+\target common_constructor
+\printline insertSeparator
+
+Now that we have done the File menu we shift our focus back to the
+menu bar and insert a separator. From now on further menu bar entries
+will be aligned to the right if the windows system style retquires it.
+
+\printline help
+\printuntil whatsThis
+
+We create a \e Help menu, add it to the menu bar, and insert a few
+commands. Depending on the style it will appear on the right hand
+side of the menu bar or not.
+
+\printline QTextEdit
+\printline setFocus
+\printline setCentralWidget
+
+Now we create a simple text-editor, set the initial focus to it,
+and make it the window's central widget.
+
+\l QMainWindow::centralWidget() is the heart of the entire application:
+It's what menu bar, statusbar and toolbars are all arranged around. Since
+the central widget is a text editing widget, we can now reveal that
+our simple application is a text editor. :)
+
+\printline "Ready"
+
+We make the statusbar say "Ready" for two seconds at startup, just to
+tell the user that the window has finished initialization and can be
+used.
+
+\printline resize
+
+Finally it's time to resize the new window to a a nice default size.
+
+\printline }
+
+We have now finished with the constructor. Now we'll deal with the
+destructor.
+
+\printline ::~
+\printuntil }
+
+The only thing an \e ApplicationWindow widget needs to do in its
+destructor is to delete the printer it created. All other objects are
+child widgets, which Qt will delete when appropriate.
+
+Now our task is to implement all the slots mentioned in the header file
+and used in the constructor.
+
+\target newDoc()
+\printline ::newDoc
+\printuntil }
+
+This slot, connected to the \e{File|New} menu item, simply creates a
+new \e ApplicationWindow and shows it.
+
+\target choose()
+\printline ::choose
+\printuntil getOpenFileName
+\printuntil }
+
+The \e choose() slot is connected to the \e Open menu item and
+tool button. With a little help from \l QFileDialog::getOpenFileName(), it
+asks the user for a file name and then either loads that file or gives an
+error message in the statusbar.
+
+\printline ::load
+\printuntil statusBar
+\printline }
+
+This function loads a file into the editor. When it's done, it sets the
+window system caption to the file name and displays a success message in
+the statusbar for two seconds. With files that exist but are not
+readable, nothing happens.
+
+\target save()
+\printline ::save
+\printuntil close
+
+As its name suggests, this function saves the current file. If no
+filename has been specified so far, the \link #saveAs()
+saveAs()\endlink function is called. Unwritable files cause the \e
+ApplicationWindow object to provide an error-message in the statusbar.
+Note that there is more than one way to do this:
+compare the above \c{statusBar()->message()} line with the equivalent
+code in the \c load() function.
+
+\printline setModified
+
+Tell the editor that the contents haven't been edited since the last
+save. When the user does some further editing and wishes to close the
+window without explicit saving, \link #closeEvent
+ApplicationWindow::closeEvent()\endlink will ask about it.
+
+\printline setCaption
+
+It may be that the document was saved under a different name than the
+old caption suggests, so we set the window caption just to be sure.
+
+\printuntil }
+
+With a message in the statusbar, we inform the user that the file
+was saved successfully.
+
+\target saveAs()
+\printline ::saveAs
+\printuntil message
+\printline }
+\printline }
+
+This function asks for a new name, saves the document under that name,
+and implicitly changes the window system caption to the new name.
+
+\target printer
+
+\skipto ::print
+\printuntil aborted
+\printuntil aborted
+\printline }
+\printline }
+
+\e print() is called by the \e{File|Print} menu item and the \e filePrint
+tool button.
+
+We present the user with the print setup dialog, and abandon printing
+if they cancel.
+
+We create a QSimpleRichText object and give it the text. This object
+is able to format the text nicely as one long page. We achieve
+pagination by printing one paper page's worth of text from the
+QSimpleRichText page at a time.
+
+
+Now let's see what happens when a user wishes to \e close()
+an \e ApplicationWindow.
+
+\target closeEvent
+\printline ::closeEvent
+\printline {
+
+This event gets to process window system close events. A close event is
+subtly different from a hide event: hide often means "iconify" whereas
+close means that the window is going away for good.
+
+\printline isModified
+\printline accept
+\printline return
+\printline }
+
+If the text hasn't been edited, we just accept the event. The window
+will be closed, and because we used the \e WDestructiveClose widget
+flag in the \link #ApplicationWindow <i>ApplicationWindow()</i> constructor\endlink,
+the widget will be deleted.
+
+\printline QMessageBox
+\printuntil {
+
+Otherwise we ask the user: What do you want to do?
+
+\printuntil break
+
+If they want to save and then exit, we do that.
+
+\printuntil break
+
+If the user doesn't want to exit, we ignore the close event (there is
+a chance that we can't block it but we try).
+
+\printuntil break
+
+The last case -- the user wants to abandon the edits and exit -- is very
+simple.
+
+\printline }
+\printline }
+
+Last but not least we implement the slots used by the help menu entries.
+
+\printline ::about
+\printuntil aboutQt
+\printuntil }
+
+These two slots use ready-made "about" functions to provide some
+information about this program and the GUI toolkit it uses. (Although you
+don't need to provide an About Qt in your programs, if you use Qt for free
+we would appreciate it if you tell people what you're using.)
+
+That was all we needed to write a complete, almost useful application with
+nice help-functions, almost as good as the "editors" some computer vendors
+ship with their desktops, and in less than 300 lines of code!
+
+*/