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