QT Grafika az alap alkalmazás (GrafikaQtvel) működése

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

Színek

A digitális képfeldolgozás alapjai

Bevezetés a színek elméletébe és a fényképezéssel kapcsolatos fogalmak

Bevezetés a színek elméletébe és a fényképezéssel kapcsolatos fogalmak

if(_param.antialias) painter.setrenderhint(qpainter::antialiasing, true);

A színérzetünk három összetevőre bontható:

bool _freehand = false; QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató

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

Számítógépes grafika. Készítette: Farkas Ildikó 2006.Január 12.

OPTIKA. Hullámoptika Színek, szem működése. Dr. Seres István

Képszerkesztés elméleti feladatainak kérdései és válaszai

Szürke árnyalat: R=G=B. OPENCV: BGR Mátrix típus: CV_8UC3 Pont típus: img.at<vec3b>(i, j) Tartomány: R, G, B [0, 255]

Szürke árnyalat: R=G=B. OPENCV: BGR Mátrix típus: CV_8UC3 Pont típus: img.at<vec3b>(i, j) Tartomány: R, G, B [0, 255]

GRAFIKA. elméleti tudnivalók

A színkezelés alapjai a GIMP programban

OPTIKA. Szín. Dr. Seres István

Elemi alkalmazások fejlesztése III.

Programozás I. 5. Előadás: Függvények

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

C programozási nyelv Pointerek, tömbök, pointer aritmetika

INFORMATIKA Felvételi teszt 1.

Képszerkesztés elméleti kérdések

Képek kódolása. Vektorgrafika. Bittérképes grafika (raszter/pixelgrafika)

