Egyszerű, egyablakos alkalmazások. vezérlők, ablakok, elrendezők

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 2. előadás. Egyszerű, egyablakos alkalmazások

Alkalmazott modul: Programozás 12. előadás. Grafikus felületű alkalmazások fejlesztése

Eseményvezérelt alkalmazások fejlesztése I 2. előadás. Egyszerű, egyablakos alkalmazások. Egyszerű, egyablakos alkalmazások

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

Dinamikus felületű alkalmazások. Stílusok, időzítő, képek

Elemi alkalmazások fejlesztése III. A Qt assistant elindítása. Ajánlott ir odalom. A Qt assistant nyitó ablaka

Eseményvezérelt alkalmazások fejlesztése I 3. előadás. Dinamikus felületű alkalmazások. Giachetta Roberto

Elemi alkalmazások fejlesztése III

A Java nyelv. Dialógus ablakok. Elek Tibor

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.

QLabel *label = new Qlabel("Hello Qt!",0);

2. Beadandó feladat dokumentáció

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Grafikus Qt programok írása segédeszközök nélkül

Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál. Saját vezérlő használata tervezőben (worldclocks)

2. Beadandó feladat dokumentáció

Elemi alkalmazások fejlesztése III.

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Elemi alkalmazások fejlesztése III.

3. Beadandó feladat dokumentáció

Elemi alkalmazások fejlesztése III

Budapest, március. ELTE Informatikai Kar

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Programozási technológia

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

Választó lekérdezés létrehozása

3. Beadandó feladat dokumentáció

Programozási technológia

9. óra operációs rendszerek. Grafikus operációs rendszer

Eseménykezelés. Aszinkron kommunikáció

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Swing GUI készítése NetBeans IDE segítségével

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

3D-s számítógépes geometria és alakzatrekonstrukció

Felhasználói dokumentáció. a TávTagTár programhoz. Készítette: Nyíri Gábor, hdd@nc-studio.com GDF Abakusz regisztrációs kód: GDFAba43

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

E-Freight beállítási segédlet

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 3/3

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Osztályok. 4. gyakorlat

Elemi alkalmazások fejlesztése III.

Java programozási nyelv 6. rész Java a gyakorlatban

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

18. Szövegszerkesztők

Az importálás folyamata Felhasználói dokumentáció verzió 2.1.

Feladat. Tervezés és implementálás

Thermo1 Graph. Felhasználói segédlet

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Operációs rendszerek. Tanmenet

Tájékoztató. Használható segédeszköz: -

3. Osztályok II. Programozás II

Tájékoztató. Használható segédeszköz: -

Ügyfélforgalom számlálás modul

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Adatkezelés speciális eszközökkel. Giachetta Roberto

BASH script programozás II. Vezérlési szerkezetek

Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Bizonylatok felvitele mindig a gazdasági eseménnyel kezdődik, majd ezután attól függően jelennek meg dinamikusan a további adatmezők.

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Java programozási nyelv 4. rész Osztályok II.

Adatintegritás ellenőrzés Felhasználói dokumentáció verzió 2.0 Budapest, 2008.

1. Alapok. Programozás II

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

Összetett alkalmazások

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Eseményvezérelt alkalmazások fejlesztése I 6. előadás. Összetett alkalmazások megvalósítása. Giachetta Roberto

Már megismert fogalmak áttekintése

A WORDPRESS TESTRESZABÁSA (MEGJELENÉS MENÜ ELEMEI)

BME MOGI Gépészeti informatika 8.

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Összetett grafikus felületű alkalmazások. Giachetta Roberto

Az alábbiakban szeretnénk segítséget nyújtani Önnek a CIB Internet Bankból történő nyomtatáshoz szükséges böngésző beállítások végrehajtásában.

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 2/3

HVK Adminisztrátori használati útmutató

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

LEADER. Helyi Fejlesztési Stratégiák. tervezését támogató alkalmazás

Programozás 6. Dr. Iványi Péter

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

TABULÁTOROK TÁBLÁZATOK KÉSZÍTÉSE. A táblázatok készítésének lehetőségei:

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Bevezetés a Python programozási nyelvbe

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 6.ELŐADÁS. Fájlkezelés PHP-ben

