QT Grafika – Az alap alkalmazás felhasználói felülete Az alábbiakban létrehozzuk azt a GUI-t, amit a továbbiakban használni fogunk. Ennek során áttekintünk néhány hasznos GUI elemet és azok használatát. Az elkészült GUI windows alatt:
1. ábra Linux alatt az ablak kin;zete a rendszerbeállításoktól függ. Pl.a Breeze téma esetén:
A fusion téma esetén:
Az MS Windows 9x téma esetén:
A projekt Hozzunk létre egy új projektet az előző projekthez hasonló módon! Legyen a neve GrafikaQtvel és ugyancsak a QMainWindow-ból származtassuk le. A használt Qt modulokhoz adjuk hozzá a PrintSupport-ot is! A Visual Studio-ba beágyazott rendszerben ez így néz ki:
Az alkalmazás ablakának baloldalán az egyes általunk tárgyalt területek beállításai lesznek, míg maga a grafika a jobb oldalon fog megjelenni. A bal oldalon egy Eszköztárat (Tool Box), a jobboldalon pedig egy több lapot tartalmazó Widgetet (QStackedWidget) használunk. Kattintsunk kétszer a grafikaqtvel.ui fájlra! Ellenőrizzük a szerkesztpben, hogy az ablak mérete 1013 x 788 pixel-e és, ha nem, akkor állítsuk be ennyire! Adjunk az ablakhoz egy &Fájl menü,t &Fájl/Be&zárás almenüt, aminek a gyorsbillentyűje legyen Alt+X. A hozzá tartozó action objektumot nevezzük át atnExit-re és a triggered() SIGNAL-ját kapcsoljuk össze az ablak close() SLOT-jával, ahogy azt a Szamologep programban tettük! Ezután a baloldali Widget Box-ból adjunk hozzá egy Widget-et és egy Stacked Widget-et az ablakhoz. Nevezzük át a widget-et pnlLeft-re, a Stacked Widget-et pnlRight-ra.
Állítsuk be az ablak layout-ját vízszintesre (Jobb egér gomb az ablakon a hozzáadott widgeteken kívül, majd Lay Out -> Lay Out Horizontally). Láthatjuk, hogy mindkét widgetnek ugyanakkora lesz a mérete. Azt már tudjuk, hogyan érhetjük el, hogy a bal oldali pnlLeft mérete ne változzon meg, amikor az ablakot átméretezzük (Hogyan?), és most is ezt fogjuk használni, de most először azt nézzük meg milyen beállításokkal lehet elérni, hogy a widgetek relatív mérete ne változzon az ablak átméretezésekor. A méretek megadására a Property Editor-ban a geometry, a minimumSize és a maximumSize mellett van egy sizePolicy nevű tulajdonság is. Ezzel adhatjuk meg, hogyan viselkedjen a widget, egy layout-on. A Horizontal Policy és a Vertical Policy adja meg, milyen viselkedést szeretnénk. A Preferred azt jelenti, hogy az illető méret változtatható, de a beállítottat szeretnénk látni, ha lehet. Ha ezt pl. Fixed-re változtatjuk, akkor az illető méretet (pl. geometry / Width) akarjuk látni. Most mindkettőt hagyjuk meg Preferred-nek! Az alatta levő két (Horizontal Stretch és Vertical Strech) nyújtási szorzókat a widgeteket kezelő layoutok akkor használják, amikor azok nem nullák. Ekkor az illető irányban az egyes widget-ek méreteit ezeknek az arányában osztják el. A mi esetünkben pl. ha a pnlLeft Horizontal Stretch-ét 15-re, a pnlRight-ét 35-re állítjuk, akkor tlbLeft szélessége a teljes ablakszélesség 15/50-ed része, a pnlRight-é a 35/50-ed része lesz. Próbáljuk ezt ki! Jelen programhoz ez most nem a legjobb megoldás, ezért térjünk vissza a hagyományoshoz: állítsuk vissza a Horizontal Stretch –eket 0 ra, állítsuk be a minimális méretet 320 pixelre és a Horizontal Policy-t Fixed-re. Így most a maximális méretet nem kell megadjuk. Amikor egy widgetre egy olyat húzunk rá, amelyik kilóg róla, pl. nála szélesebb, vagy magasabb, akkor a kilógó rész általában nem fog soha látszani. A görgető területet (Scroll Area) az a widget, amelyikre ha egy nála nagyobb méretű widgetet rakunk rá a kilógó részeket görgetősávokkal megjeleníthetjük. Ezt most arra fogjuk majd használni, hogy ha az ablakot függőlegesen összenyomjuk, attól még az eszköztár összes részét elérhessük.
Húzzunk rá a pnlLeft-re egy görgető területet (Scroll Area) –de a méretét ne változtassuk meg! Nevezzük át scraTools-ra! Ezzel pnlLeft az scraTools szülője lesz1.Állítsuk be pnlLeft VerticalScrollBarPolicy-ját ScrollBarAlwaysOn-ra! Ezzel elérjük, hogy a rá rakott widget-ek számára vízszintesen rendelkezésre álló méret ne változzon akár beleférnek a rá rakott widget-ek akár nem. Ugyanide húzzunk rá egy nyomógombot (Push Button), amit nevezzünk át btnClose–nak és a szövegét írjuk át Kilépésre! Rakjunk mellé egy Horizontal Spacer-t, majd a panel layout-ját állítsuk be függőlegesre (Vertical Layout)! Használjuk a Signals & Slot szerkesztőt és rendeljük a bezáró gomb megnyomásához is a fő ablak close() slot-ját! Ezután az scraTools-ra rakjunk rá egy eszköztárat (Tool Box) és nevezzük át tbxMenu-re!! Az eszköztár egy olyan widget, amelyik több lapból áll. Minden lapnak van egy fejléce, amire kattintva az illető lap nyílik meg. Minden lapra rárakhatunk widgeteket, amelyek csak akkor láthatóak, ha az illető lap meg van nyitva. Minden lapnak van egy sorszáma (indexe), fejléc felirata és neve. Az scraTools layoutját állítsuk be függőlegesre. Ez gondoskodik arról, hogy az eszköztár kitöltse a maximális területet. Állítsuk be az eszköztár minimális magasságát akkorára, hogy az alul levő második fejléc még éppen beférjen az scraTools-ba! Esetünkben ez 660. Válasszuk ki a tbxMenu widgetet! A jobb egér gombra felugró menüben keressük meg az Insert Page menüt és adjunk hozzá még 6 oldalt, azután a Property Editorban nevezzük át az oldalakat! Ehhez a QToolBox szakaszban mindegyik laphoz be kell állítanunk először az indexét (currentIndex), utána a szövegét (currentItemText) és a nevét (currentItemName):
Amikor a szerkesztőben egy “A” widgetet egy “B” widgetre (akárhonnan – akár egy másik widgetről is) ráhúzunk, akkor “B” automatikusan az “A” szülője lesz. 1
Az indexet a megfelelő lap fejlécre kattintva is átállíthatjuk, de egyszerűbb beírni. Az egyes szövegek az 1. ábrán láthatóak, az egyes lapok nevei pedig: pgRajz, pgGrafikon, pgInterakt, pgFraktal, pgTranszform, pgAlakzat, pgKepek és pgFilter.
Rajzolás lap Kattintsunk rá a Rajzolás feliratú fejlécre! Rakjunk rá az alatta megjelenő üres területre az 1. ábra szerint 7 rádió gombot (Radio Button), egy vízszintes vonalat (Line), egy Tool Button-t, egy Vertical Spacer-t, 4 címkét (Label) és 4 beviteli mezőt (Line Edit). A rádiógombok, a Tool Button és a címkék szövegét írjuk át a képen láthatóra! A ToolButton neve legyen btnClearDataR a rádiógombok elnevezése fentről lefelé: rbDraw, rbLine, rbtTriangle, rbRect, rbPoly, rbEllipse és rbCircle, a beviteli mezőké ugyancsak fentről lefelé: edtX, edtY, edtW és edtH! Ezután állítsuk be a tbxMenu elrendezését függőlegesre! A rádiógombok közül válasszuk ki az elsőt és a Property Editorban állítsuk be bejelöltre (checked):
Amikor a rádiógombokat ugyanarra a widgetre rakjuk, akkor alapértelmezésben2 bármelyikükre kattintva az válik kijelölté a többi pedig ki nem jelölté. Az eszköztár esetén ehhez ugyanarra a lapra kell rakjuk ezeket. Mind az eredetileg, mind az újonnan kijelölt rádiógomb elküldi a toggled(bool checked) üzenetet (SIGNAL). A clicked() üzenetet csak az amelyikre kattintottunk. Az oldalunk így kell kinézzen:
2
Alapértelmezésben a gombok az autoExclusive állapotban vannak. Ha ezt nem akarjuk beállíthatjuk a független viselkedést a setAutoExclusive(bool) függvénnyel. Ha viszont egy widget-re több csoportonként autoExclusive rádiógombot akarunk rárakni, akkor használjunk Button Group-okat.
Grafikon lap Most kattintsunk a Grafikon fejlécre és ehhez a laphoz adjunk egy cimkét, egy beviteli mezőt egy Tool Button-t egy sorba, alá egy jelölőnégyzetet (Check Box), két másik Tool Button-t és ezek alá egy másik cimkét és állítsuk elő a következő elrendezést:
A beviteli mező neve legyen edtFile1, a mellete levő Tool Button-é btnBrowse, a jelölőnégyzeté chkOverWrite, a második Tool Button-é btnPlot, a harmadiké btnPrint! Az első címke szövege: „Adat fájl neve:”. A jelölőnégyzethez a Property Editorban állítsuk be a checked opciót! A Tool Button-hoz adjunk egy felugró súgót (toolTip):
A második címke szövege több sorra terjed ki és dőlt betűs és vastagított részek is vannak benne. Ennek beírásához válasszuk ki a Property Editor QLabel blokkjából a text mezőt és kattintsunk a jobb oldalán a három pontra:
. Erre a szövegszerkesztő ablak nyílik meg, amelyiknek válasszuk a Rich Text opcióját:
Ide írjuk be a súgó szövegét: Írja be egy adat fájl nevét, vagy válasszon ki egy adat fájlt! Az adat fájl a következő szerkezetú szövegfájl kel legyen: Teszt Adat Fájl szöveggel kezdődik. Ezt üres, megjegyzés, vagy adat sorok követhetik. Minden adatsorban két vesszővel elválasztott lebegőpontos ér ték van, az első az X, a második az Y koordináta. Minden #-el kezdődő sor megjegyzés sor, de a # adat sorok végén is állhat. A # utáni szöveget a program figyelmen kívül hagyja.
Ha most átkapcsolunk a Source fülre, akkor láthatjuk, hogy a beírt szöveget a szerkesztő egy beírt CSS stílusokat tartalmazó HTML dokumentummá alakítja át. A QLabel érti a HTML és a CSS egy részét. Állítsuk be a kiegyenlítést és a sortörést (Word Wrap), hogy a szöveg szépen jelenjen meg: Adjunk hozzá egy rácsos elrendezést (Grid Layout)!
Interaktivitás lap A következő lap (Interaktivitás) majdnem ugyanaz, mint a mostani, ezért megtehetjük, hogy a Grafikon lap teljes tartalmát átmásoljuk a következő lapra.
A Ctrl gombot nyomva tartva kattintsunk rá mindegyik widgetre, majd továbbra is lenyomva tartva a Ctrl-t, húzzuk rá a kijelölt elemek másolatát a jobb oldalra! Ezután engedjük fel a Ctrl gombot és kattintsunk az Interaktivitás fejlécre! Most a jobboldalon jelöljük ki az összes oda húzott elemet (vigyázzunk, hogy a hátterüket ne!) és a Ctrl gomb felengedése után húzzuk rá a kijelölteket az Interaktivitás lapra! Adjunk hozzá két rádió gombot (a nevük rbMeasOnGraph és rbZoomOnGraph), majd állítsuk be az elrendezést itt is! A lap ekkor így kell kinézzen:
Fraktálok lap A Fraktálok lapnak így kell kinéznie:
Az eddig nem használt elemek az oldalon: 1. A két kontrol csoport (Group Box), egyik címe (title) Paraméterek, másiké Színek. Ha csak ezeket írjuk át akkor a címek nem lesznek megvastagítottak. A félkövér (bold) vastagítást a betű (Font) beállításoknál adhatjuk meg, ha bejelöljük a Bold-ot. Ekkor azonban az összes, Group Box-beli szöveg, ami kontrol csoportba kerül félkövér lesz. Ezt nem akarjuk, tehát
ki kell kapcsoljuk a Bold opciót. Ezt megtehetjük
csoportosan is: válasszuk ki az összes szöveget és utána töröljük ki a kijelölést. 2. Az iterációk számát egy Spin Box-al állíthatjuk be. Ennek beállíthatjuk a minimumát (minimum), maximumát (maximum) és lépésközét (singleStep), valamint az aktuális értékét (value) a Property Editor-ban. Itt ezeket 100, 10000 és 100-ra állítsuk be! A színes négyzetek valójában szöveg nélküli Tool Button-ok, amiknek a stílus lapjában megadjuk a háttér színét:
. A stílus lapok (CSS –
Cascading Style Sheets) tulajdonságokat és ezek értékeit tartalmazzák. A tulajdonság és az érték között kettőspont, az egyes tulajdonságok között pontosvessző kell álljon. Itt az elem háttérszínét (background) adjuk meg. Sok színt megadhatunk angol nevükkel (pl. red, green, yellow, fuchsia, etc), és bármelyiket egy # után a három színkomponens hexadecimális értékeivel. Itt a 3 gomb hátterének színei #0000FF, #FF0000 és #FFFF00.
Az egyes elemek nevei fentről lefelé és balról jobbra: edtFractLeft, edtFractTop, edtFractRight, edtFractBottom, sbFractIter, btnFractLowColor, btnMandelbrot
Transzformációk lap A következő lap a Transzformációk lapja:
ahol az egyetlen eddig nem használt elem a Double Spin Box.Ez hasonló a Spin Box-hoz csak ez lebegőpontos számokkal dolgozik és a tizedesjegyek számát (decimals) is beállíthatjuk. Legyenek ezek most 0.0, 360.0 és 10.0 Az egyes elemek nevei: rbTransTriangle, rbTransRectangle, rbTransEllipse, edtTransDeltaX, edtTransDeltaY, edtTransZoomX, edtTransZoomY és dsbTransRotate.
Alakzatok lap
Az új elem ezen az oldalon egy lenyíló lista: (Combo Box), amiben felsoroljuk az alakzatokat. A Combo Box-beli szövegeket a jobb egérgombra felugró menü Edit items… pontjában adhatjuk meg:
Minden új elemhez a
gombot kell először megnyomni.
Az itt levő elemek nevei: cbShape, edtShapeWidth, edtShapeHeight, dsbShapeRotate.
Képek lap
Ezen a lapon egy új elem van a vízszintes csúszka (Horizontal Slider). Ez tartalmilag olyan, mint egy Spin Box csak a megjelenése és kezelése más. Az elemek nevei: edtImageFile, btnImageBrowse, hsImageZoom, btnImageFit, btnImageFull, dsbImageRotate.
Szűrők lap
A gombok (Tool Button) nevei: btnNeg, btnBW, btnSharpen, btnBlur, btnLines és btnMatrix. Ezzel a bal oldallal lényegében elkészültünk. Egy két ikonnal azért egy kicsit még feldobhatjuk. Ezekhez valamilyen képekre van szükség. Ilyen képeket rajzolhatunk,
vásárolhatunk sőt egyeseket ingyen is letölthetünk. Ezeket az ikonokat kényelmesen a Resource Browser-rel adhatjuk hozzá a projekthez.
A következő képeket fogjuk használni:
A képeket letölthetjük a www.fat.bme.hu oldalra belépve a Letöltések fülről. Meg kell nyomni a Bejelentkezés Védett Fájlok Letöltéséhez gombot és jelszó a NEPTUN kód, csupa nagybetűvel. Ezután kiválaszthatjuk a Programozás 3 mappabeli 2016/17 I. félév mappából a fájlokat. Hozzunk létre (amennyiben nincs) egy Resources nevű könyvtárat és abba töltsük le a fájlokat. Kattintsunk rá a ceruzára! A bal oldalon a resource fájl neve szerepel, a jobboldalon a programunk neve
. A jobb oldali
ikonra kattintva kiválaszthatjuk a képeket és hozzáadhatjuk azokat a
programhoz.
Adjuk hozzá a paint_brush nevű ikont az első lap fejlécéhez! Kattintsunk a Rajzolás –ra és a Property Editorban keressük meg a QToolBox lapon a currentItemIcon mezőt! Kattintsunk rá, majd a mellette levő
–ra, és válasszuk a Choose Resource-ot!
Keressük meg a paint_brush.png-t és válasszuk ki azt! A fejlécen megjelenik a rajzolás ikon. Hasonlóképpen adhatunk ikont hozzá a gombokhoz, stb is. Az ikon hozzáadása mező megnevezése változhat, pl a Tool Button-oknál a név csak icon és a kis gomboknál a hozzáadás után célszerű a három pont szöveget kitörölni. Toll és ecset A rajzoláshoz mindig egy adott tollat (Pen) és egy adott ecsetet (Brush) használunk. A toll határozza meg a húzott vonalak fajtáját, színét és vastagságát. Az ecset ezek hátterének illetve zárt alakzatok belsejének kifestésére alkalmas. Ezen a lapon ezeket tudjuk beállítani.
A nevek: sbPenWidth, cbPenStyle, cbPenCap, cbPenJoin, btnPenColor, cbBrushStyle, btnBrushColor. Az egyes lenyíló listák szövegei: chkPenStyle: Folytonos, Szaggatott, Pont, Vonal – Pont, Vonal – Pont – Pont, nincs chkPenCap: Lapos, Négyzetes, Lekerekített chkPenJoin: Ferde illesztés (Miter), Sűlyesztett (Bevel), Lekerekitett
chkBrushStyle: Üres, Egy színű, Lineáris átmenet, Sugaras átmenet, Kúpos átmenet, Mintázat, Vízszintes mintázat, Függőleges mintázat, Kereszthálós, Átlós visszafele, Átlós előre, Sűrű1, Sűrű2, Sűrű3, Sűrű4, Sűrű5, Sűrű6, Sűrű7 A toll háttérszínét állítsuk feketére, az ecset színét fehérre! Ehhez használjuk a styleSheeteket a background:black és background:white-tal.
Ikonok Adjunk hozzá ikonokat az egyes lapokhoz, gombokhoz és menükhöz! Az elkészült GUI egyes lapjai a következőek:
A GrafikaQtvel projekt GUI fájljai main.cpp #include "grafikaqtvel.h" #include
int main(int argc, char *argv[]) { QApplication a(argc, argv); GrafikaQTvel w; w.show(); return a.exec(); }
grafikaqtvel.h #ifndef GRAFIKAQTVEL_H #define GRAFIKAQTVEL_H #include #include "ui_grafikaqtvel.h" class GrafikaQTvel : public QMainWindow { Q_OBJECT public: GrafikaQTvel(QWidget *parent = 0); ~GrafikaQTvel(); private: Ui::GrafikaQTvelClass ui; }; #endif // GRAFIKAQTVEL_H grafikaqtvel.cpp #include "grafikaqtvel.h" GrafikaQTvel::GrafikaQTvel(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); } GrafikaQTvel::~GrafikaQTvel() { }
grafikaqtvel.qrc Resources/print.png Resources/ellipse.png Resources/exit.png Resources/folder.png Resources/gradient.png Resources/new_document.png Resources/open.png Resources/paint_brush.png Resources/process.png Resources/rectangle.png Resources/rotateLeft.png Resources/rotateRight.png Resources/save.png Resources/search.png Resources/undo.png grafikaqtvel.ui
Ezt a fájlt a tanszéki szerverről töltsük le! grafikaqtvel.pro
A következő fájl csak akkor kell, ha a QtCreator-t használjuk. Használatához konfigurálnunk kell a projektet, mielőtt le tudjuk fordítani. ##################################################################### # Automatically generated by qmake (3.0) Sze okt. 12 13:05:01 2016 ###################################################################### TEMPLATE = app TARGET = GrafikaQtvel INCLUDEPATH += . # Input HEADERS += grafikaqtvel.h FORMS += grafikaqtvel.ui SOURCES += grafikaqtvel.cpp \ main.cpp RESOURCES += grafikaqtvel.qrc QMAKE_CXXFLAGS += -std=c++11 greaterThan(QT_MAJOR_VERSION, 4): QT += core gui widgets