Tömörítés, kép ábrázolás A tömörítés célja: hogy információt kisebb helyen lehessen tárolni (ill. gyorsabban lehessen kommunikációs csatornán átvinni

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

Színek Additív és szubtraktív színkezelés RGB - színtér

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

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

Képfájlok beolvasása és megjelenítése

3. Osztályok II. Programozás II

SZÍNES KÉPEK FELDOLGOZÁSA

Szabványok és számítási beállítások használata

1.1.1 Dátum és idő függvények

QT Grafika Az alap alkalmazás felhasználói felülete

3. modul - Szövegszerkesztés

Felhasználói leírás: STAHL Ex-Tool v1.0 rev

Megadja, hogy a képek színesben vagy fekete-fehérben legyenek-e kinyomtatva Megjegyzések:

Elemi alkalmazások fejlesztése III.

Tömörítés, csomagolás, kicsomagolás. Letöltve: lenartpeter.uw.hu

A Java nyelv. Dialógus ablakok. Elek Tibor

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Matlab Fuzzy Logic Toolbox

HVK Adminisztrátori használati útmutató

Thermo1 Graph. Felhasználói segédlet

Számítógépes megjelenítő és képalkotó eszközök kalibrációja

Első lépések. File/New. A mentés helyét érdemes módosítani! Pl. Dokumentumok. Fájlnév: pl. Proba

Számítógépes megjelenítő és képalkotó eszközök kalibrációja

Aromo Szöveges értékelés normál tantárggyal

Programozás II. 2. Dr. Iványi Péter

OPTIKA. Hullámoptika Diszperzió, interferencia. Dr. Seres István

HASZNÁLATI ÚTMUTATÓ DOLGOZÓK IMPORTÁLÁSA KULCS BÉR PROGRAMBA AZ ONLINE MUNKAIDŐ NYILVÁNTARTÓ RENDSZERBŐL. Budapest, november 08.

Képszerkesztés. Letölthető mintafeladatok gyakorláshoz: Minta teszt 1 Minta teszt 2. A modul célja

Programozási technológia

Új Nemzedék Központ. EFOP pályázatok online beszámoló felülete. Felhasználói útmutató

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

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

Segédanyag az iktatáshoz. Tartalomjegyzék

Osztályok. 4. gyakorlat

A webáruház kezdőlapján háromféle diavetítés beállítására van lehetőség:

Elemi alkalmazások fejlesztése III.

Nagy HF u tmutato 2011/2012 II. fe le v

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Navigációs GPS adatok kezelése QGIS programmal (1.4 verzió) Összeállította dr. Siki Zoltán

Weblap készítése. Fapados módszer

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

B8. A CIE 1931 SZÍNINGER-MÉRŐ RENDSZER ISMERTETÉSE;

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

A RÓMAI SZERZÕDÉSEK 50. ÉVFORDULÓJA ALKALMÁBÓL

Térképek jelentése és elemzése

EDInet Connector telepítési segédlet

Egyszerűbb a Google keresőbe beírni a Sharepoint Designer 2007 letöltés kulcsszavakat és az első találat erre a címre mutat.

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

A programozás alapjai 1 Rekurzió

Útmutató szivárgásvizsgálat-köteles berendezéseket érintő csoportos műveletekhez

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

Programozási nyelvek II. JAVA

Elemi alkalmazások fejlesztése III

A beszámoló készítés lépéseinek bemutatása egy mintacég Egyszerű Kft. segítségével

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

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

3. Ezután a jobb oldali képernyő részen megjelenik az adatbázistábla, melynek először a rövid nevét adjuk meg, pl.: demo_tabla

SafeQ nyomtatató telepítése

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

VARIO Face 2.0 Felhasználói kézikönyv

Az ErdaGIS térinformatikai keretrendszer

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

Táblázatok kezelése. 1. ábra Táblázat kezelése menüből

Cikktípusok készítése a Xarayában

é rtésí té sék szű ré sé

PÉNZTÁR FELHASZNÁLÓI KÉZIKÖNYV

1.4 fejezet. RGB színrendszerek

POSZEIDON dokumentáció (1.2)

TÍPUSDOKUMENTUMOK KÉSZÍTÉSE

CSS3 alapismeretek. Bevezetés a CSS-be. Mi is az a CSS? Alkalmazási formái, szintaxisa

91. MP költséghelyek felvitele, 94. MP mozgástípus konfigurálása

6. Alkalom. Kép ClipArt WordArt Szimbólum Körlevél. K é p

Szöveges fájlok szerkesztése Jegyzettömb használata

Átírás:

QT Grafika az alap alkalmazás (GrafikaQtvel) működése Állapot mentése és visszaállítása Intézzük el, hogy a program megjegyezze a beállításainkat, beleértve az ablak pozícióját és indításkor az utoljára használt adatokat töltse vissza. Erre szolgál a QSettings osztály (használatához :#include <QSettings>), amelyik platformfüggetlenül használható, noha mind a paraméterek tárolási helye, mind a formátuma különbözhet az egyes platformokon 1. A QSettings osztály a QVariant-ból van leszármaztatva, ezért olyan változók értékeit tudjuk vel közvetlenül beolvasni, amelyek a QtCore-hoz tartoznak. A grafikus típusok beolvasására a QSettings::value <típus>() template konverziós függvényeket használhatjuk, a többi típusra a QVariant-nál is látottakat (pl. QSettings::value(kategória név, érték).toint() ) használhatjuk. Az értékek beállítása QSettings::setValue(név, érték) függvény szolgál. A QSettings-nek ötfajta konstruktora van. Ezek közül mi a QSetting s(alap név, program név) konstruktort fogjuk használni. Az alap név pl. egy cégnév lehet, nálunk a Programozás 3 lesz ez, a program neve pedig GrafikaQtvel. A QSettings-el elmentett adatok lehetnek egy hierarchia részei. Pl. egy ablak helyzete, illetve méretei az ablakhoz tartoznak ezért egy hierarchiába rendezhetőek: Ablak x a bal oldal x koordinátája y y koord. w szélessége h magassága Ezekhez elnevezhetnénk 'Ablak_x',, Ablak_y, Ablak_w és Ablak_h, de használhatnánk az Ablak/x, Ablak/y, Ablak/w és Ablak/h neveket is, de ez nem lenne áttekinthető. 1 Pl. Windows platformon a paraméterek a Registry-ben tárolódnak, ami egy nem szöveges adatbázis, OS X és.ios alatt ún. property listákban, UNIX alatt pl. INI fájlokban.

Szerencsére a QSettings lehetővé teszi hierarchiák létrehozását azzal, hogy beállításainkat csoportokba rendezhetjük. A fenti esetre így: QSettings s("programozás 3", " GrafikaQtvel"); s.begingroup("ablak"); s.setvalue("x", geometry.left() ); s.setvalue("y", geometry.top() ); s.setvalue("w", geometry.width() ); s.setvalue("h", geometry.height() ); s.endgroup(); Minden widget-nek megvannak ezek a geometriai adatai. Ezeknek az elmentésére sokszor van szükség. Hogy ne kelljen minden widgethez a fenti csoportban szereplő 4 sort beírni használjuk a Qt savegeometry() kényelmi függvényét. Egy ablaknak (QMainWindow vagy QDialog) azonban nem csak geometriai adatai vannak, hanem több állapota is van: lehet normál, teljes képernyős, vagy ikon állapotban. Ezeket a savestate() függvénnyel menthetjük el. Tehát az ablakokhoz a savegeometry() és a savestate() függvény egyaránt szükséges. Ezek visszaállításához a restoregeometry() és restorestat()e függvényeket fogjuk használni, berakva ezeket egy csoportba. Esetünkben azonban nem csak az ablakunk adatait, hanem más adatokat is szeretnénk tartósan tárolni. Ilyenek pl. a közös toll vastagság, stílus, stb paraméterek. Ezért ezek beolvasására és kiírására létre fogunk hozni két függvényt. A program indulásakor beolvassuk és visszaállítjuk az egyes paramétereket, a programból való kilépéskor elmentjük azokat. Ezt a két függvényt módosítjuk majd, ahogy egyre több adatot kell majd letároljunk. Az áttekinthetőség érdekében minden egyes lap adatainak elmentéséhez és visszaolvasásához külön függvényt készítünk. Ezeket fokozatosan töltjük meg tartalommal. Adjuk hozzá a #include <QColor> sort a grafikaqtvel.h fájlhoz, a #include <QSettings> sort a grafikaqtvel.cpp fájlhoz! Ezután adjuk hozzá az elmenteni kívánt private mezőket 2 (ezekben tároljuk a rajzolási paramétereket) a GrafikaQTvel osztályhoz. Egyelőre csak a közös paraméterek kerülnek ide, 2 Konvenció: Minden olyan mező, illetve függvény nevét, amelyek private-ok egy osztályban aláhúzással fogjuk kezdeni. Minden függvény neve (az esetleges kezdő aláhúzás karaktert nem számítva) nagybetűvel kezdődik, hogy megkülönböztessük ezeket a Qt-beli függvényektől.

de a lista a későbbiekben bővülni fog majd. Mindegyik alábbi elmenteni kívánt tulajdonságnak saját típusa van a Qt-ben, amit itt megjegyzésbe írunk, mert tulajdonság neve helyett csak egy sorszámot fogunk elmenteni. QColor _pencolor, _brushcolor; int _penwidth; int _penstyle; // Qt::QPenStyle int _pencap; // Qt::QPenCapStyle int _penjoin; // Qt::QPenJoinStyle int _brushstyle; // Qt::BrushStyle Adjuk hozzá az állapot elmentésére és visszaolvasására szolgáló következő két private függvény deklarációját a.h fájlhoz! void _SaveState(); Ez hívja meg a minden lap beállításainak elmentését végző függvényt, void _ReadState(); ez pedig a visszaállításukat. Adjuk a függvények definícióit a.cpp fájlhoz: // elmenti az alkalmazás állapotát void GrafikaQTvel::_SaveState() QSettings settings("programozás 3", "firstdraw"); settings.begingroup("ablak"); settings.setvalue("geometry", savegeometry()); settings.setvalue("state", savestate()); // Közös rajzolási beállítások: settings.begingroup("toll"); settings.setvalue("vastagság", _penwidth); settings.setvalue("szín", _pencolor); settings.setvalue("stílus", _penstyle); settings.setvalue("vonalvég", _pencap); settings.setvalue("kapcsolódás", _penjoin); settings.begingroup("ecset"); settings.setvalue("szín", _brushcolor); settings.setvalue("stílus", _brushstyle); // Egyéb paraméterek elmentése A geometria és az állapot visszaolvasásánál egy bájtokból álló tömbé kell alakítani az adatokat: void GrafikaQTvel::_ReadState() QSettings settings("programozás 3", "firstdraw"); settings.begingroup("ablak");

restoregeometry(settings.value("geometry").tobytearray()); restorestate(settings.value("state").tobytearray()); settings.begingroup("toll"); _penwidth=settings.value("vastagság", 1).toInt(); //1: default // Mival a QColor nem QVariant cselezni kell _pencolor = settings.value("szín").value<qcolor>(); _penstyle = settings.value("stílus", 1).toInt(); // 1: Qt::SolidLine _pencap = settings.value("vonalvég", Qt::FlatCap).toInt(); _penjoin = settings.value("kapcsolódás", Qt::MiterJoin).toInt(); // Egyéb paraméterek beolvasása A konstruktorban írjuk be az állapot beolvasását, a destruktorban a kiírását: GrafikaQTvel::GrafikaQTvel(QWidget *parent) : QMainWindow(parent) ui.setupui(this); _ReadState(); Ahhoz, hogy az alkalmazásunk valóban platformfüggetlen legye be kell tartanunk néhány szabályt: 1. Mivel vannak platformok ahol a kis és nagybetű azonos, és vannak, ahol különböző ugyanazt a nevet mindig ugyanúgy írjuk. 2. Ne használjunk olyan neveket, amelyek egymástól csak a kis- és nagybetűkben különböznek 3. Ne használjunk /, vagy \ karaktereket a nevekben. A / karakter a név hierarchiájának megadásánál szerepel. A közös paraméterek beállítása Bár a Toll és Ecset fejlécű lapot hoztuk létre utoljára az ottani adatokat állítjuk be először. Ezért inkább legyen ez az első lap! Ehhez válasszuk ki ezt és a jobb egérgombos menüből a Change Order almenüt! Kattintsunk az utolsó lap nevére, majd a felfele nyíllal vigyük fel legfelülre! Noha ez látszólag nem változtatja meg a lap indexét, a valóságban azonban az is megváltozik, de csak akkor látjuk, ha sorrend beállításba újra belépünk. Nyomjuk meg a Rendben/Ok-t!

Az első kérdés: mikor változtassuk meg a lokális változóink értéket? Rögtön a beállításuk után, vagy csak amikor kilépünk a programból? Ha az itteni beállítások egy másik ablakban lennének, akkor mindenképpen az előbbit választanánk. Most ez nem kötelező, de tegyük ezt! De minek kell az egyes mezők kiindulási értékeinek lenniük? Az, amit beolvastunk a beállításokból. Vagyis a beállítások beolvasása után azonnal át kell állítani az eszköztár lapjain levő értékeket. Ezt a beállítást célszerű minden lapnál egy külön függvénybe tenni, amiket egyetlen függvényből a neve legyen _SetupControls() tudunk meghívni. A függvény, ami csak a Toll és Ecset lapon szereplő értékeket állítja be legyen void _SetupCommon()! Hasonló függvényeket adhatunk a többi laphoz is. Érdemes előre gondolkozni. Mivel tudjuk mit fogunk csinálni a függvények deklarációit már most adjuk hozzá a.h fájlhoz: void _SetupControls(); // közös paraméterek Toll és Ecset lap void _SetupCommon(); // t0bbi lap void _SetupDrawing(); void _SetupGraph(); void _SetupInteract(); void _SetupFractal(); void _SetupTransform(); void _SetupShapes(); void _SetupPictures(); void _SetupFilters(); és egyelőre üres definícióikat a.cpp fájlhoz!: void GrafikaQTvel::_SetupCommon() void GrafikaQTvel::_SetupDrawing() void GrafikaQTvel::_SetupGraph() void GrafikaQTvel::_SetupInteract() void GrafikaQTvel::_SetupFractal() void GrafikaQTvel::_SetupTransform() void GrafikaQTvel::_SetupShapes() void GrafikaQTvel::_SetupPictures() void GrafikaQTvel::_SetupFilters() A _SetupControls() egyszerű: void GrafikaQTvel::_SetupControls() _SetupCommon(); _SetupDrawing(); _SetupGraph(); _SetupInteract();

_SetupFractal(); _SetupTransform(); _SetupShapes(); _SetupPictures(); _SetupFilters(); Ezt a függvényt meg kell hívjuk a konstruktorban, a _ReadState() után: GrafikaQTvel::GrafikaQTvel(QWidget *parent) : QMainWindow(parent) ui.setupui(this); _ReadState(); _SetupControls(); Most megírjuk a SetupCommon() törzsét. Ahogy előbbre haladunk a programban majd elkészítjük a többi lap Setup () függvényét is. A _SetupCommon()-ban először beállítjuk a toll vastagságot: ui.sbpenwidth.setvalue(_penwidth); utána pedig az egyes lenyíló listák elem indexét (currentindex): ui.cbpenstyle->setcurrentindex(_penstyle); ui.cbpencap->setcurrentindex(_pencap); ui.cbpenjoin->setcurrentindex(_penjoin); Ezután be kell állítsuk a színeket. Ehhez a tudnunk kell, hogy a QColor típus mit is tartalmaz és hogyan kell vele bánnunk. Színekről röviden Az emberi szemben háromféle 3 színérzékelő csapocska van, ezek érzékenységének maximuma durván a kék, zöld és vörös színeknek felel meg. A zöld és vörös színérzékelő csapocskák érzékenységi görbéje átlapolódik a kéké ezektől távol van (S - 400 500 nm, M - 450 630 nm, L - 500 700 nm). 3 Egyes nőknek 4 színérzékelő csapocska van a szemében. Ők sokkal több színt tudnak megkülönböztetni, mint a többi nő, illetve minden férfi.

Ezért a vörös (R), zöld (G) és kék (B) színeket szoktuk alapszíneknek nevezni. Ezek adják az RGB színteret. Amikor alapszíneket keverünk össze más színeket kapunk. Kétfajta színkeverési módszer van az összeadó (additív), ami annak felel meg, hogy a színeket egymásra vetítjük (ezt használják a monitorok is) és a kivonó (szubtraktív), amit a festészetben, illetve a színes nyomtatásban használnak. A szubtraktív színkeverés alapszínei a bíbor (M - magenta), sárga (Y) és a cián (C). A szubtraktív színkeverés alapszínei az additív színkeverés alapszíneinek páronkénti összadásával állíthatóak elő és ezeket ilyenkor kiegészítő színeknek nevezik 4. Mindhárom additív komponenst egyenlő arányban összekeverve a szürke árnyalatait kapjuk, feketétől (mindegyik komponens 0%) a fehérig (mindegyik komponens 100%). Ugyanígy eljárva a szubtraktív rendszerben a fehértől (mindegyik komponens 0%) a feketéig (mindegyik komponens 100%) terjedő tartományt kapjuk meg. Legalább is elvileg, mert a gyakorlatban a feketét sosem érjük el. Ezért nyomtatásnál általában fekete festéket (black) is kell használni. E miatt a szubtraktív rendszert szokás CMYK 5 színrendszernek is nevezni. Egy színt tehát megadhatunk a három komponensének százalékos arányával. Attól függően, hogy a 0-100 tartományt hány részre bontjuk fel függ a megjeleníthető színek száma. A legelterjedtebb monitorokban, illetve a legnépszerűbb képformátumú JPG kép fájlokban mindegyik színhez a 0-255 tartomány tartozik, vagyis a JPG-ben összesen 0x1000000 = 16 777 216 szín, de mindössze 256 szürke árnyalat jeleníthető meg. A színeket azonban más módokon is megadhatjuk. Az R G és B értékek egy háromdimenziós térnegyedet feszítenek ki, mert az intenzitások nem negatívok. Ebben a térben bevezethetünk más, pl. hengerkoordináta rendszereket is. 4 Ez persze nem jelenti azt, hogy additív keveréssel állítunk elő szubtraktív szín rendszert. 5 Vagy CYMK.

A HSL 6 (Hue Saturation Lightness or Luminosity) és a HSB (Hue Saturation Value) ilyen a számítógépes grafikában kiterjedten használt hengerkoordinátarendszerek: Mind az RGB, mind a HSL és HSV rendszerek két dimenzióban is ábrázolhatóak, ahogy az az ábrán is látszik. Szín kalibráció szín profilok Amikor egy szín R, G és B összetevőit megadjuk, akkor látszólag pontosan meghatároztuk a színt. De a gyakorlatban nem ez a helyzet. Ugyanazt a tárgyat lefényképezve különböző típusú fényképezőgépekkel az eredő színek mások lesznek. Ugyanaz a kép, pl. egy fotó többnyire egész máshogy fog kinézni két különböző monitoron, vagy egy monitoron és egy mobilon vagy laptopon, illetve nyomtatásban. Ennek az az oka, hogy a különböző eszközök nem ugyanúgy reagálnak ugyanarra az RGB színhármasra. Különbözhet a színt adó szűrők és festékek átviteli karakterisztikája, a színárnyalatok mennyisége, eloszlása illetve az intenzitás 6 Hívják még HLS és HSB (B-brightness)-nek is.

is befolyásolhatja a színeket (gamma). A színmélység az egy színt meghatározó bitek száma is különbözhet. Ahhoz, hogy egy munkafolyamat során az érzékelt színek minden eszközön ugyanazok lehessenek az egyes eszközök karakterisztikáját le kell mérni. Ezekből szín konverziós táblázatokat képezhetünk, amelyek megadják, hogy egy adott szín eléréséhez az illető eszköz milyen RGB komponenseket vár. Az így meghatározott táblázatok az ICC (International Color Consortium) szín profilok. Ezek kiterjesztése általában.icc, vagy.icm, vagy. Egy hibás színprofil teljesen elronthatja monitor képét. Professzionális grafikai és fotószerkesztési célokra kalibrált eszközöket kell használni. Még arra is ügyelni kell, hogy a környezet megvilágítása is ugyanaz legyen mindegyik eszköznél. Színterek Fent említettük, hogy a JPG formátumú képek minden színkomponenst csak 8 biten tárolnak le. A modern fényképezőgépek ennél többre képesek: 12, 14, ill. 16 bites színmélységgel rendelkeznek, ebből állítják elő a 8 bites színeket 7.. A fentiekben láttuk, hogy bitmélység azonban nem elég az eszközök színrögzítési, illetve színábrázolási képességeinek leírására, abba beleszól az eszköz szín profilja is. De még ez is kevés információ. Egyáltalán nem biztos, hogy egy adott RGB szín rögzítésére, ill. megjelenítésére egy eszköz egyáltalán képes-e. A rögzíthető/megjeleníthető színek tartományát 8 az illető eszköz színterének nevezzük. Ez egyértelműen az eszközre jellemző. A színteret az RGB térben egy térfogattal adhatjuk meg. Minél nagyobb egy eszköz színtere annál több telített és intenzív színt tartalmaz. Mivel az eszközök színterei bármilyenek lehetnek színek szerkesztéséhez eszközfüggetlen színtereket használunk. Ezek legszűkebbikét srgb-nek hívják, ez az, amit minden eszköznek tudnia kell. Az olcsóbb 8 bites monitorok 9 ezt ismerik csak. Ez az interneten használt 7 Jobb fényképezőgépekben az eredeti feldolgozatlan 12-16 bites szenzor adatokat is el lehet menteni. Az ezeket tartalmazó fájlokat összefoglaló néven RAW (nyers) fájloknak hívják. A RAW fájlok konkrét szerkezete gyártótól függő. Kiterjesztéseik lehetnek pl..crw,.cr2,.nef,.pef,.rw2, stb. Van egy nyílt formátuma is az Adobe.DNG (Digital Negative Format) 8 Megnevezése: gamut. 9 Sok "8 bites" olcsó monitor valójában csak 6 bites és a 8 bitet kis csalással: színek összemosásával szimulálják.

szabványos színtér is 10. Az srgb messze nem tartalmaz minden színt, amit az emberi szem meg tud különböztetni. A nyomtatók és fényképezőgépek színterei ennél nagyobbak. A legáltalánosabban szerkesztésre használt eszközfüggetlen színtér az Adobe RGB. Szokásosan a 3 dimenziós szín teret síkban ábrázolják. Egy ilyen ábrán összehasonlítva az eszközfüggetlen színtereket ezt az ábrát kapjuk (Wikipedia): Leolvasható, hogy a látható színek tartománya sok helyütt nagyobb, mint ezeké a színtereké de vannak a színterekben olyan színek is, amiket az emberi szem nem tud megkülönböztetni. Színek a Qt- ban QColor konstruktorai RGB-t várnak: QColor::QColor(int r, int g, int b, int a = 255); QColor::QColor(QRgb color); QColor::QColor(Qt::GlobalColor color) 10 A modern böngészők más színtereket is ismernek.

A QColor az érvényes színek mellett érvénytelen értékeket is tartalmazhat. Azt, hogy egy szín érvénytelen-e az isvalid() függvénnyel nézhetjük meg. Színek megadására használhatjuk a sztatikus fromrgb függvények valamelyikét: QColor QColor::fromRgb(int r, int g, int b, int a = 255); QColor QColor::fromRgb(QRgb rgb); A QRgb az unsigned int-tel ekvivalens érték, amit a #AARRGGBB hexadecimális számnégyessel adhatunk meg. Az AA szám az alfa csatorna, ami az adott szín átlátszóságát fejezi ki. Az a maximális értéke (itt 255) az átlátszatlan színt jelenti. Az alfa csatorna azért jó, mert ha két vagy több képet helyezünk egymásra a megjelenítéshez nem kell az egyes rétegek színeit elrontani és átírni. Az egyes szín komponenseket és az alfa csatorna értékét a red(), redf(), green(), greenf(), blue(), bluef(), alpha() és alphaf() függvényekkel kaphatjuk meg. Az F végűek 0 és 1.0 közötti valós, a többi 0 és 255 (65535) közötti egész értékeket ad vissza. A színek stíluslapokban használható szöveges numerikus, reprezentációját (#RRGGBB) a name() függvény adja vissza. A QColor típussal a színeket RGB, HSV és CMYK rendszerben is megadhatjuk, illetve megkaphatjuk. HSV-ből a sztatikus QColor QColor::fromHSV(int h, int s, int v, int a = 255) függvénnyel, ahol s és v 256 (0 255) értéket, h 360 (0 359) értéket vehet fel, vagy a szintén sztatikus QColor QColor::fromHsvF(qreal h, qreal s, qreal v, qreal a = 1.0); függvénnyel, ahol minden paraméter 0 és 1.0 között lehet. Az a paraméter az alfa csatorna. Hasonló függvények vannak a CMYK rendszerre is. Ugyanazon színek komponensei a három rendszerben:

A szín kiválasztására szolgáló gombok színek beállítása A gombok színének átírásához csak azok stíluslapjaiban a háttérszínt kell beállítanunk: ui.btnpencolor->setstylesheet("background:" + _pencolor.name()); ui.btnbrushcolor->setstylesheet("background:" + _brushcolor.name()); Az értékek átírása Azt akarjuk, hogy a színes gombokat megnyomva átírhassuk az egyes színeket. Ehhez meg kell írjuk a gombok SIGNAL-jait fogadó SLOT-ok lekezelését. A legegyszerűbb formában ez az on_widget_signal(paraméterek) sablonnak megfelelő SLOT definíciókkal működik: Írjuk be a deklarációkat a.h void on_sbpenwidth_valuechanged(int); void on_cnpenstyle_currentindexchanged(int index); void on_cnpencap_currentindexchanged(int index); void on_cnpenjoin_currentindexchanged( int index); void on_btnpencolor_clicked(); void on_btnbrushcolor_clicked(); és a definíciókat a.cpp fájlba! A fenti függvények között a Spin Box és a Combo Box-ok értékének változására meghívódó SLOT-okat könnyű megadni Ezekben elmentjük magunknak az új adatokat: void GrafikaQTvel::on_sbPenWidth_valueChanged(int val) _penwidth = val; void GrafikaQTvel::on_cnPenStyle_currentIndexChanged(int index) _penstyle = index; void GrafikaQTvel::on_cnPenCap_currentIndexChanged(int index) _pencap = index; void GrafikaQTvel::on_cnPenJoin_currentIndexChanged(int index) _penjoin = index;

A színek megváltoztatásához használjuk a Qt egyik beépítet dialógusának a QColorDialognak a getcolor() sztatikus függvényét. A getcolor a QColorDialog sztatikus kényelmi függvénye. Első paramétere az eredeti szín, a második az az ablak, amihez képest a dialogus modal 11 lesz, utolsó paramétere a dialógus címszövege, visszatérési értéke pedig a dialógusban kiválasztott szín. Ha a dialóguson belül az "Elvet" vagy "Cancel" gombot nyomjuk meg a visszaadott szín érvénytelen lesz. Első lépésként be kell include-oljuk a #include <QColorDialog>; header fájlt a cpp fájlba. Ezután meg kell írjuk a szín dialógus SLOT-ját: void on_btnpencolor_clicked() Lekérjük az eredeti stíluslapot, ami szöveges: QString s = ui.btnpencolor->stylesheet(); Mivel mi állítottuk be, tudjuk, hogy a formátuma "background:#rrggbb", vagyis a szín egy ':' után van megadva. A QColor-nak van olyan konstruktora, ami "#RRGGBB" szöveget vár, tehát a ':' utáni részt kell kivágni, ami a QString::mid(<string>, <kezdő pozíció>) függvénnyel történhet. A kezdő pozíciót a QString::indexOf(<keresett sztring>) függvény adja meg, ami -1-el tér vissza, ha a keresett szöveg nem található. Int pos = qs.indexof(":"); qs = qs.mid(pos); QColor col = QColor(qs); Ezután megjelenítjük a szín választási dialógust és kiválasztunk vele egy színt: col = QColorDialog::getColor(col, this, "Válassz toll színt!"); Csak akkor írjuk át a toll színét, ha a visszaadott szín is helyes volt. if (col.isvalid()) // egyébként az "Elvet" volt megnyomva _pencolor = col; qs = "background:" + col.name(); // az új stílus ui.btnpencolor->setstylesheet(qs); Ezzel a függvényt befejeztük: 11 Amíg egy modal dialógus be nem fejeződik az ablak, amelyik őt létrehozta nem elérhető.

Az ecset színének átírása ugyanígy történik. A gyakorlatban az egyes lépéseket összevonjuk így a teljes függvény az ecset szín kiválasztására a következő lesz: void GrafikaQTvel::on_btnBrushColor_clicked() QString qs = ui.btnbrushcolor->stylesheet(); QColor col = QColor(qs.mid(qs.indexOf(":"))); col = QColorDialog::getColor(col, this, "Válassz ecset színt!"); if (col.isvalid()) // egyébként az "Elvet" volt megnyomva _brushcolor = col; ui.btnbrushcolor->setstylesheet("background:" + col.name());

A GrafikaQtvel projekt aktuális fájljai main.cpp #include "grafikaqtvel.h" #include <QtWidgets/QApplication> int main(int argc, char *argv[]) QApplication a(argc, argv); GrafikaQTvel w; w.show(); return a.exec(); grafikaqtvel.h class GrafikaQTvel : public QMainWindow Q_OBJECT public: GrafikaQTvel(QWidget *parent = 0); ~GrafikaQTvel(); private: Ui::GrafikaQTvelClass ui; // közös paraméterek Toll és Ecset lap QColor _pencolor, _brushcolor; int _penwidth; int _penstyle; int _pencap; int _penjoin; int _brushstyle; private slots: void _SaveState(); void _ReadState(); void _SetupControls(); // közös paraméterek Toll és Ecset lap void _SetupCommon(); // t0bbi lap void _SetupDrawing(); void _SetupGraph(); void _SetupInteract(); void _SetupFractal(); void _SetupTransform(); void _SetupShapes(); void _SetupPictures(); void _SetupFilters();

; void on_sbpenwidth_valuechanged(int); void on_cbpenstyle_currentindexchanged(int index); void on_cbpencap_currentindexchanged(int index); void on_cbpenjoin_currentindexchanged( int index); void on_cbbrushstyle_currentindexchanged(int index); void on_btnpencolor_clicked(); void on_btnbrushcolor_clicked(); #endif // GRAFIKAQTVEL_H grafikaqtvel.cpp #include "grafikaqtvel.h" #include <QSettings> #include <QColorDialog> GrafikaQTvel::GrafikaQTvel(QWidget *parent) : QMainWindow(parent) ui.setupui(this); _ReadState(); _SetupControls(); GrafikaQTvel::~GrafikaQTvel() _SaveState(); void GrafikaQTvel::_SaveState() QSettings settings("programozás 3", "GrafikaQtvel"); // A geometria settings.begingroup("ablak"); settings.setvalue("geometry", savegeometry()); settings.setvalue("state", savestate()); // Közös rajzolási beállítások: settings.begingroup("toll"); settings.setvalue("vastagság", _penwidth); settings.setvalue("szín", _pencolor); settings.setvalue("stílus", _penstyle); settings.setvalue("vonalvég", _pencap); settings.setvalue("kapcsolódás", _penjoin); settings.begingroup("ecset"); settings.setvalue("szín", _brushcolor);

settings.setvalue("stílus", _brushstyle); // Egyéb paraméterek elmentése void GrafikaQTvel::_ReadState() QSettings settings("programozás 3", "GrafikaQtvel"); // A geometria settings.begingroup("ablak"); restoregeometry(settings.value("geometry").tobytearray()); restorestate(settings.value("state").tobytearray()); settings.begingroup("toll"); _penwidth=settings.value("vastagság", 1).toInt(); //1: default // Mival a QColor nem QVariant _pencolor = settings.value("szín", 0).value<QColor>(); _penstyle = settings.value("stílus", 1).toInt(); // 1: Qt::SolidLine _pencap = settings.value("vonalvég", Qt::FlatCap).toInt(); _penjoin = settings.value("kapcsolódás", Qt::MiterJoin).toInt(); settings.begingroup("ecset"); _brushcolor = settings.value("szín", 0xFFFFFF).value<QColor>(); _brushstyle = settings.value("stílus", 0).toInt(); // 0: Qt::NoBrush // Egyéb paraméterek beolvasása void GrafikaQTvel::_SetupControls() _SetupCommon(); // közös paraméterek Toll és Ecset lap void GrafikaQTvel::_SetupCommon() ui.sbpenwidth->setvalue(_penwidth); ui.cbpenstyle->setcurrentindex(_penstyle); ui.cbpencap->setcurrentindex(_pencap); ui.cbpenjoin->setcurrentindex(_penjoin); ui.btnpencolor->setstylesheet("background:" + _pencolor.name()); ui.btnbrushcolor->setstylesheet("background:" + _brushcolor.name()); // t0bbi lap void GrafikaQTvel::_SetupDrawing() void GrafikaQTvel::_SetupGraph() void GrafikaQTvel::_SetupInteract() void GrafikaQTvel::_SetupFractal() void GrafikaQTvel::_SetupTransform()

void GrafikaQTvel::_SetupShapes() void GrafikaQTvel::_SetupPictures() void GrafikaQTvel::_SetupFilters() void GrafikaQTvel::on_sbPenWidth_valueChanged(int val) _penwidth = val; void GrafikaQTvel::on_cbPenStyle_currentIndexChanged(int index) _penstyle = index; void GrafikaQTvel::on_cbPenCap_currentIndexChanged(int index) _pencap = index; void GrafikaQTvel::on_cbPenJoin_currentIndexChanged(int index) _penjoin = index; void GrafikaQTvel::on_cbBrushStyle_currentIndexChanged(int index) _brushstyle = index; void GrafikaQTvel::on_btnPenColor_clicked() QString qs = ui.btnpencolor->stylesheet(); // a szöveg: background:#rrggbb alakú QColor col = QColor(qs.mid(qs.indexOf(":"))); col = QColorDialog::getColor(col, this, "Válassz toll színt!"); if (col.isvalid()) // egyébként az "Elvet" volt megnyomva _pencolor = col; ui.btnpencolor->setstylesheet("background:" + col.name()); void GrafikaQTvel::on_btnBrushColor_clicked() QString qs = ui.btnbrushcolor->stylesheet(); background:#rrggbb alakú QColor col = QColor(qs.mid(qs.indexOf(":"))); // a szöveg: col = QColorDialog::getColor(col, this, "Válassz ecset színt!"); if (col.isvalid()) // egyébként az "Elvet" volt megnyomva

_brushcolor = col; ui.btnbrushcolor->setstylesheet("background:" + col.name()); A következő feladat az egyes lapok programjának elkészítése. Ezt a következő dokumentumban (DrawingPage) írjuk le.