Elemi Alkalmazások Fejlesztése II.

Felhasználói kézikönyv - Android kliens

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

A jobboldalon a pnlright egy Stacked Widget Állítsuk be az első lapot és nevezzük el pnldraw-ra:

ArcGIS 8.3 segédlet 5. Dr. Iványi Péter

Átírás:

Egyszerű, egyablakos alkalmazások vezérlők, ablakok, elrendezők

Vezérlők Egy eseményvezérelt alkalmazás speciális objektumokból, úgynevezett vezérlőkből áll. A vezérlők olyan elemek, amelyek események kezelésére és szignálok kiváltására alkalmasak. Számos esetben egy rájuk jellemző grafikus megjelenés is tartozik hozzájuk. A vezérlők osztályai (akár előre definiáltak, akár sajátok) objektumorientáltan valósulnak meg: származtatás segítségével szerveződnek hierarchiába. Minden QObject-ből származó osztály példánya egy vezérlő, ennél fogva kihasználja a Qt speciális vonásait, azaz eseményeket definiál és vált ki (aszinkron üzenet), eseménykezelőkkel, tulajdonságokkal rendelkezik, időzítés kezelésre alkalmas. a QObject példányok nem másolhatóak, ezért jórész mutatók és referenciák segítségével kezeljük őket 2

Tulajdonságok szabályozása A vezérlők tulajdonságai az adattagjainak lekérdező (getter), illetve beállító (setter) műveleteinek segítségével szabályozhatók a lekérdező művelet neve a tulajdonság neve, a beállító művelet tartalmaz egy set előtagot QLabel mylabel; // címke létrehozása mylabel.settext("hello World!"); // beállítjuk a címke szövegét(text) QString text = mylabel.text(); // lekérdezzük a címke szövegét 3

Szövegkezelés Qt-ben a karakterek 16 bites Unicode (UTF8) kódolásúak. Ehhez már a QObject típus biztosít konverziót egy osztályszintű művelettel (QObject::trUtf8). A karakterek kezelését a QChar típus biztosítja, míg szövegre a QString típus alkalmazható. kompatibilis a C++ standard könyvtár string típusával, pl.: QString::fromSTDString(stdstr) megkülönbözteti az üres és a nem létező szöveget (isnull, isempty) alkalmas típuskonverziókra, pl.: QString::number(4), str.toint() 4

Vezérlők grafikus tulajdonságai A grafikus megjelenéssel is rendelkező vezérlők (grafikus vezérlők) a QWidget osztályból származnak (amely a QObject alosztálya). Fontosabb tulajdonságaik: méret (size), vagy geometria (elhelyezkedés és méret, geometry) A vezérlők mérete többféleképpen befolyásolható: változtatható méretűek esetén külön állítható minimum (minimumsize), maximum (maximumsize), valamint az alapértelmezett (basesize) méret. A méret rögzíthető (setfixedsize). szöveg (text), betűtípus (font), stílus (stylesheet), színpaletta (palette), előugró szöveg (tooltip) A grafikus vezérlőkön (pl. QLabel, QLineEdit) elhelyezett szöveg formázható több módon pl. formátummal (textformat), vagy HTML formázó utasításokkal. fókuszáltság (focus), láthatóság (visible) engedélyezés (használható-e a vezérlő, enabled) 5

Példa #include <QPushButton> #include <QLabel> int main(int argc, char *argv[]) { QPushButton mybutton; // gomb mybutton.resize(75, 30); // méret mybutton.setfont(qfont("times", 20)); // betűtípus mybutton.settext("<h1>my Button<h1><br>This is my button!"); // formázott szöveg mybutton.settooltip("you can try klicking on it..."); // előugró szöveg mybutton.show(); // gomb megjelenítése ablakként 6

Grafikus vezérlők A leggyakrabban használt (előre definiált) grafikus vezérlők: címke (QLabel) LCD kijelző (QLCDNumber), folyamatjelző (QProgressBar) nyomógomb (QPushButton), kijelölő gomb (QCheckBox), rádiógomb (QRadioButton) szövegmező (QLineEdit), szövegszerkesztő (QTextEdit) legördülő mező (QComboBox) dátumszerkesztő (QDateEdit), időszerkesztő (QTimeEdit) csoportosító (QGroupBox), elrendező (QLayout) menü (QMenu), eszköztár (QToolBox) 7

