1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>
Qt Tutorial - Chapter 4: Let There Be Widgets
</title></head><body bgcolor="#ffffff">
<p>
<table width="100%">
<tr><td><a href="index.html">
<img width="100" height="100" src="qtlogo.png"
alt="Home" border="0"><img width="100"
height="100" src="face.png" alt="Home" border="0">
</a><td valign=top><div align=right><img src="dochead.png" width="472" height="27"><br>
<a href="classes.html"><b>Classes</b></a>
-<a href="annotated.html">Annotated</a>
- <a href="hierarchy.html">Tree</a>
-<a href="functions.html">Functions</a>
-<a href="index.html">Home</a>
-<a href="topicals.html"><b>Structure</b></a>
</div>
</table>
<p>
<h1 align=center>Chapter 4: Let There Be Widgets</h1><br clear="all">
<p>
<center><img src="t4.png" alt="Screenshot of tutorial four"></center>
<p>
This example shows how to create your own widget, how to control the
minimum and maximum sizes of a widget, and introduces widget names. <pre>/****************************************************************
**
** Qt tutorial 4
**
****************************************************************/
#include <<a href="qapplication-h.html">qapplication.h</a>>
#include <<a href="qpushbutton-h.html">qpushbutton.h</a>>
#include <<a href="qfont-h.html">qfont.h</a>>
class MyWidget : public QWidget
{
public:
MyWidget( <a href="qwidget.html">QWidget</a> *parent=0, const char *name=0 );
};
MyWidget::MyWidget( <a href="qwidget.html">QWidget</a> *parent, const char *name )
: <a href="qwidget.html">QWidget</a>( parent, name )
{
<a href="qwidget.html#c0b5fb">setMinimumSize</a>( 200, 120 );
<a href="qwidget.html#c78dce">setMaximumSize</a>( 200, 120 );
<a href="qpushbutton.html">QPushButton</a> *quit = new <a href="qpushbutton.html">QPushButton</a>( "Quit", this, "quit" );
quit-><a href="qpushbutton.html#c9b88e">setGeometry</a>( 62, 40, 75, 30 );
quit-><a href="qwidget.html#c52788">setFont</a>( <a href="qfont.html">QFont</a>( "Times", 18, QFont::Bold ) );
<a href="qobject.html#7f8e37">connect</a>( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
}
int main( int argc, char **argv )
{
<a href="qapplication.html">QApplication</a> a( argc, argv );
MyWidget w;
w.<a href="qwidget.html#9ede68">setGeometry</a>( 100, 100, 200, 120 );
a.<a href="qapplication.html#7ad759">setMainWidget</a>( &w );
w.<a href="qwidget.html#200ee5">show</a>();
return a.<a href="qapplication.html#84c7bf">exec</a>();
}
</pre>
<p>
<h2>Line by Line Walk-Through</h2> <pre>
class MyWidget : public QWidget
{
public:
MyWidget( <a href="qwidget.html">QWidget</a> *parent=0, const char *name=0 );
};
</pre>
<p>
Here we create a new class. Since this class inherits from QWidget,
the new class is a widget, and may be a top level window or a child
widget (like the push button in chapter three).
<p>
This class has only one member, a constructor (in addition to the
members it inherits from QWidget). The constructor is a standard Qt
widget constructor; you should always include a similar constructor
when you create widgets.
<p>
The first argument is its parent widget. To create a top level window
you specify a null pointer as the parent. As you can see, this widget
defaults to be a top level window.
<p>
The second argument is the widget's name. This is <em>not</em> the text
that appears in the window's title bar or in the button. It is a name
associated with a widget to make it possible to <a href="qobject.html#b0bff0">look up</a> this widget later, and there is
also a <a href="qobject.html#c21cea">handy debugging function</a> that will list a complete widget hierarchy. <pre>
MyWidget::MyWidget( <a href="qwidget.html">QWidget</a> *parent, const char *name )
: <a href="qwidget.html">QWidget</a>( parent, name )
</pre>
<p>
The implementation of the constructor starts here. Like most widgets,
it just passes on the <code>parent</code> and <code>name</code> to the QWidget
constructor. <pre>
{
<a href="qwidget.html#c0b5fb">setMinimumSize</a>( 200, 120 );
<a href="qwidget.html#c78dce">setMaximumSize</a>( 200, 120 );
</pre>
<p>
Since this widget doesn't know how to handle resizing, we fix its size
by setting the minimum and maximum to be equal. In the next chapter,
we will show how a widget can respond to resize event from the user. <pre>
<a href="qpushbutton.html">QPushButton</a> *quit = new <a href="qpushbutton.html">QPushButton</a>( "Quit", this, "quit" );
quit-><a href="qpushbutton.html#c9b88e">setGeometry</a>( 62, 40, 75, 30 );
quit-><a href="qwidget.html#c52788">setFont</a>( <a href="qfont.html">QFont</a>( "Times", 18, QFont::Bold ) );
</pre>
<p>
Here we create and set up a child widget of this widget (the new widget's
parent is <code>this)</code> which has the widget name "quit". The widget
name has nothing to do with the button text, they just happen to be
similar in this case.
<p>
Note that <code>quit</code> is a local variable in the constructor. MyWidget
does not keep track of it, but Qt does, and will by default delete it
when MyWidget is deleted. This is why MyWidget doesn't need a
destructor. (On the other hand, there is no harm in deleting a child
when you choose to, the child will automatically tell Qt about its
imminent death.)
<p>
The setGeometry() call does the same as move() and resize() did in the
previous chapters. <pre>
<a href="qobject.html#7f8e37">connect</a>( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
}
</pre>
<p>
Since the MyWidget class doesn't know about the application object, it
has to connect to Qt's pointer to it, <code>qApp.</code>
<p>
A widget is a software component and should know as little as possible
about its environment in order to be as general and reusable as
possible.
<p>
Knowing the name of the application object would break this principle,
so Qt offers an alias, qApp, for the cases where a component such as
MyWidget needs to talk to the application object. <pre>
int main( int argc, char **argv )
{
<a href="qapplication.html">QApplication</a> a( argc, argv );
MyWidget w;
w.<a href="qwidget.html#9ede68">setGeometry</a>( 100, 100, 200, 120 );
a.<a href="qapplication.html#7ad759">setMainWidget</a>( &w );
w.<a href="qwidget.html#200ee5">show</a>();
return a.<a href="qapplication.html#84c7bf">exec</a>();
}
</pre>
<p>
Here we instantiate our new baby, set it to be the main widget, and
execute the application.
<p>
<h2>Behavior</h2>
<p>
This program is very similar in behavior to the previous one. The
difference lies in the way we have implemented it. It does behave
slightly different though. Just try to resize it to see.
<p>
<h2>Exercises</h2>
<p>
Try to create another MyWidget object in main(). What happens?
<p>
Try to add more buttons, or put in widgets other than QPushButton.
<p>
You may now go on to <a href="t5.html">chapter five.</a>
<p>
[<a href="t3.html">Previous tutorial</a>]
[<a href="t5.html">Next tutorial</a>]
[<a href="tutorial.html">Main tutorial page</a>]
<p><address><hr><div align="center">
<table width="100%" cellspacing="0" border="0"><tr>
<td>Copyright 2001 Trolltech<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td align="right"><div align="right">Qt version 2.3.2</div>
</table></div></address></body></html>
|