Tento príklad ukazuje ako vytvoriť vlastný widget, ako riadiť mimimálne a maximálne veľkosti widgetov, a uvádza mená widgetov.
/**************************************************************** ** ** 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 ); };
Tu vytvárame novú triedu. Keďže táto trieda je potomkom QWidget, nová trieda je widget a môže byť hlavným oknom alebo dcérskym widgetom (tak ako tlačidlo v kapitole tri).
Táto trieda má len jedného člena, konštruktor (a samozrejme členov zdedených od QWidget). Konštruktor je štandardný konštruktor Qt widgetu; mali by ste vždy použiť podobný konštruktor, keď budete tvoriť widgety.
Prvý argument je rodičovský widget. Na vytvorenie hlavného okna zadajte rodiča ako null pointer. Ako vidíte, widget je defaultne vytváraný ako hlavné okno.
Druhý argument je meno widgetu. Nie je to text, ktorý sa zobrazuje v titulku okna alebo na tlačidle. Je to meno asociované s widgetom, aby ho bolo možné neskôr nájsť. Mená widgetov sa stanú skutočne užitočné, keď bude hotový Qt GUI dizajnér (vizuálne vývojové prostredie).
MyWidget::MyWidget( QWidget *parent, const char *name ) : QWidget( parent, name )
Tu začína implementácia konštruktoru. Ako všetky widgety,
len posúva rodiča
a meno
konštruktoru
triedy QWidget.
{ setMinimumSize( 200, 120 ); setMaximumSize( 200, 120 );
Pretože tento widget nevie ako spracovať zmenu veľkosti, zafixujeme jeho veľkosť nastavením minimálnej a maximálnej veľkosti na rovnakú hodnotu. V nasledujúcej kapitole si ukážeme, ako môže widget odpovedať na udalosť zmeny veľkosti užívateľom.
QPushButton *quit = new QPushButton( "Quit", this, "quit" ); quit->setGeometry( 62, 40, 75, 30 ); quit->setFont( QFont( "Times", 18, QFont::Bold ) );
Tu vytvárame a nastavujeme dcérsky widget tohto widgetu (rodič nového
widgetu je nastavený na this
), ktorý má meno widgetu "quit".
Meno widgetu nemá nič spoločné s textom tlačidla, tentokrát sú náhodou podobné.
Všimnite si, že quit
je lokálna premenná konštruktora.
MyWidget neudržiava jeho stopu, ale Qt áno, a zruší ho v prípade,
že MyWidget bude zrušené. Preto MyWidget nepotrebuje deštruktor.
Na druhej strane neexistuje žiadne nebezpečenstvo pri mazaní dcérskeho
widgetu, ak sa tak rozhodnete, dcérsky objekt svoju "smrť" automaticky
oznámi Qt.
Volanie setGeometry() robí to isté, čo move() a resize() v predchádzajúcich kapitolách.
connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); }
Pretože trieda MyWidget nevie nič o aplikačnom objekte, musí
sa pripájať na Qt smerník naň, qApp.
Widget je softvérový komponent a mal by vedieť čo najmenej o svojom okolí z dôvodu čo najväčšej všeobecnosti a použiteľnosti.
Poznanie mena objektu aplikácie by porušilo tento princíp, preto Qt poskytuje alias, qApp, pre tie zriedkavé prípady, keď komponent ako napr. MyWidget potrebuje komunikovať s aplikačným objektom.
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(); }
Tu vyrábame inštanciu nášho nového dieťatka, nastavujeme ju ako hlavné okno a spúšťame aplikáciu.
Tento program sa správa veľmi podobne ako predchádzajúci. Rozdiel je v spôsobe, ako sme ho implementovali. Ale rozdiel tu predsa je. Len skúste zmeniť jeho veľkosť a uvidíte.
Skúste vytvoriť iný objekt triedy MyWidget vo funkcii main(). Čo sa stane?
Skúste pridať viac tlačidiel, alebo vložiť iné widgety ako QPushButton.
Farba pozadia môže byť zmenená.
Teraz môžete ísť na kapitolu päť.
[Predchádzajúci tutoriál] [Ďalší tutoriál] [Hlavná stránka tutoriálu]
Copyright © 1998 Troll Tech | Trademarks | Qt version 1.42
|