Példák GUI alkalmazásokra vezérlő (szövegmező) vezérlő (címke) ablakcím fejléc fókuszált vezérlő (nyomógomb) vezérlő (táblanézet) ablakfelület (rajzolva) vezérlőben lévő vezérlő (kijelölőmező) 8

Grafikus vezérlők hierarchiája Egy alkalmazás grafikus vezérlői között elhelyezkedési hierarchiát állíthatunk fel, amely egy fának megfelelő struktúrával reprezentálható. A vezérlőnek lehet szülője (parent), amelyen belül található. A vezérlő szülőjét konstruktor paraméterben, vagy a parent tulajdonságon keresztül adhatjuk meg. A vezérlőnek lehetnek gyerekei (children), azon vezérlők, amelyek rajta helyezkednek el. Ha egy szülő vezérlőt elrejtünk/megjelenítünk, ki-/bekapcsolunk, vagy megsemmisítünk, akkor az összes gyerekein is megtörténik ugyanez a tevékenység. 9

Ablakok Egy grafikus felhasználói felület ablakokból tevődik össze, amelyeken vezérlőket helyezünk el. A Qt-ben ablaknak minősül bármely grafikus vezérlő (azaz egy Qwidgetnek, vagy annak leszármazottjának példánya), amelynek nincs szülője. Az ablak speciális tulajdonságai: cím (windowtitle), ikon (windowicon) vagy akár ezek nélkül: setwindowstate(qt::windowfullscreen) mérete állítható teljes/normál képernyőre, vagy a tálcára (showmaximized, shownormal, showminimized) egyszerre csak egy aktív ablak lehet (isactivewindow), amelyet az activewindow() metódus tesz fókuszba. Egy ablak lehet modális (modal), ha megnyitása után csak a bezárásával lehet az alkalmazás másik ablakát fókuszba tenni, illetve nem modális (modeless), ha bezárása nélkül át tudunk váltani az alkalmazás másik ablakára. 10

Grafikus vezérlő az ablakban Amennyiben egy grafikus vezérlőt egy ablakban helyezünk el, meg kell adnunk az elhelyezkedését (geometriáját), azaz a pozícióját és méretét (setgeometry(int, int, int, int)). Az ablak koordinátarendszere a bal felső sarokból indul a (0,0) koordinátával, és balra, illetve lefelé növekszik. (0,0) ablak (width(),height()) Az ablak területébe nem számoljuk bele az ablak fejlécének területét, amit külön lekérdezhetünk (framegeometry). 11

Példa QWidget mywidget; mywidget.setbasesize(200, 120); mywidget.setwindowtitle("demo Window"); // ablak létrehozása // méretezés // ablakcímke megadása QPushButton quitbutton("quit", &mywidget); // gomb az ablakra quitbutton.setgeometry(10, 40, 180, 40); // elhelyezés az ablakon QObject::connect(&quitButton, SIGNAL(clicked()),&app, SLOT(quit())); window.show(); // ablak megjelenítése 12

1.Feladat Készítsünk egy egyszerű alkalmazást, amelyben egy csúszkával állíthatunk egy digitális kijelzőn megjelenő számot. 14

1.Feladat: tervezés Az alkalmazás számára létrehozunk egy új ablak osztályt (NumberWidget), felhelyezünk rá egy csúszkát (QSlider), és egy számkijelzőt (QLCDNumber). Az összekötéseket a konstruktorban megfogalmazhatjuk, így már csak a destruktort kell megvalósítanunk, amely törli a vezérlőket. NumberWidget QWidget - _slider :QSlider* - _lcdnumber :QLCDNumber* + NumberWidget(QWidget*) + ~NumberWidget() 15

1.Feladat: tervezés user w : NumberWidget _slider :QSlider _lcdnumber :QLCDNumber setvalue(int) valuechanged(int) display(int) csúszka változását jelző szignál kijelzőt beállító eseménykezelő close() Összekötjük a csúszka változását jelző szignálját a kijelzőt beállító eseménykezelővel 16

