Home

Klasy - Adnotacje - Drzewo - Funkcje - Powrót - Struktura

Rozdział 6: To są dopiero klocki !

Screenshot of tutorial six

Ten przykład pokazuje jak kapsułkować dwa widgety do nowego komponentu i jak łatwe jest użycie wielu widgetów. Po raz pierwszy użyjemy własnego widgetu jako dziecka.

/****************************************************************
**
** Qt tutorial 6
**
****************************************************************/

#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 c = 0 ; c < 4 ; c++ )
        for( int r = 0 ; r < 4 ; r++ )
            (void)new LCDRange( grid );
}

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

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

Analiza kodu linia po linii

    class LCDRange : public QVBox
    {
    public:
        LCDRange( QWidget *parent=0, const char *name=0 );
    };
Widget LCDRange jest widgetem bez żadnego API. Jest tylko konstruktorem. Widgety tego typu nie są zbyt przydatne, w przyszłości użyjemy widgetu z dodatkiem 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)) );
    }
Ta część jest wzięta prosto z konstruktora MyWidget z rodziału piątego. Jedynimi rożnicami jest umieszczenie przycisku po lewej stronie, a klasa ma inną nazwę.
    class MyWidget : public QVBox
    {
    public:
        MyWidget( QWidget *parent=0, const char *name=0 );
    };
MyWidget, także nie zawiera API poza konstruktorem.
    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()) );
Przycisk, który był w miejscu gdzie teraz jest LCDRange został odseparowany, tak, że mamy jeden przycisk "Quit" oraz wiele objektówLCDRange.
        QGrid *grid = new QGrid( 4, this );
Tworzymy objekt siatkę QGrid z czterema kolumnami. Widget QGRid automatycznie ustawia swoje dzieci w wierszach i kolumnach; można podać liczbę wierszy i kolumn, a QGrid odkryje nowe dzieci i wstawi je do siatki.
        for( int c = 0 ; c < 4 ; c++ )
            for( int r = 0 ; r < 4 ; r++ )
                (void)new LCDRange( grid );
Cztery kolumny, cztery wiersze.

Tworzymy 4*4 LCDRanges, wszystkie jako dzieci objektu siatki. Widget QGrid ustawi je sam.

    }
To wszystko.

Zachowanie

Ten program pokazuje jak łatwo używać jest wielu widgetów w tym samym czasie. Każdy z nich zachowuje się jak suwak i wyświetlacz LCD z poprzedniego rozdziału. Po raz kolejny różnica tkwi w implementacji.

Ćwiczenia

Zainicjalizuj każdy slider w z różną/przypadkową wartością.

Źródło zawiera trzy wystąpienia "4". Co by się stało gdybyś zmienił jedno z wywołań konstruktora QGrid ? Co z pozostałymi dwoma ? Dlaczego tak jest ?

Możesz teraz przejść do rozdziału siódmego.

[Poprzedni tutorial] [Następny tutorial] [Główna strona tutoriala]
 

Copyright (c) 2000 Troll Tech Znaki towarowe
Wersja Qt 2.1.0