Ten przykład pokaże Ci jak utworzyć własny widget , jak kontrolować minimalne i maksymalne rozmiary widgetu, oraz wprowadza nazwy widgetów.
/**************************************************************** ** ** Qt tutorial 4 ** ****************************************************************/ #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 ); };Tutaj mamy nową klasę. Ponieważ dziedziczy ona po QWidgetcie, nowa klasa jest widgetem, może się także stać głównym widgetem lub widgetem dzieckiem (tak jak przycisk w rodziale trzecim).
Ta klasa ma tylko jednego członka - konstruktora (dodatkowo do tych, które dziedziczy po QWidget). Konstruktor jest standardowym widgetem konstruktora z Qt; powinieneś zawsze wybrać podobny konstruktor do kreowana własnych widgetów.
Pierwszym argumentem jest jego widget rodzicielski. Abu utworzyć słówne okno musisz podać pusty wskaźnik jako rodzica. Jak widzisz ten widget ustawia się jako główne okno.
Drugim argumentem jest nazwa widgetu. To nie jest tekst jaki pojawia się w belce tytułowej okna lub na przycisku. Jest to nazwa związana z widgetem co pozwala na wykonanie na nim później funkcji look up, istnieje także pomocna funkcja odpluskwiująca, która pozwala na wyświetlenie kompletnej hierarchii widgetu.
MyWidget::MyWidget( QWidget *parent, const char *name ) : QWidget( parent, name )Tu zaczyna się implementacja konstruktora. Tak jak w większości widgetów przekazuje prodzica i nazwę do konstruktora QWidget.
{ setMinimumSize( 200, 120 ); setMaximumSize( 200, 120 );Ponieważ widget nie wie jak obsłużyć zmianę rzomiaru, ustawimy jego rozmiary przez określnie maksimum i minimum na równe sobie. W następnym przykładzie pokażemy jak widget może odpowiadać na wydarzenia zmiany rozmiaru przez użytkownika.
QPushButton *quit = new QPushButton( "Quit", this, "quit" ); quit->setGeometry( 62, 40, 75, 30 ); quit->setFont( QFont( "Times", 18, QFont::Bold ) );Tu tworzymy i ustawiamy dziecko widget tego widgetu (nowym rodzicem witgetu jest ten), którego nazwą będzie "quit". Nazwa widgetu nie ma nic wspólnego z tekstem przycisku, po prostu są takie same w tym przypadku.
Zauważ, że quit jest lokalną zmienną w konstruktorze. MyWidget nie monitoruje go, lecz Qt tak, będzie domyślnie przeznaczony do skasowania, gdy skasowany zostanie MyWidget. Dlatego właśnie MyWidget nie wymaga destruktora. (Z drugiej strony, nic nie stanie się jeśli zdecydujesz się skasowac dziecko, automatycznie powiadomi ono Qt o swojej nieodwołanej śmierci)
Wywołanie setGeometry() czyni to samo co move() i resize() czyniło w poprzednich rozdziałach.
connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); }Ponieważ klasa MyWidget nie wie nic o objekcie aplikacji, musi się podłaczyc pod wskaźnik Qt, qApp.
Widget jest częścią oprogramowania i powinnien wiedzieć tak mało jak to tylko możliwe o swoim środowisku tak aby był możliwie najbardziej wykorzystywalny ponowinie.
Poznanie nazywy aplikacji złamało by tą zasadę, tak więc Qt oferuje alias, qApp, w przypadkach gdy MyWidget musi porozumieć się z objektem aplikacji.
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(); }Teraz pokażemy nasze dziecko, ustanowimy go głównym widgetem i wykonamy aplikację.
Ten program jest bardzo podobny w zachowaniu do poprzedniego. Różnica
leży w sposobie implementacji. Cóż trochę inaczej zachowuje się po prawdzie.
Gdy spróbujesz go roszerzyć zobaczysz dlaczego.
Spróbuj dodać więcej przycisków lub dodać dp widgetu więcej QPushButton'ów.
Możesz teraz przejść do rodziału piątego.
[Poprzedni tutorial] [Następny tutorial] [Główna strona tutoriala]
Copyright (c) 2000 Troll Tech | Znaki towarowe |
Wersja Qt 2.1.0
|