KDE 2 Qt Programming Bible 1st Edition by Arthur Griffith ISBNinstant download
KDE 2 Qt Programming Bible 1st Edition by Arthur Griffith ISBNinstant download
https://ebookball.com/product/kde-2-qt-programming-bible-1st-
edition-by-arthur-griffith-isbn-13544/
https://ebookball.com/product/spss-for-dummies-1st-edition-by-
arthur-griffith-0470113448-978-0470113448-14694/
https://ebookball.com/product/idg-books-worldwide-1st-edition-by-
directx-3d-graphics-programming-bible-isbn-11082/
https://ebookball.com/product/c-gui-programming-with-qt-4-1st-
edition-by-jasmin-blanchette-mark-summerfield-
isbn-0131872494-9780131872493-12526/
https://ebookball.com/product/google-power-tools-bible-1st-
edition-by-ted-coombsandroderico-deleon-isbn-12306/
Hakin9 Bible 1st edition by Vikram Singh ASIN B08VNWH9D5
https://ebookball.com/product/hakin9-bible-1st-edition-by-vikram-
singh-asin-b08vnwh9d5-16838/
https://ebookball.com/product/javascript-bible-5th-edition-by-
danny-goodman-michael-morrison-isbn-9780764557439-11424/
https://ebookball.com/product/3ds-max-4-bible-1st-edition-by-
kelly-l-murdock-isbn-0764535846-9780764535840-14636/
https://ebookball.com/product/introduction-to-design-patterns-in-
c-with-qt-2nd-edition-by-alan-ezust-paul-ezust-
isbn-0132851636-9780132851633-14144/
https://ebookball.com/product/an-introduction-to-design-patterns-
in-c-with-qt-4-1st-edition-by-alan-ezust-paul-ezust-
isbn-0131879057-9780131879058-12664/
4682-1 fm.f.qc 11/20/00 15:45 Page iii
KDE 2/Qt
Programming Bible
Arthur Griffith
John Kilcullen
Chairman and CEO
IDG Books Worldwide, Inc.
IDG is the world’s leading IT media, research and exposition company. Founded in 1964, IDG had 1997 revenues of $2.05
billion and has more than 9,000 employees worldwide. IDG offers the widest range of media options that reach IT buyers
in 75 countries representing 95% of worldwide IT spending. IDG’s diverse product and services portfolio spans six key areas
including print publishing, online publishing, expositions and conferences, market research, education and training, and
global marketing services. More than 90 million people read one or more of IDG’s 290 magazines and newspapers, including
IDG’s leading global brands — Computerworld, PC World, Network World, Macworld and the Channel World family of
publications. IDG Books Worldwide is one of the fastest-growing computer book publishers in the world, with more than
700 titles in 36 languages. The “...For Dummies®” series alone has more than 50 million copies in print. IDG offers online
users the largest network of technology-specific Web sites around the world through IDG.net (http://www.idg.net), which
comprises more than 225 targeted Web sites in 55 countries worldwide. International Data Corporation (IDC) is the world’s
largest provider of information technology data, analysis and consulting, with research centers in over 41 countries and more
than 400 research analysts worldwide. IDG World Expo is a leading producer of more than 168 globally branded conferences
and expositions in 35 countries including E3 (Electronic Entertainment Expo), Macworld Expo, ComNet, Windows World
Expo, ICE (Internet Commerce Expo), Agenda, DEMO, and Spotlight. IDG’s training subsidiary, ExecuTrain, is the world’s
largest computer training company, with more than 230 locations worldwide and 785 training courses. IDG Marketing
Services helps industry-leading IT companies build international brand recognition by developing global integrated marketing
programs via IDG’s print, online and exposition products worldwide. Further information about the company can be found
at www.idg.com. 1/26/00
4682-1 fm.f.qc 11/20/00 15:45 Page vi
Credits
Acquisitions Editors Quality Control Technician
John Osborn Dina F Quan
Debra Williams Cauley
Permissions Editors
Project Editor Laura Carpenter
Kathi Duggan Laura Moss
For Mary
4682-1 fm.f.qc 11/20/00 15:45 Page viii
4682-1 fm.f.qc 11/20/00 15:45 Page ix
Preface
I f you want to write a KDE application, you’ve come to the right book.
You can find a version of the development software on the CD, which is described
in Appendix A. Alternatively, see Appendix B to find out how to get the latest ver-
sion of everything. Appendix B contains a list of all the software you will need,
and where it can be found on the Internet.
Subject to Change
KDE is large and powerful, and it is moving fast. Fortunately, it is also very friendly.
4682-1 fm.f.qc 11/20/00 15:45 Page x
x Preface
Because KDE is an ongoing project, new things are being added constantly. This will
likely be the situation for the foreseeable future. Because of its open source status,
this growth will probably continue for the life of Linux and KDE.
From time to time, new methods for getting things done are added to the API, and it
is possible that some of the techniques described in this book will become outdated.
But KDE is quite stable now, so everything in the book should continue to work even
in the event of future changes. In some cases, if you run your applications from the
command line, there will be some text output to the console window. This text may
describe anything from a severe internal error to a simple piece of pertinent infor-
mation for the developer of the class you are using. This is typical of open source
development software, and symptomatic of software under development. Eventually,
in later versions, these messages will go away.
Preface xi
shape, and position you would like them to be. The first chapter explains some of
the background information — mostly having to do with the Qt and KDE libraries
and how the various classes are used to construct running programs.
Chapter 2 is where the programming starts. This chapter describes the classes
available that can be used to create and display the main window for both Qt and
KDE applications. Chapter 3 expands on this by demonstrating methods for orga-
nizing the contents of windows and dialog boxes. Chapters 4 and 5 both cover the
subject of managing pop-up dialogs, both custom-built dialogs and the dialogs that
are predefined as part of either Qt or KDE. Chapter 6 explores the construction and
management of menus and toolbars. Chapter 7 describes the management of wid-
gets that come in groups — such as collections of buttons that toggle on and off
in relation to one another.
Chapter 8 describes how your program can respond to the mouse and keyboard.
Chapter 9 explains how you can manage and display pixel-level graphics — either
loaded from a file or compiled right into the program. Chapter 10 explains fonts
and the process for displaying strings of characters. Chapter 11 explores the options
you have for creating and managing colors. Chapter 12 contains several examples
of using the QPainter class to perform a wide range of detailed graphics rendering.
Chapter 13 delves deeper into graphics by exploring the process of manipulating
graphics to fit a specific size or for placement on a printed page. Chapter 13 also
includes a special section on animation. Chapter 14 contains examples of dragging
and dropping graphic and text objects. Chapter 15 explores the process of communi-
cating data from one application to another. Chapter 16 rounds out the section’s
presentation of classes with examples of some miscellaneous utilities. Chapter 17
is an exploration of KDE facilities for internationalization.
xii Preface
Example Code
Most things described in this book are described by actual code samples. As much
as possible, these examples are complete running programs. I find that a simple
example — an example that demonstrates just one thing — is most useful to me
when I need to figure out (or be reminded) how to do something. Each example
is intended to demonstrate one, or possibly two, specific things.
The examples are not meant to demonstrate some kind of “correct” coding prac-
tice, or even the “correct” way to do a particular task. There is no correct way
because, in KDE as in all other software systems, there is usually more than one
way to get any particular job done. And the overall style and design of a program
are up to the programmer.
All of the example code, along with the makefiles for each, can be found here:
http://www.belugalake.com/book/kdebible
4682-1 fm.f.qc 11/20/00 15:45 Page xiii
Acknowledgments
I want to thank all of the KDE developers. This group has created an excellent
graphical user interface, and they have a right to be proud of what they’ve done.
I am grateful to the many members of the KDE developer’s group that took the time
to answer my questions and help keep me on the right track.
John Osborn came up with the original concept for this book. He defined the origi-
nal scope of the project and helped keep me in line when I tended to wander. I also
want to thank Laura Lewin, Andy Marinkovich, and Debra Williams Cauley for
putting things together in such a way that the book became a reality.
Kathi Duggan, while repairing things I wrote that no human being could otherwise
read, kept track of every chapter and graphic as it moved from one stage of produc-
tion to another. I feel more secure in putting my name on the book because David
Williams checked everything to make certain that the book was technically accurate.
Luann Rouff showed me how to convert my strange sentences into something that
could be read and understood.
And, as always, a special thank you to that special lady who makes everything
happen: Margot Maley at Waterside.
4682-1 fm.f.qc 11/20/00 15:45 Page xiv
Contents at a Glance
Preface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
End-User License Agreement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 756
GNU General Public License . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
CD-ROM Installation Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
4682-1 fm.f.qc 11/20/00 15:45 Page xvi
4682-1 fm.f.qc 11/20/00 15:45 Page xvii
Contents
Preface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
xviii Contents
Contents xix
xx Contents
Contents xxi
xxii Contents
QMainWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
QMenuBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
QMessageBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
QMultiLineEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
QPopupMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
QPrintDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
QProgressBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
QProgressDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
QPushButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
QRadioButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
QScrollBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
QScrollView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
QSemiModal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
QSizeGrip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
QSlider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
QSpinBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
QSplitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
QStatusBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470
QTabBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
QTabDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
QTabWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
QTextBrowser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
QTextView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
QToolBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
QToolButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
QVBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
QVButtonGroup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
QVGroupBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
QWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
QWidgetStack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
QWizard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488
Contents xxiii
KCModule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
KColorButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
KColorCells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
KColorCombo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
KColorDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
KColorPatch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
KComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
KContainerLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
KDatePicker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
KDateTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
KDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
KDialogBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
KDialogBaseButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
KDirectionButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
KDockMainWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
KDockWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
KDoubleNumInput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
KDualColorButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
KEdFind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
KEdGotoLine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
KEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
KEdReplace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
KFileDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
KFontChooser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
KFontDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
KFormulaEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
KFormulaToolBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
KGradientSelector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
KHSSelector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
KHTMLView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
KIconButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
KIconDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
KIconView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
KImageTrackLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 542
KIntNumInput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
KIntSpinBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
KKeyButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
KLed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
KLineEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
KLineEditDlg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
KListBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
KListView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
KMenuBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
KNumInput . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
KPaletteTable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
KPanelApplet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
4682-1 fm.f.qc 11/20/00 15:45 Page xxiv
xxiv Contents
KPasswordDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
KPasswordEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
KPopupMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
KProgress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
KRestrictedLine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
KRootPermsIcon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
KRuler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
KSelector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
KSeparator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563
KSpellConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
KSpellDlg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
KSplitList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
KStatusBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
KStatusBarLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
KTextBrowser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
KTextPrintDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
KTMainWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
KToolBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
KToolBarButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
KWizard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
KXYSelector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Contents xxv
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
End-User License Agreement . . . . . . . . . . . . . . . . . . . . . . . . . 756
GNU General Public License . . . . . . . . . . . . . . . . . . . . . . . . . 759
CD-ROM Installation Instructions . . . . . . . . . . . . . . . . . . . . . . 766
4682-1 fm.f.qc 11/20/00 15:45 Page xxvi
4682-1 ch01.f.qc 11/13/00 14:09 Page 3
What Is This
Thing Called
1
C H A P T E R
✦ ✦ ✦ ✦
Understanding the
different parts and
the overall structure
T
of KDE
he name of the software is the K Desktop Environment,
called KDE for short. This chapter is an introduction to the Learning the part
application development environment of KDE. It is a graphical played by Qt
user interface that is popular on Linux and other flavors of the in application
UNIX family of operating systems. Virtually all graphical inter- development
faces in the UNIX family are built on top of the X Windowing
System. The X Windowing System gives the graphics its porta- Learning the
bility across many systems; the Qt library of graphics objects part played by
provides the basic building blocks of an application; and the KDE in application
KDE library provides a standard look and feel. development
Learning about
widgets and the
The Structure of a KDE Application event model
When you write a KDE application, you are writing code that ✦ ✦ ✦ ✦
will rest on top of a lot of other code. Most of the detailed work
of getting your application written has already been done, and
that work resides in the libraries of code that will link to your
application to do the things you would like for it to do. The
diagram in Figure 1-1 should give you some idea of the levels
of software that make up a KDE application.
4682-1 ch01.f.qc 11/13/00 14:09 Page 4
Qt Classes
C++ API
glib X11
System
The way the diagram is drawn makes it appear that the levels are completely sepa-
rate, but that’s not the case. For example, perfectly valid calls are made from KDE
classes to glib functions, and there is nothing to prevent your application from
making calls directly to, say, glib or the system calls. An application typically uses
classes from both KDE and Qt. However, the calls are only downward — for
example, no part of the Qt API makes use of anything in KDE.
This book is all about using the material at the second and third levels (KDE and
Qt) to create things that go at the top level (applications). There is little or no infor-
mation about using the things at the other levels. Actually, that is one of the main
purposes of KDE and Qt — they simplify the process of developing applications by
insulating the programmer from the minute details handled at the lower levels.
System
This is the lowest layer of software available to every Linux application. A set of
low-level system calls provides direct access into the operation system, and its
drivers, to do things like open files and create directories. Because the Linux
kernel is written in C, these are all C function calls.
glib
This is a set of C functions, macros, and structures that are used by all the layers
above it; and, quite often, it is also used by applications. The glib library contains
functions for memory allocation, string formatting, date and time, I/O, and timers.
It also has utility functions for linked lists, arrays, hash tables, trees, quarks,
and caches. One of the crucial functions handled by glib is the main loop, which
4682-1 ch01.f.qc 11/13/00 14:09 Page 5
X11
This is the graphics layer that handles the low-level functions used to control the
display. All the fundamental windowing functions are included — these are the func-
tions that display windows and respond to the mouse and keyboard. This library has
become very stable over the years and the version numbers have rarely changed.
Currently, it is version 11 (as indicated by its name). And, because version 11 is
in release 6, it is also known as X11R6. Its original name was without the version
number, so it is often simply called X.
C++ API
Everything above this layer is written using C++, so the C++ run-time system is
called on for things such as creating new objects and handling I/O streams.
Qt Classes
This set of C++ classes implements the various widgets (buttons, window frames,
and so on) that can be used to create an application. It has the capability of combing
windows to together to create complicated graphics dialogs. At the same time that it
displays these widgets, it can respond to the mouse and keyboard for more input,
and dispatch information from the input window to the correct part of the program.
KDE Classes
These classes modify and add functionality to the Qt classes. There is a large num-
ber of KDE classes, but the majority of them extend directly from one or more of the
Qt classes. This layer is what gives KDE its unique appearance, and standardizes
the way the window, mouse, and keyboard all interact with one another.
Applications
There are two basic flavors of applications. You can create either a Qt application
or a KDE application. A Qt application is one that creates a QApplication object to
initialize itself, while a KDE application initializes itself by creating a KApplication
object. The KApplication class extends the QApplication class by adding the
things that are necessary for the standard appearance and capabilities of a
KDE application.
4682-1 ch01.f.qc 11/13/00 14:09 Page 6
About Qt
Qt is a library of C++ GUI application development software. Its purpose is to provide
everything needed to develop the user interface portion of applications. It does this
primarily in the form of a collection of C++ classes.
The set of Qt classes is quite robust. There is nothing to stop you from writing com-
plete applications using Qt. In fact, to demonstrate the basic form of an application,
the first few examples in this book use only Qt. The Qt classes include everything
from basic window controls, drag and drop, and internationalization to network
programming.
In the past there has been some concern over the use of Qt in some open source
development areas because of limitations in software licensing. But licensing is
no longer a concern. Trolltech has recently released a version of Qt that is entirely
free, and it is licensed under the GPL (GNU General Public License). The same
software can also be used under the QPL (Q Public License), depending on the
particular licensing requirements. This dual licensing approach allows for
the development of both open source software and proprietary software.
With release Qt 2.2.1, there are three different version of the software:
✦ The Qt Free Edition is licensed under the GPL and can be downloaded
and freely used for any open source project.
✦ The Qt Professional Edition is intended for use by commercial and proprietary
software development. The license and the software must be purchased.
✦ The Qt Enterprise Edition is licensed the same as the Qt Professional Edition,
but contains additional software modules. These extensions include OpenGL,
networking, XML, spreadsheets, and a special optimized 2D graphics package.
The following methods are defined in QObject. Most of these methods are used in
one example or another in this book.
Some Qt objects have the ability to emit signals that can be received by other objects
inside your program. A QObject object emits a signal whenever its destructor
is called:
void destroyed();
Signals, and the slots that receive them, are briefly described in the next section,
and many examples are included in the book.
4682-1 ch01.f.qc 11/13/00 14:09 Page 8
The MOC compiler is triggered by the presence of the Q_OBJECT macro within a
class definition to determine whether to generate code, and what code is generated.
The resulting source code can be either compiled separately and linked, or simply
included in your code with the #include directive.
Using the MOC compiler not only activates the signals and slots, but also generates
code that enables some special methods that are defined in every Qt class (and
thus, by inheritance, in every object in your program). These special methods,
listed in Table 1-1, are defined in the QtObject class.
Table 1-1
The MOC Methods of QObject
Method Description
className() Returns, as a character string, the name of the class. This does
not require RTTI (Run Time Type Identification) support.
inherits() Returns a Boolean value that specifies whether or not this class
inherits from some other named class.
tr() Performs the translation of a string for internationalization
setProperty() Sets an object property by name
property() Returns a named object property
metaObject() Returns a QMetaObject object for the class. A meta object
contains detailed descriptive information for a class.
About KDE
KDE is an open source development project of a graphical desktop environment.
Other than being the first letter of the acronym, the K doesn’t stand for anything.
It is just a name.
4682-1 ch01.f.qc 11/13/00 14:09 Page 9
The KDE software is constructed using Qt. The project began in 1996, the year after
the first version of Qt was released. Since then, the project has grown to become a
very complete desktop environment with a large collection of applications. To learn
more about the status and content of KDE, visit the http://www.kde.org Web site.
From the software developer’s point of view, KDE is quite simple. While most of
the software written as part of the KDE project is used as an integral part of the
desktop environment, a large number of classes have also been developed; and
they are included as part of a core KDE API. These classes are meant to help give
KDE applications a standard look and feel. Most of these classes inherit from one
or more classes of the Qt library, and some of the KDE classes add capabilities
beyond that of Qt, but most of them are simply for the sake of maintaining the stan-
dard appearance of KDE. It would be easy enough to write your entire application
using only the classes of Qt, but if you use the KDE classes, your application is
more likely to appear integrated with the rest of the desktop.
Events Happen
An application that runs in the K Desktop Environment is an event-driven program.
This means that when a program starts running, it displays its window (or windows)
and waits for input from the mouse or keyboard. This input comes wrapped inside
objects called events. An event can also tell the program that a window has been
closed, or that the window has been exposed after being hidden behind another
window. The application’s entire purpose is to respond intelligently to the keyboard
and mouse.
An application has one main top-level window. It can also have other windows.
These windows can exist for the entire life of the application, or they can appear
and disappear as the application responds to events.
A widget is any class that inherits from the Qt class named QWidget. A QWidget
object contains and manages its own displayable window. It can also be set to
respond to events issued by the mouse and keyboard (and whatever else you
have for input) that are sent to the window inside the widget. It knows things
about its current visibility, its size, its background color, its foreground color,
its position on the display, and so on. You can use the widgets defined in either
Qt or KDE, or you can create your own by using QWidget as a base class.
4682-1 ch01.f.qc 11/13/00 14:09 Page 10
Every class in Qt and KDE is defined in a header file. In every case (well, almost
every case), the header file derives its name from the name of the class. For exam-
ple, the header file for the QPopupMenu class is named qpopupmenu.h, and the class
KFontDialog is defined in kfontdialog.h. However, this naming convention is not
universally true because more than one class can be defined in a header. For exam-
ple, the class KFontChooser is also defined in kfontdialog.h. Also, some source
filenames are abbreviated. For example, the header for KColorDialog is named
kcolordlg.h.
Summary
This chapter provided a short, and very general, introduction to the programming
environment of KDE. The concepts introduced in this chapter included:
If you are a Windows programmer but are unfamiliar with KDE, you may want
to read Chapter 20, which compares a Windows program with a KDE program.
Otherwise, proceed to Chapter 2, which starts with examples of very simple
KDE applications.
✦ ✦ ✦
4682-1 ch02.f.qc 11/13/00 14:09 Page 11
Creating and
Displaying a
2
C H A P T E R
✦ ✦ ✦ ✦
Writing a simple
program with just a
few lines of code
The examples in this chapter are designed to explain the basic Creating a window
format of the source and the process necessary to convert that by coding a C++
source into an executable program. To keep things as simple object for it
as possible, and so you can see the relationship between the
various parts of a program, these examples all use simple hand- Responding to input
written makefiles. The first example is a minimal Qt application, by specifying slots
and the second is a minimal KDE application. Other examples to receive signals
show how you can respond to a pushbutton and create a
display widget containing other widgets. ✦ ✦ ✦ ✦
Hello Qt
The following example program creates and displays a simple
window. It doesn’t do anything other than display a line of
text, but it gives you an idea of the fundamental requirements
of a Qt program. The window is shown in Figure 2-1.
1 /* helloworld.cpp */
2 #include <qapplication.h>
3 #include <qlabel.h>
4 #include <qstring.h>
5
6 int main(int argc,char **argv)
7 {
4682-1 ch02.f.qc 11/13/00 14:09 Page 12
8 QApplication app(argc,argv);
9 QLabel *label = new QLabel(NULL);
10 QString string(“Hello, world”);
11 label->setText(string);
12 label->setAlignment(
13 Qt::AlignVCenter | Qt::AlignHCenter);
14 label->setGeometry(0,0,180,75);
15 label->show();
16 app.setMainWidget(label);
17 return(app.exec());
18 }
The file qapplication.h included on line 2 is almost always included in the same
source file that contains the main() function. This example uses a QLabel widget
to display text, so it is necessary to also include qlabel.h. And a QString object
is required to specify the text displayed by the QLabel object, so qstring.h is
included on line 4.
A Qt program is a C++ program. This means that in order to start the program,
a function named main() will be called by the operating system. And, like all C++
programs, command-line options may or may not be passed to the main() function.
The command-line options are passed on to the Qt software as part of the initializa-
tion process, as shown on line 8.
The two command-line arguments, argc and argv, are used in the construction of
app because some special flags and settings can be specified. For example, starting
a Qt program with -geometry will specify the size and location of the window it
displays. By altering the profile information that starts a program, a user can
personalize a program’s appearance.
parent widget as NULL because this label is to be the top-level window, and top-level
windows have no parents. As it is created, the label contains no text, but it is pro-
vided text by being passed the QString object created on line 10. The QString
object is inserted into the QLabel with the call to setText() on line 11.
The default action for a QLabel is to display the character string centered vertically
and justified to the left, so the call to setAlignment() is made on line 12 to center
the text both vertically and horizontally.
The call to setGeometry() on line 14 determines the location, height, and width
of the label widget inside the QApplication window. For this example, the label
is positioned at location (0,0), which is the upper-left corner of the main window.
It is also instructed to be 180 pixels wide by 75 pixels high. Before anything is
displayed, the main window will query the label to find out its size, and then
the main window will set its own size to contain the label.
The call to show() on line 16 is necessary in order for the label to actually appear
on the window. The show() function does not immediately display the widget, it
only configures it so that it will be displayed when the time comes. The parent
window — in this case, the QApplication window — assumes the task of displaying
the label, but will only do so if there has been a call to the label’s show() method.
Another function, named hide(), can be used to cause a widget to disappear from
the display.
The call to setMainWidget() on line 11 inserts the label into the main window. To
keep this example simple, the QLabel object is used, but normally the widget will
be some sort of compound widget that contains the collection of widgets, text,
and other elements of the main window of an application.
Finally, a call is made to exec() on line 17. This function does not return until it
is time for the program to cease execution. It returns an int value representing
its completion status; and because we are not processing status codes, the value
is simply returned to the system.
Because the program is simple and consists of only one source file, the makefile that
compiles it is quite simple:
helloworld: helloworld.o
$(CC) $(LFLAGS) -o helloworld helloworld.o $(LIBS)
helloworld.o: helloworld.cpp
4682-1 ch02.f.qc 11/13/00 14:09 Page 14
clean:
rm -f helloworld
rm -f helloworld.o
.SUFFIXES: .cpp
.cpp.o:
$(CC) -c $(CFLAGS) $(INCL) -o $@ $<
The makefile assumes that the environment variables QTDIR and KDEDIR are
defined as the name of the installation directory of the Qt and KDE development
systems. Normally, these two environment variables have their definitions config-
ured when you install the software. Five names are defined inside the makefile, as
shown in Table 2-1.
Table 2-1
Variables Defined in the Makefile
Name Contents
INCL This is the path name of the location of the header files. This is passed to
the compiler to tell it where to look for header files. The compiler always
looks in /usr/include for the standard headers.
CFLAGS This is the list of options passed to the compiler. The -pipe option
instructs the compiler to use pipes, instead of temporary files, when passing
data between two stages of compilation. The -O2 option specifies a fairly
high level of optimization. The –fno-strength-reduce option prevents
the optimization from reducing or eliminating iteration variables.
LFLAGS This is a list of options passed to the linker. Each of the -L options specifies
a directory that is expected to contain one or more libraries.
LIBS This is the list of library namesthat will be needed by this program. The
named libraries will be sought in the directories named by LFLAGS. The
name of each will be expanded to name the library file. For example,
-lqt is changed to libqt.so, and -lX11 becomes libX11.so.
CC This is the name of the compiler.
The last two lines of the makefile are used to instruct make on how to form a com-
mand that will convert a .cpp file into a .o file. There is only one source file in this
example, but if there were more, using the conversion rule allows the compile
command to be defined once and be applied to the entire makefile.
4682-1 ch02.f.qc 11/13/00 14:09 Page 15
Note There are an infinite number of ways to write a makefile. This example was made
relatively simple so it would be easy to read. As you develop an application, you
will probably discover other things need to be added to your makefiles.
Hello KDE
This example, shown in Figure 2-2, is the same as the previous one except it is
based on a KApplication object, rather than a QApplication object. Because
the KApplication class is based on QApplication, there are no fundamental dif-
ferences other than the addition of KDE facilities such as styles and themes, the
capability to use KDE widgets, access to the standard KDE configuration, access
to session management information, and the capability to launch the user’s Web
browser and e-mail client.
1 /* hellokde.cpp */
2 #include <kapp.h>
3 #include <qlabel.h>
4 #include <qstring.h>
5
6 int main(int argc,char **argv)
7 {
8 KApplication app(argc,argv,”hellokde”);
9 QLabel *label = new QLabel(NULL);
10 QString string(“Hello, KDE”);
11 label->setText(string);
12 label->setAlignment(
13 Qt::AlignVCenter | Qt::AlignHCenter);
14 label->setGeometry(0,0,180,75);
15 label->show();
16 app.setMainWidget(label);
17 return(app.exec());
18 }
The KApplication object is defined in the header file kapp.h included on line 2.
The kapp.h file includes the qapplication.h file, so every facility available to a
Qt program is also available to a KDE program. The header files included on lines 3
and 4 hold the definitions of the QLabel and QString classes.
4682-1 ch02.f.qc 11/13/00 14:09 Page 16
Because a KDE object is being used in this program, it is necessary to include the
KDE library that holds the object. There are some specialized KDE libraries, but
the main two libraries are libkdecore and libkdeui.
hellokde: hellokde.o
$(CC) $(LFLAGS) -o hellokde hellokde.o $(LIBS)
hellokde.o: hellokde.cpp
clean:
rm -f hellokde
rm -f hellokde.o
.SUFFIXES: .cpp
.cpp.o:
$(CC) -c $(CFLAGS) $(INCL) -o $@ $<
The LIBS definition shows the inclusion of the libraries libkdecore.a, which con-
tains the core functionality of KDE; and libkdeui.a, which contains all of the KDE
widgets. KDE internally implements ODBC (Open Database Connectivity) by dynam-
ically loading ODBC drivers, so it is also necessary to include the library libdl.a.
The installation of KDE places these libraries in the default directory, so there is no
need to add a new search path to LFLAGS.
1 /* mylabel.h */
2 #ifndef MYLABEL_H
4682-1 ch02.f.qc 11/13/00 14:09 Page 17
3 #define MYLABEL_H
4
5 #include <qlabel.h>
6 #include <qstring.h>
7
8 class MyLabel: public QLabel
9 {
10 public:
11 MyLabel(QWidget *parent);
12 ~MyLabel();
13 };
14
15 #endif
The preprocessor commands on lines 2, 3, and 15 are not required, but they are a
very good idea. As a growing application begins to get more complicated, the same
header file is likely to be included more than once in a single source file because it
is common to include header files inside other header files. By creating the defini-
tion of MYLABEL_H, this header can be included any number of times, but will be
compiled only once.
On line 8, the definition of the MyLabel class uses QLabel as its base class. This
necessitates the use of the include statement on line 5 to make the definition of
QLabel available. The header file qstring.h is included on line 6 as a convenience,
because the definition of QString is needed in the MyLabel constructor.
The MyLabel class is implemented in its own source file. It doesn’t do anything
other than pass the address of the parent widget from the constructor of MyLabel
to the constructor of the QLabel base class:
1 /* mylabel.cpp */
2 #include “mylabel.h”
3
4 MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
5 {
6 }
7 MyLabel::~MyLabel()
8 {
9 }
4682-1 ch02.f.qc 11/13/00 14:09 Page 18
The following example creates and displays a MyLabel widget. Except for the object
used, the main() function of this program is very much the same as the one for the
previous example.
1 /* helloobject.cpp */
2 #include “mylabel.h”
3 #include <qapplication.h>
4
5 int main(int argc,char **argv)
6 {
7 QApplication app(argc,argv);
8 MyLabel *mylabel = new MyLabel(NULL);
9 QString string(“Hello, object”);
10 mylabel->setText(string);
11 mylabel->setAlignment(
12 Qt::AlignVCenter | Qt::AlignHCenter);
13 mylabel->setGeometry(0,0,180,75);
14 mylabel->show();
15 app.setMainWidget(mylabel);
16 return(app.exec());
17 }
The MyLabel object is created, manipulated, and displayed in exactly the same
way as the QLabel object in the previous example. The setAlignment() function
is inherited directly from QLabel, while setGeometry() and show() are inherited
from QWidget.
Note Object-oriented programming has numerous advantages, but the most well known
are probably the advantages found in handling graphical user interfaces (GUIs). Qt
takes full advantage of this fact. Every displayable object inherits its basic capabilities
from the base class QWidget, which means that every displayable window — label,
button, top-level window, or whatever — all have the same set of basic functions that
control things such as size, color, cursor appearance, mouse detection, and scrolling.
This not only makes it easy to create your own widgets, it automatically applies a
default uniform behavior and appearance to everything on the screen.
The makefile is very much like the previous one, except that it must take into account
the two separate .cpp files by compiling them both and linking them together:
clean:
rm -f helloobject
rm -f mylabel.o
rm -f helloobject.o
.SUFFIXES: .cpp
.cpp.o:
$(CC) -c $(CFLAGS) $(INCL) -o $@ $<
Compound Widgets
The QApplication object displays, as the main window of the application, the wid-
get you assign to it with the call to the method assignMainWidget(). To display a
main window that contains more than a single item, you need to create your own
widget and use it as the one displayed as the main window. The following example
combines two buttons and a label into a single widget:
1 /* threewidget.h */
2 #ifndef THREEWIDGET_H
3 #define THREEWIDGET_H
4
5 #include <qpushbutton.h>
6 #include <qlabel.h>
7
8 class ThreeWidget: public QWidget
9 {
10 public:
11 ThreeWidget(QWidget *parent=0,const char *name=0);
12 private:
13 QPushButton *topButton;
14 QPushButton *bottomButton;
15 QLabel *label;
16 };
17
18 #endif
Lines 5 and 6 include the header files defining the widgets that are to be included as
part of the compound widget. There are to be two buttons and a label, and the loca-
tions to store their addresses are defined as private data on lines 13 through 15 of
threewidget.h.
1 /* threewidget.cpp */
2 #include “threewidget.h”
3
4 ThreeWidget::ThreeWidget(QWidget *parent,const char *name):
5 QWidget(parent,name )
6 {
7 setMinimumSize(120,180);
8 setMaximumSize(120,180);
9
4682-1 ch02.f.qc 11/13/00 14:09 Page 20
Lines 7 and 8 set the minimum and maximum sizes of this widget. The parent win-
dow will query this widget to determine its size. In this example, the minimum and
maximum settings are the same, which means that the window cannot be resized.
The displayed window, shown in Figure 2-4, cannot have its width or height
changed with the mouse.
The button at the top is created on line 10. The second argument to the constructor
is the widget that is to be the parent of the button. In this example, the parent is the
new widget being constructed. The same parent/child relationship is established
for the label and the other button on lines 12 and 15.
The newly created widget has a displayable area that is 120 pixels wide and 180 pix-
els high. The widgets are positioned on this window by calls to setGeometry(). On
line 11, a call to setGeometry() positions the top button 15 pixels from the top and
15 pixels from the left side. The same call sets the button width to 80 pixels, and the
height to 40 pixels. Similarly, the calls to setGeometry() on lines 13 and 16 position
the other widgets. The first two arguments to setGeometry() are left and top; the
second two are width and height.
The main() function of this program treats the new compound widget just as it
would any other widget.
1 /* compound.cpp */
2 #include <qapplication.h>
4682-1 ch02.f.qc 11/13/00 14:09 Page 21
3 #include “threewidget.h”
4
5 int main(int argc,char **argv)
6 {
7 QApplication app(argc,argv);
8 ThreeWidget threeWidget;
9 threeWidget.setGeometry(10,10,100,100);
10 app.setMainWidget(&threeWidget);
11 threeWidget.show();
12 return(app.exec());
13 }
The threeWidget object is created on line 8. A widget cannot be forced to fit a size
that is not valid for it, so the call to setGeometry() on line 9 has no effect because
of the minimum and maximum size settings in the widget. The call to show() on
line 11 instructs the widget, and all of the widgets it contains, to be visible.
Listening to a Button
A button is a widget, so it can be displayed just like any other widget. However, your
program will need to know when the user clicks on the button. The following example
displays the window shown in Figure 2-5 and responds to the button by halting:
1 /* exitbutton.cpp */
2 #include <qapplication.h>
3 #include <qpushbutton.h>
4 #include <qstring.h>
5
6 int main(int argc,char **argv)
7 {
8 QApplication app(argc,argv);
9 QString string(“Exit”);
10 QPushButton *button = new QPushButton(string,NULL);
11 QObject::connect(button,
12 SIGNAL(clicked()),&app,SLOT(quit()));
13 button->setGeometry(0,0,80,50);
14 button->show();
15 app.setMainWidget(button);
16 return(app.exec());
17 }
The button is prepared to respond to the mouse, but the response will go unnoticed
unless the button is instructed to send a message to some part of your program. A
message of this type is called a signal, and a method capable of receiving a signal is
called a slot. The call to QObject::connect() on lines 10 and 11 causes a copy of
the signal to be directed from clicked() in the button to the quit() method in
the application.
Note If you have worked with other event-driven systems, you are probably familiar with
the concept of callback functions. A slot is similar to a callback, but there are some
differences. The most important difference is that slots are type safe — if the argu-
ment types don’t match, the program won’t compile.
In the call to QObject::connect(), the first two arguments specify the source
of the signal as being the method named clicked() in the button. The signal is
broadcast. That is, the signal is sent whether or not there are slot functions set
to receive it. On the other hand, if several slots are set to receive the signal, they
each will receive a copy.
The second pair of arguments on the call to QObject::connect() specify that the
receiving slot is to be the quit() method in the QApplication.
1 /* count.cpp */
2 #include <qapplication.h>
3 #include “clickcount.h”
4
5 int main(int argc,char **argv)
6 {
7 QApplication app(argc,argv);
8 ClickCount clickcount;
9 app.setMainWidget(&clickcount);
10 clickcount.show();
11 return(app.exec());
12 }
4682-1 ch02.f.qc 11/13/00 14:09 Page 23
Figure 2-6: The slot of the counter receives the signal of the button.
The ClickCount widget contains a button and a label. The label is used to display
the current counter value:
1 /* clickcount.h */
2 #ifndef CLICKCOUNT_H
3 #define CLICKCOUNT_H
4
5 #include <qpushbutton.h>
6 #include <qlabel.h>
7
8 class ClickCount: public QWidget
9 {
10 Q_OBJECT
11 public:
12 ClickCount(QWidget *parent=0,const char *name=0);
13 public slots:
14 void incrementCounter();
15 private:
16 int counter;
17 QLabel *label;
18 QPushButton *button;
19 };
20
21 #endif
The macro Q_OBJECT on line 10 must be present in any class that has a slot. (It also
must be present for a class that broadcasts a signal, as you’ll see in Chapter 5.) The
Q_OBJECT macro defines some of the standard methods that must be present in
order for signals and slots to work.
The constructor of the ClickCount class creates the layout containing the button
and the label, and makes the connection that will send a signal from the button to
the slot named incrementCounter():
1 /* clickcount.cpp */
2 #include <stdio.h>
4682-1 ch02.f.qc 11/13/00 14:09 Page 24
3 #include “clickcount.h”
4
5 ClickCount::ClickCount(QWidget *parent,const char *name):
6 QWidget(parent,name )
7 {
8 setMinimumSize(120,125);
9 setMaximumSize(120,125);
10
11 counter = 0;
12 button = new QPushButton(“Add 1”,this);
13 button->setGeometry(15,15,90,40);
14 label = new QLabel(“0”,this);
15 label->setGeometry(15,70,90,40);
16 label->setAlignment(AlignVCenter | AlignHCenter);
17
18 QObject::connect(
19 button,SIGNAL(clicked()),
20 this,SLOT(incrementCounter()));
21 }
22 void ClickCount::incrementCounter()
23 {
24 char str[30];
25 sprintf(str,”%d”,++counter);
26 label->setText(str);
27 }
The call to QObject::connect() on line 18 attaches a slot to a signal. The first two
arguments, on line 19, specify that the source of the signal is to be a method named
clicked(). The clicked() signal is a member of the button’s class, along with the
signals named pressed(), released(), and toggled().
The second pair of QObject::connect() arguments, on line 20, specify the object
and method that are to receive the signal. The object is this (the current instance
of ClickCount) and the method is incrementCounter().
Every time the clicked() signal is sent by the button, it is received by the
incrementCounter() method, which adds 1 to the value being displayed and
updates the text of the button.
4682-1 ch02.f.qc 11/13/00 14:09 Page 25
Note There is no real connection between the signal and the slot. A signal is broadcast
whether or not any slots are listening — and there can be any number of slots lis-
tening for the signal. Also, a slot can be set to listen for any number of signals.
The makefile for this example shows how the Meta Object Compiler) takes its input
as the source code of the header file defining the class, and produces a new source
file to be compiled and linked with the program:
The dependencies on line 7 show that the program is not only dependent on count.o
and clickount.o, but also depends on something called moc_clickcount.o. The
file moc_clickcount.cpp is created by the MOC compiler from clickcount.h.
The Q_OBJECT macro adds some method prototypes to the ClickCount class defini-
tion, and the MOC compiler generates bodies for the new methods. The result is that
the repetitive (and thus error-prone) coding required for signals and slots is almost
completely automated.
Cross- There is more about how and why this is done — Chapter 5 examines the entire
Reference
process.
4682-1 ch02.f.qc 11/13/00 14:09 Page 26
Summary
It takes very few lines of code to create a working Qt or KDE application. The details
of writing code to create the windows, and the low-level mechanics of listening for
user input, are all handled inside the API.
This chapter described how to create and display the main window of an application.
The next chapter deals with displaying pop-up windows and dialog boxes. There are
some pre-defined KDE and Qt dialog boxes, but you can also create your own.
✦ ✦ ✦
4682-1 ch03.f.qc 11/20/00 15:41 Page 27
Laying Out
Widgets in a
3
C H A P T E R
✦ ✦ ✦ ✦
Positioning widgets
on the display using
specific x and y
T
coordinate values
his chapter is all about controlling the size and position
of a collection of widgets inside a window. Before an Attaching widgets
application can be programmed to respond to a button or to a grid coordinate
read some text typed by the user, it is necessary to present system
the button and the text entry widgets in some sort of reason-
able arrangement. This chapter explains not only how to Stretching and
place a widget where you want it, but also how to specify its shrinking widgets so
size and the action that will be taken when the window is they fit the display
resized.
Stacking widgets
Widgets can be positioned and sized by coordinate values or into a vertical box
by using a layout. The coordinate values are hard-coded pixel for display
locations that cannot be adjusted by the user. On the other
hand, a layout object positions and sizes the widgets (within Inserting widgets
maximum and minimum limits) relative to one another and into a horizontal
relative to the overall size of the containing window. box for display
Containing the
window of one
Geometric Widget Placement widget within the
window of another
You can specify the exact placement and size of each widget
by specifying four values: horizontal offset, vertical offset,
width, and height. The coordinate system is that of the parent ✦ ✦ ✦ ✦
window — that is, the window that contains the widgets. The
following example places three pushbuttons on an application
window.
Main
1 /* main.cpp */
2 #include <kapp.h>
4682-1 ch03.f.qc 11/20/00 15:41 Page 28
3 #include “setxy.h”
4
5 int main(int argc,char **argv)
6 {
7 KApplication app(argc,argv,”setxy”);
8 SetXY setxy;
9 setxy.show();
10 app.setMainWidget(&setxy);
11 return(app.exec());
12 }
The mainline is quite simple. The header file is included on line 3. The widget with
the buttons is created on line 8, and is specified as the widget to be displayed as
the main application window by the call to setMainWidget() on line 10.
SetXY Header
1 /* setxy.h */
2 #ifndef SETXY_H
3 #define SETXY_H
4
5 #include <qpushbutton.h>
6
7 class SetXY: public QWidget
8 {
9 public:
10 SetXY(QWidget *parent=0,const char *name=0);
11 ~SetXY();
12 private:
13 QPushButton *button1;
14 QPushButton *button2;
15 QPushButton *button3;
16 };
17
18 #endif
The class SetXY is defined using QWidget as its base class. Its only data are the
three QPushButton pointers defined on lines 13 through 15. Normally, there would
be methods designated as slots to respond to the buttons, but this is a simple
placement demonstration so there will be no responses to the buttons.
Note Because the header file qpushbutton.h is included on line 5 of setxy.h, it will
be automatically included by both setxy.cpp and main.cpp. If another widget
were being used, and if that other widget also included qpushbutton.h, the
same header file would be included twice. That is why it is very important that the
precompiler directives on lines 2, 3, and 18 be used to prevent a header file from
being compiled more than once.
Other documents randomly have
different content
PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK
1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside
the United States, check the laws of your country in addition to
the terms of this agreement before downloading, copying,
displaying, performing, distributing or creating derivative works
based on this work or any other Project Gutenberg™ work. The
Foundation makes no representations concerning the copyright
status of any work in any country other than the United States.
1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if
you provide access to or distribute copies of a Project
Gutenberg™ work in a format other than “Plain Vanilla ASCII” or
other format used in the official version posted on the official
Project Gutenberg™ website (www.gutenberg.org), you must,
at no additional cost, fee or expense to the user, provide a copy,
a means of exporting a copy, or a means of obtaining a copy
upon request, of the work in its original “Plain Vanilla ASCII” or
other form. Any alternate format must include the full Project
Gutenberg™ License as specified in paragraph 1.E.1.
• You pay a royalty fee of 20% of the gross profits you derive
from the use of Project Gutenberg™ works calculated using the
method you already use to calculate your applicable taxes. The
fee is owed to the owner of the Project Gutenberg™ trademark,
but he has agreed to donate royalties under this paragraph to
the Project Gutenberg Literary Archive Foundation. Royalty
payments must be paid within 60 days following each date on
which you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly marked
as such and sent to the Project Gutenberg Literary Archive
Foundation at the address specified in Section 4, “Information
about donations to the Project Gutenberg Literary Archive
Foundation.”
• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.
1.F.
Most people start at our website which has the main PG search
facility: www.gutenberg.org.
ebookball.com