1.Feladat: megvalósítás NumberWidget::NumberWidget(QWidget *parent) : QWidget(parent) { setwindowtitle("number Display"); // ablakcím setfixedsize(300, 175); // rögzített méret beállítása _slider = new QSlider(this); // a vezérlő szülője az ablak _slider->setminimum(0); // számhatárok beállítása _slider->setmaximum(1000); _slider->setvalue(0); // aktuális érték beállítása _slider->setorientation(qt::horizontal);// csúszkairány _slider->setgeometry(5, 5, 290, 30); // elhelyezkedés _lcdnumber = new QLCDNumber(4, this); // a számjegyek száma _lcdnumber->display(0); // érték megjelenítése _lcdnumber->setgeometry(5, 50, 290, 120); } connect(_slider, SIGNAL(valueChanged(int)), _lcdnumber, SLOT(display(int))); 17

Speciális ablakok Főablak (QMainWindow), amely az alkalmazás grafikus vezérlőinek tárolására szolgál. Számos kiegészítést biztosít összetett ablakok megvalósítására: menübár, állapotsor, ikonbár, beágyazott ablakok kezelése Dialógus ablakok a Qdialog osztályból származtatott osztályok példányai, amelyek lezárása után lekérdezhetjük az annak használata során megadott felhasználói választásokat, vagy éppen a kilépésre használt gombot. 18

Dialógus ablakok Egy dialógus ablak megjelenítésének módja modális, ha ehhez az exec() metódust használjuk, nem modális, ha ehhez a show() metódust használjuk, feltéve, hogy nem állítottuk a setmodal() metódussal eleve modálisra. A dialógus ablakokat az accept()vagy a reject() eseménykezelővel zárhatjuk be: modális hívás esetén az exec() metódus igaz értékkel tér vissza, ha az accept()-et használjuk, hamissal, ha a reject()-et. Számos előre definiált dialógus ablak létezik: Rögzített dialógusok: QFileDialog, QColorDialog, QFontDialog, QPrintDialog, QInputDialog, QProgressDialog, QErrorMessage. Konfigurálható üzenőablak (QMessageBox), amely alkalmas üzenet (information), hiba (critical), figyelmeztetés (warning) közlésére, vagy kérdés (question) feltételére. QMessageBox::question(this, "Confirm", "Do you want to exit?", QMessageBox::Yes QMessageBox::Default, QMessageBox::No); 19

Egyedi események és kezelőik A saját osztályainkban lehetőségünk van egyedi szignálok és egyedi eseménykezelők definiálására. Ehhez az osztályt el kell látni a Q_OBJECT makróval, és a QObject osztály leszármazottjának kell lennie. Új eseményeket az osztálydefiníció signals részében, új eseménykezelőket az osztálydefiníció slots részében helyezzük el. Az eseménykezelőnek adhatunk láthatóságot is. Eseményeket csak deklarálni kell, az eseménykezelőket definiálni is (void típussal), tetszőleges paraméterezéssel. class MyObject : public QObject { Q_OBJECT // ekkor definiálható esemény és eseménykezelő signals: // saját események void mysignal(int param); public slots: // publikus eseménykezelők void myslot(int param){ } }; 20

Események paraméterezése Az esemény paraméterátadását az eseménykezelőnek a társításnál adhatjuk meg, pl.: connect(this, SIGNAL(mySignal(int)), this, SLOT(mySlot(int))); a paraméterek átadása sorrendben történik, ezért csak a típust jelezzük az eseménynek legalább annyi paraméterrel kell rendelkeznie, mint az eseménykezelőnek lehetnek alapértelmezett paraméterek is, pl.: signals: void mysignal(int param = 0); 21

2.Feladat Készítsünk egy egyszerű alkalmazást, amelyben egy szavakból álló listát jelenítünk meg, amely tartalmát egy szövegdoboz segítségével szűrhetjük. A szavakat szöveges állományból töltjük be. 22

2.Feladat: tervezés Az új ablak (FilteredListWidget) grafikus felülete tartalmaz egy listamegjelenítőt (QListWidget) és egy szövegdobozt (QLineEdit) egy címkével (QLabel). A háttérben a szűretlen szavak listáját egy szöveglistában tároljuk (QStringList). Ezt az input.txt fájlból töltjük fel (loaditems()) Qt-s fájlkezelést használva (QFile). Szükségünk van továbbá egy egyedi eseménykezelőre (filterlist()), amely a szűrést elvégzi. FilteredListWidget QWidget - _itemstringlist :QStringList - _querylabel :QLabel* - _querylineedit :QLineEdit* - _resultlistwidget :QListWidget* + FilteredListWidget(QWidget*) + ~FilteredListWidget() - loaditems(qstring) :void «slot» - filterlist() :void 23

2.Feladat: megvalósítás FilteredListWidget::FilteredListWidget(QWidget *parent) : QWidget(parent) { setfixedsize(256, 232); setwindowtitle(trutf8("szűrés listára")); _querylabel = new QLabel(trUtf8("Szűrés:"), this); _querylabel->setgeometry(2, 2, 50, 20); _querylineedit = new QLineEdit(this); _querylineedit->setgeometry(54, 2, 200, 25); _resultlistwidget = new QListWidget(this); _resultlistwidget->setgeometry(2, 30, 252, 200); connect(_querylineedit, SIGNAL(textChanged(QString)), this, SLOT(filterList())); } loaditems("input.txt"); egyedi kezelés hozzárendelése a textchanged szignálhoz 24

2.Feladat: megvalósítás void FilteredListWidget::filterList() { _resultlistwidget->clear(); // kitöröljük a korábbi tartalmat } if (_querylineedit->text().isnull()) { // ha nincs szűrés _resultlistwidget->additems(_itemstringlist); // mindent felveszünk a listára } else { // ha van szűrés for (int i = 0; i < _itemstringlist.size(); i++) if (_itemstringlist[i].contains(_querylineedit->text())) _resultlistwidget->additem(_itemstringlist[i]); // felvesszük a listára, ha tartalmazza a // megadott szöveget } 25

2.Feladat: megvalósítás void FilteredListWidget::loadItems(QString filename) { QFile file(filename); // logikai fájl létrehozása if (file.open(qfile::readonly)) { // megnyitás csak olvasásra _itemstringlist.clear(); // régi elemek törlése QTextStream stream(&file); // szövegként olvassuk be a fájlt QString line = stream.readline(); // soronként olvasunk while (!stream.atend()) { //!line.isnull() is lehetne _itemstringlist << line; // _itemstringlist.append(line); line = stream.readline(); } _querylineedit->clear(); // töröljük tartalmat _resultlistwidget->clear(); // töröljük tartalmat _resultlistwidget->additems(_itemstringlist); // új elemek } else QMessageBox::warning(this, trutf8("hiba!"), trutf8("a ") + filename + trutf8(" fájl nem található!")); // ha nem sikerült megnyitni, előugró ablakot mutatunk } 26

Grafikus vezérlők elrendezése Mivel az ablak átméretezésével a vezérlők elrendezését módosítani kell, célszerű az átméretezhető ablakoknál elrendezéseket (layout) használni. Az elrendezések a gyerekvezérlőiket megfelelő sorrendben jelenítik meg, automatikusan áthelyezik és átméretezik. Az elrendezések hierarchikusan egymásba ágyazhatók (addlayout() ), és a hierarchia tetején levő elrendezést a setlayout(qlayout*) utasítással állíthatunk rá az azt tartalmazó vezérlőre (elsősorban az ablakra). Az elemek távolsága egy elrendezésen belül szabályozható (spacing). 27

Grafikus vezérlők elrendezői Számos formának megfelelően rendezhetjük a vezérlőket. vízszintes (QHBoxLayout), függőleges (QVBoxLayout), rács (QGridLayout) űrlap (QFormLayout), amelyen címkézhetjük a vezérlőket keret (QBorderLayout), amely az oldalához, vagy középre tudja igazítani az elemeket dinamikus (QStackedLayout), ahol változhat a megjelenő elem QHBoxLayout QGridLayout QFormLayout QVBoxLayout 28

Példa QGridLayout* mylayout = new QGridLayout(); mylayout->addwidget(somebutton, 0, 0); // gomb behelyezése az 1. sor 1. oszlopába mylayout->addwidget(otherbutton, 0, 1, 1, 2); // gomb behelyezése a 2. sor 1. oszlopában úgy, // hogy két oszlopon is átnyúljon QFlowLayout* innerlayout = new QFlowLayout(); // belső, folyamatos elhelyezés mylayout->addlayout(innerlayout); // elhelyezés beágyazása setlayout(mylayout); // elhelyezés beágyazása az ablakba 29

Fájl dialógus Egy speciális dialógusablak a fájldialógus (QFileDialog), amely lehetőséget fájlok/könyvtárak kiválasztására statikus műveletekkel közvetlenül használható fájlok megnyitásához (getopenfilename, getopenfilenames), fájlok mentéséhez (getsavefilename) és könyvtárak megnyitásához (getexistingdirectory) QString filename = QFileDialog::getOpenFileName(this, trutf8("open file"), "/home", trutf8("text files (*.txt)")); // szövegfájl megnyitása a home könyvtárból 30

3.Feladat Módosítsuk az előző alkalmazást úgy, hogy lehessen átméretezni az ablakot, és a tartalom alkalmazkodjon az új mérethez, továbbá lehessen tetszőleges szöveges fájl tartalmát betölteni. 31

3.Feladat: tervezés Az eddigieken túl Felveszünk egy új nyomógombot, amely a szöveges állományból történő beolvasás indítja el egy erre a célra készített eseménykezelővel (loadfile()). Ez az állomány nevét egy fájl kiválasztó dialógusablak (QFileDialog) segítségével olvassa be, majd meghívja a már meglevő loaditems() metódust. A felületen felveszünk két elrendezést, a felső sornak egy vízszinteset (QHBoxLayout), a teljes tartalomnak egy függőlegeset (QVBoxLayout). FilteredListWidget QWidget - _itemstringlist :QStringList - _querylabel :QLabel* - _querylineedit :QLineEdit* - _resultlistwidget :QListWidget* - _loadbutton :QPushButton* - _upperlayout :QHBoxLayout* - _mainlayout :QVBoxLayout* + FilteredListWidget(QWidget*) + ~FilteredListWidget() - loaditems(qstring) :void «slot» - filterlist() :void - loadfile() :void 32

3.Feladat: megvalósítás FilteredListWidget::FilteredListWidget(QWidget *parent) : QWidget(parent) { _mainlayout = new QVBoxLayout; _mainlayout->addlayout(_upperlayout); // másik elrendezés _mainlayout->addwidget(_resultlistwidget); _mainlayout->addwidget(_loadbutton); } setlayout(_mainlayout); // elrendezés beállítása void FilteredListWidget::loadFile() { QString filename = QFileDialog::getOpenFileName(this, } trutf8("fájl megnyitása"), "", trutf8("szöveg fájlok(*.txt)")); if (!filename.isnull()) loaditems(filename); ha OK-val zártuk le a fájl dialógust fájl megnyitó dialógus címe és a szűrési feltétele 33

Felület tervező A felülettervező (Qt Designer) lehetőséget ad a felület gyors elkészítésére Az elkészített felületterv XML-ben mentődik (<ablaknév>.ui), majd abból egy Qt osztály készül (ui_<ablaknév>.h) Az így generált osztály funkcionalitását egy saját, Qwidget-ből származó osztály részeként használjuk (függőség befecskendezés): vagy a saját osztálynak őse lesz a generált osztály is, vagy a saját osztály egy adattagja hivatkozik a generált osztály egy példányára. A generált osztály a tervezőben adott név (name) tulajdonságot kapja névként, valamint az Ui_ előtagot (ehelyett használhatjuk az Ui névteret). a generált osztály vezérlőire a nevükkel hivatkozhatunk, a kialakításukat a generált osztály setupui(qwidget* parent) metódusának hívásával végezhetjük el. 34

Példa #include "ui_demowindow.h" // tervező által generált class MyWindow : public QWidget { Q_OBJECT public: MyWindow( ) :, ui(new Ui::MyWindow) { ui->setupui(this); // innentől használhatóak a vezérlők: ui-> private: Ui::MyWindow* ui; }; 35