Qt教程 使用窗口部件 (4)
繼續Qt教程第三章的講解,本文章這個例子顯示了如何創建一個你自己的窗口部件,描述如何控制一個窗口部件的最小大小和***大小,并且介紹了窗口部件的名稱。
- #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 );
- };
這里我們創建了一個新類。因為這個類繼承了QWidget,所以新類是一個窗口部件,并且可以最為一個頂層窗口或者子窗口部件(像第三章里面的按鈕)。
這個類只有一個成員函數,構造函數(加上從QWidget繼承來的成員函數)。這個構造函數是一個標準的Qt窗口部件構造函數,當你創建窗口部件時,你應該總是包含一個相似的構造函數。
***個參數是它的父窗口部件。為了生成一個頂層窗口,你指定一個空指針作為父窗口部件。就像你看到的那樣,這個窗口部件默認地被認做是一個頂層窗口。
第二個參數是這個窗口部件的名稱。這個不是顯示在窗口標題欄或者按鈕上的文本。這只是分配給窗口部件的一個名稱,以后可以用來查找這個窗口部件,并且這里還有一個方便的調試功能可以完整地列出窗口部件層次。
- MyWidget::MyWidget( QWidget *parent, const char *name )
- : QWidget( parent, name )
構造函數的實現從這里開始。像大多數窗口部件一樣,它把parent和name傳遞給了QWidget的構造函數。
- {
- 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 ) );
這里我們創建并設置了這個窗口部件的一個名稱為“quit”的子窗口部件(新窗口部件的父窗口部件是this)。這個窗口部件名稱和按鈕文本沒有關系,只是在這一情況下碰巧相似。
注意quit是這個構造函數中的局部變量。MyWidget不能跟蹤它,但Qt可以,當MyWidget被刪除的時 候,默認地它也會被刪除。這就是為什么MyWidget不需要一個析構函數的原因。(另外一方面,如果你選擇刪除一個子窗口部件,也沒什么壞處,這個子窗 口部件會自動告訴Qt它即將死亡。)
- setGeometry()調用和上一章的move()和resize()是一樣的。
- connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
- }
因為MyWidget類不知道這個應用程序對象,它不得不連接到Qt的指針,qApp。
一個窗口部件就是一個軟件組件并且它應該盡量少地知道關于它的環境,因為它應該盡可能的通用和可重用。
知道了應用程序的名稱將會打破上述原則,所以在一個組件,比如MyWidget,需要和應用程序對象對話的這種情況下,Qt提供了一個別名,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();
- }
這里我們舉例說明了我們的新子窗口部件,把它設置為主窗口部件,并且執行這個應用程序。
行為
這個程序和上一章的在行為上非常相似。不同點是我們實現的方式。無論如何它的行為還是有一些小差別。試試改變它的大小,你會看到什么?
【編輯推薦】