Qt入門(17)——組裝複雜的控制元件

尹成發表於2014-09-30
下面是如何把兩個視窗部件封裝成一個新的元件。首先,我們使用一個自定義的視窗部件作為一個子視窗部件。


#include <qapplication.h>
#include <qpushbutton.h>
#include <qslider.h>
#include <qlcdnumber.h>
#include <qfont.h>
#include <qvbox.h>
#include <qgrid.h>


class LCDRange : public QVBox
{
public:
    LCDRange( QWidget *parent=0, const char *name=0 );
};


LCDRange::LCDRange( QWidget *parent, const char *name )
        : QVBox( parent, name )
{
    QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );
    QSlider * slider = new QSlider( Horizontal, this, "slider" );
    slider->setRange( 0, 99 );
    slider->setValue( 0 );
    connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );
}


class MyWidget : public QVBox
{
public:
    MyWidget( QWidget *parent=0, const char *name=0 );
};




MyWidget::MyWidget( QWidget *parent, const char *name )
        : QVBox( parent, name )
{
    QPushButton *quit = new QPushButton( "Quit", this, "quit" );
    quit->setFont( QFont( "Times", 18, QFont::Bold ) );


    connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );


    QGrid *grid = new QGrid( 4, this );


    for( int r = 0 ; r < 4 ; r++ )
        for( int c = 0 ; c < 4 ; c++ )
            (void)new LCDRange( grid );
}


int main( int argc, char **argv )
{
    QApplication a( argc, argv );


    MyWidget w;
    a.setMainWidget( &w );
    w.show();
    return a.exec();
}



解釋:
    class LCDRange : public QVBox
    {
    public:
        LCDRange( QWidget *parent=0, const char *name=0 );
    };


LCDRange視窗部件是一個沒有任何API的視窗部件。它只有一個建構函式。這種視窗部件不是很有用,所以我們一會兒會加入一些API。

    LCDRange::LCDRange( QWidget *parent, const char *name )
            : QVBox( parent, name )
    {
        QLCDNumber *lcd  = new QLCDNumber( 2, this, "lcd"  );
        QSlider * slider = new QSlider( Horizontal, this, "slider" );
        slider->setRange( 0, 99 );
        slider->setValue( 0 );
        connect( slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)) );
    }



這裡直接利用了第五章裡面的MyWidget的建構函式。唯一的不同是按鈕被省略了並且這個類被重新命名了。

    class MyWidget : public QVBox
    {
    public:
        MyWidget( QWidget *parent=0, const char *name=0 );
    };



MyWidget也是除了一個建構函式之外沒有包含任何API。
    MyWidget::MyWidget( QWidget *parent, const char *name )
            : QVBox( parent, name )
    {
        QPushButton *quit = new QPushButton( "Quit", this, "quit" );
        quit->setFont( QFont( "Times", 18, QFont::Bold ) );


        connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );




這個按鈕被放在LCDRange中,這樣我們就有了一個“Quit”按鈕和許多LCDRange物件。


        QGrid *grid = new QGrid( 4, this );
我們建立了一個四列的QGrid物件。這個QGrid視窗部件可以自動地把自己地子視窗部件排列到行列中,你可以指定行和列的數量,並且QGrid可以發現它的新子視窗部件並且把它們安放到網格中。


        for( int r = 0 ; r < 4 ; r++ )
            for( int c = 0 ; c < 4 ; c++ )
                (void)new LCDRange( grid );
四行,四列。


我們建立了一個4*4個LCDRanges,所有這些都是這個grid物件的子視窗部件。這個QGrid視窗部件會安排它們。


    }
這就是全部了。

相關文章