Qt入門(15)——使用視窗部件

尹成發表於2014-09-30
下面是如何建立一個你自己的視窗部件,描述如何控制一個視窗部件的最小大小和最大大小,並且介紹了視窗部件的名稱。
	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();
    }




這裡我們舉例說明了我們的新子視窗部件,把它設定為主視窗部件,並且執行這個應用程式。



#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();
}


相關文章