?? qt教程一 —— 第五章:組裝積木.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0061)http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-05.html -->
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-win-commercial-3.0.5/doc/tutorial.doc:487 --><HTML><HEAD><TITLE>Qt教程一 —— 第五章:組裝積木</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content=Cavendish name=Translator>
<META content=http://www.qiliang.net/qt name="Qt zh_CN Documents Website">
<STYLE type=text/css>H3.fn {
MARGIN-LEFT: 1cm; TEXT-INDENT: -1cm
}
SPAN.fn {
MARGIN-LEFT: 1cm; TEXT-INDENT: -1cm
}
A:link {
COLOR: #004faf; TEXT-DECORATION: none
}
A:visited {
COLOR: #672967; TEXT-DECORATION: none
}
BODY {
BACKGROUND: #ffffff; COLOR: black; FONT-FAMILY: "Times New Roman"
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR bgColor=#e5e5e5>
<TD vAlign=center><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/index.html"><FONT
color=#004faf>主頁</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/classes.html"><FONT
color=#004faf>所有的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/mainclasses.html"><FONT
color=#004faf>主要的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/annotated.html"><FONT
color=#004faf>注釋的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/groups.html"><FONT
color=#004faf>分組的類</FONT></A> | <A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/functions.html"><FONT
color=#004faf>函數</FONT></A> </TD>
<TD vAlign=center align=right><IMG height=32
src="Qt教程一 —— 第五章:組裝積木.files/logo32.png" width=64 align=right
border=0></TD></TR></TBODY></TABLE>
<H1 align=center>Qt教程一 —— 第五章:組裝積木</H1>
<P>
<CENTER><IMG alt="Screenshot of tutorial five"
src="Qt教程一 —— 第五章:組裝積木.files/t5.png"></CENTER>
<P>這個例子顯示了創建幾個窗口部件并用信號和槽把它們連接起來,和如何處理重新定義大小事件。
<P><PRE>/****************************************************************
**
** Qt教程一 - 5
**
****************************************************************/
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication-h.html">qapplication.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpushbutton-h.html">qpushbutton.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider-h.html">qslider.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber-h.html">qlcdnumber.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qfont-h.html">qfont.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qvbox-h.html">qvbox.h</A>>
class MyWidget : public <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qvbox.html">QVBox</A>
{
public:
MyWidget( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A> *parent=0, const char *name=0 );
};
<A name=f550></A>MyWidget::MyWidget( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A> *parent, const char *name )
: <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qvbox.html">QVBox</A>( parent, name )
{
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpushbutton.html">QPushButton</A> *quit = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpushbutton.html">QPushButton</A>( "Quit", this, "quit" );
quit-><A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html#setFont">setFont</A>( QFont( "Times", 18, QFont::Bold ) );
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( quit, SIGNAL(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qbutton.html#clicked">clicked</A>()), qApp, SLOT(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication.html#quit">quit</A>()) );
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A> *lcd = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A>( 2, this, "lcd" );
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html">QSlider</A> * slider = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html">QSlider</A>( Horizontal, this, "slider" );
slider-><A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrangecontrol.html#setRange">setRange</A>( 0, 99 );
slider-><A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html#setValue">setValue</A>( 0 );
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( slider, SIGNAL(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html#valueChanged">valueChanged</A>(int)), lcd, SLOT(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#display">display</A>(int)) );
}
int main( int argc, char **argv )
{
<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication.html">QApplication</A> a( argc, argv );
MyWidget w;
a.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication.html#setMainWidget">setMainWidget</A>( &w );
w.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html#show">show</A>();
return a.<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication.html#exec">exec</A>();
}
</PRE>
<P>
<H2>一行一行地解說 </H2><A name=1></A>
<P><PRE> #include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qapplication-h.html">qapplication.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qpushbutton-h.html">qpushbutton.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider-h.html">qslider.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber-h.html">qlcdnumber.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qfont-h.html">qfont.h</A>>
#include <<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qvbox-h.html">qvbox.h</A>>
</PRE>
<P>這里顯示的是三個新的被包含的頭文件。qslider.h和qlcdnumber.h在這里是因為我們使用了兩個新的窗口部件,<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html">QSlider</A>和<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A>。qvbox.h在這里是因為我們使用了Qt的自動布局支持。
<P><PRE> class MyWidget : public <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qvbox.html">QVBox</A>
{
public:
MyWidget( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A> *parent=0, const char *name=0 );
};
</PRE>
<P><A name=constructor></A><PRE> MyWidget::MyWidget( <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A> *parent, const char *name )
: <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qvbox.html">QVBox</A>( parent, name )
{
</PRE>
<P>MyWidget現在繼承了<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qvbox.html">QVBox</A>,而不是<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qwidget.html">QWidget</A>。我們通過這種方式來使用QVBox的布局(它可以把它的子窗口部件垂直地放在自己里面)。重新定義大小自動地被QVBox處理,因此現在也就被MyWidget處理了。
<P><PRE> <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A> *lcd = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html">QLCDNumber</A>( 2, this, "lcd" );
</PRE>
<P><TT>lcd</TT>是一個QLCDNumber,一個可以按像LCD的方式顯示數字的窗口部件。這個實例被設置為顯示兩個數字,并且是<EM>this</EM>的子窗口部件。它被命名為“lcd”。
<P><PRE> <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html">QSlider</A> * slider = new <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html">QSlider</A>( Horizontal, this, "slider" );
<A name=x2247></A> slider-><A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrangecontrol.html#setRange">setRange</A>( 0, 99 );
<A name=x2248></A> slider-><A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html#setValue">setValue</A>( 0 );
</PRE>
<P><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html">QSlider</A>是一個經典的滑塊,用戶可以通過在拖動一個東西在一定范圍內調節一個整數數值的方式來使用這個窗口部件。這里我們創建了一個水平的滑塊,設置它的范圍是0~99(包括0和99,參見<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qrangecontrol.html#setRange">QSlider::setRange</A>()文檔)并且它的初始值是0。
<P><PRE> <A name=x2249></A><A name=x2246></A> <A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qobject.html#connect">connect</A>( slider, SIGNAL(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qslider.html#valueChanged">valueChanged</A>(int)), lcd, SLOT(<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#display">display</A>(int)) );
</PRE>
<P>這里我們是用了<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/signalsandslots.html">信號/槽機制</A>把滑塊的valueChanged()信號和LCD數字的display()槽連接起來了。
<P>無論什么時候滑塊的值發生了變化,它都會通過發射valueChanged()信號來廣播這個新的值。因為這個信號已經和LCD數字的display()槽連接起來了,當信號被廣播的時候,這個槽就被調用了。這兩個對象中的任何一個都不知道對方。這就是組件編程的本質。
<P>槽是和普通C++成員函數的方式不同,但有著普通C++成員函數的方位規則。
<P>
<H2>行為 </H2><A name=2></A>
<P>LCD數字反應了你對滑塊做的一切,并且這個窗口部件很好地處理了重新定義大小事件。注意當窗口被重新定義大小(因為它可以)的時候,LDC數字窗口部件也改變了大小,但是其它的還是和原來一樣(因為如果它們變化了,看起來好像很傻)。
<P>(請看<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-01.html#compiling">編譯</A>來學習如何創建一個makefile和連編應用程序。)
<P>
<H2>練習 </H2><A name=3></A>
<P>試著改變LCD數字,添加更多的數字或者<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qlcdnumber.html#setMode">改變模式</A>。你甚至可以添加四個按鈕來設置基數。
<P>你也可以改變滑塊的范圍。
<P>也許使用<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/qspinbox.html">QSpinBox</A>比滑塊更好?
<P>試著當LCD數字溢出的時候使這個應用程序退出。
<P>現在你可以進行<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-06.html">第六章</A>了。
<P>[<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-04.html">上一章</A>]
[<A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial1-06.html">下一章</A>]
[<A href="http://www.qtopia.org.cn/doc/qiliang.net/qt/tutorial.html">教程一主頁</A>]
<P><!-- eof -->
<P>
<ADDRESS>
<HR>
<DIV align=center>
<TABLE cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD>Copyright © 2002 <A href="http://www.trolltech.com/">Trolltech</A>
<TD><A href="http://www.trolltech.com/trademarks.html">Trademarks</A>
<TD><A
href="http://www.qtopia.org.cn/doc/qiliang.net/qt/zh_CN.html">譯者:Cavendish</A>
<TD align=right>
<DIV align=right>Qt
3.0.5版</DIV></TR></TBODY></TABLE></DIV></ADDRESS></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -