Qt教程 使用窗口部件 (4)
繼續(xù)Qt教程第三章的講解,本文章這個(gè)例子顯示了如何創(chuàng)建一個(gè)你自己的窗口部件,描述如何控制一個(gè)窗口部件的最小大小和***大小,并且介紹了窗口部件的名稱。
- #include <qapplication.h>
- #include <qpushbutton.h>
- #include <qfont.h>
- class MyWidget : public QWidget
- {
- public:
- MyWidget( QWidget *parent=0, const char *name=0 );
- };
- MyWidget::MyWidget( QWidget *parent, const char *name )
- : QWidget( parent, name )
- {
- setMinimumSize( 200, 120 );
- setMaximumSize( 200, 120 );
- QPushButton *quit = new QPushButton( "Quit", this, "quit" );
- quit->setGeometry( 62, 40, 75, 30 );
- quit->setFont( QFont( "Times", 18, QFont::Bold ) );
- connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
- }
- int main( int argc, char **argv )
- {
- QApplication a( argc, argv );
- MyWidget w;
- w.setGeometry( 100, 100, 200, 120 );
- a.setMainWidget( &w );
- w.show();
- return a.exec();
- }
解說 :
- class MyWidget : public QWidget
- {
- public:
- MyWidget( QWidget *parent=0, const char *name=0 );
- };
這里我們創(chuàng)建了一個(gè)新類。因?yàn)檫@個(gè)類繼承了QWidget,所以新類是一個(gè)窗口部件,并且可以最為一個(gè)頂層窗口或者子窗口部件(像第三章里面的按鈕)。
這個(gè)類只有一個(gè)成員函數(shù),構(gòu)造函數(shù)(加上從QWidget繼承來的成員函數(shù))。這個(gè)構(gòu)造函數(shù)是一個(gè)標(biāo)準(zhǔn)的Qt窗口部件構(gòu)造函數(shù),當(dāng)你創(chuàng)建窗口部件時(shí),你應(yīng)該總是包含一個(gè)相似的構(gòu)造函數(shù)。
***個(gè)參數(shù)是它的父窗口部件。為了生成一個(gè)頂層窗口,你指定一個(gè)空指針作為父窗口部件。就像你看到的那樣,這個(gè)窗口部件默認(rèn)地被認(rèn)做是一個(gè)頂層窗口。
第二個(gè)參數(shù)是這個(gè)窗口部件的名稱。這個(gè)不是顯示在窗口標(biāo)題欄或者按鈕上的文本。這只是分配給窗口部件的一個(gè)名稱,以后可以用來查找這個(gè)窗口部件,并且這里還有一個(gè)方便的調(diào)試功能可以完整地列出窗口部件層次。
- MyWidget::MyWidget( QWidget *parent, const char *name )
- : QWidget( parent, name )
構(gòu)造函數(shù)的實(shí)現(xiàn)從這里開始。像大多數(shù)窗口部件一樣,它把parent和name傳遞給了QWidget的構(gòu)造函數(shù)。
- {
- setMinimumSize( 200, 120 );
- setMaximumSize( 200, 120 );
因?yàn)檫@個(gè)窗口部件不知道如何處理重新定義大小,我們把它的最小大小和***大小設(shè)置為相等的值,這樣我們就確定了它的大小。在下一章,我們將演示窗口部件如何響應(yīng)用戶的重新定義大小事件。
- QPushButton *quit = new QPushButton( "Quit", this, "quit" );
- quit->setGeometry( 62, 40, 75, 30 );
- quit->setFont( QFont( "Times", 18, QFont::Bold ) );
這里我們創(chuàng)建并設(shè)置了這個(gè)窗口部件的一個(gè)名稱為“quit”的子窗口部件(新窗口部件的父窗口部件是this)。這個(gè)窗口部件名稱和按鈕文本沒有關(guān)系,只是在這一情況下碰巧相似。
注意quit是這個(gè)構(gòu)造函數(shù)中的局部變量。MyWidget不能跟蹤它,但Qt可以,當(dāng)MyWidget被刪除的時(shí) 候,默認(rèn)地它也會(huì)被刪除。這就是為什么MyWidget不需要一個(gè)析構(gòu)函數(shù)的原因。(另外一方面,如果你選擇刪除一個(gè)子窗口部件,也沒什么壞處,這個(gè)子窗 口部件會(huì)自動(dòng)告訴Qt它即將死亡。)
- setGeometry()調(diào)用和上一章的move()和resize()是一樣的。
- connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
- }
因?yàn)镸yWidget類不知道這個(gè)應(yīng)用程序?qū)ο?,它不得不連接到Qt的指針,qApp。
一個(gè)窗口部件就是一個(gè)軟件組件并且它應(yīng)該盡量少地知道關(guān)于它的環(huán)境,因?yàn)樗鼞?yīng)該盡可能的通用和可重用。
知道了應(yīng)用程序的名稱將會(huì)打破上述原則,所以在一個(gè)組件,比如MyWidget,需要和應(yīng)用程序?qū)ο髮υ挼倪@種情況下,Qt提供了一個(gè)別名,qApp。
- int main( int argc, char **argv )
- {
- QApplication a( argc, argv );
- MyWidget w;
- w.setGeometry( 100, 100, 200, 120 );
- a.setMainWidget( &w );
- w.show();
- return a.exec();
- }
這里我們舉例說明了我們的新子窗口部件,把它設(shè)置為主窗口部件,并且執(zhí)行這個(gè)應(yīng)用程序。
行為
這個(gè)程序和上一章的在行為上非常相似。不同點(diǎn)是我們實(shí)現(xiàn)的方式。無論如何它的行為還是有一些小差別。試試改變它的大小,你會(huì)看到什么?
【編輯推薦】