Qt 4

Acest document descrie sistemul de desenare Qt 4 și oferă o comparație între abordările de desen folosite în Qt 3 și Qt 4.

arhitectură

Sistemul de desenare Qt 4 se bazează în principal pe clasele QPainter. QPaintDevice și QPaintEngine. QPainter este o clasă care efectuează operații de desen, cum ar fi drawLine () și drawRect (). QPaintDevice implementează un dispozitiv pe care puteți crea o imagine utilizând QPainter; QWidget și QPixmap sunt QPaintDevices. QPaintEngine oferă o interfață care este utilizată pentru a atrage pe dispozitive de diferite tipuri.







Să aruncăm o privire la Qt 3

În Qt 3, QPainter a fost folosit pentru desenarea widget-urilor și desenelor raster. (De asemenea, acesta poate fi folosit pentru a trage la imprimantă în Windows și Mac OS X.) Atunci când este necesar suportul altor dispozitive de desen, cum ar fi QPrinter pe X11, acest lucru se face prin care derivă din QPaintDevice și cele mai importante funcții QPaintDevice virtuale :: cmd (). Un dispozitiv de desen redefinit, privit ca un dispozitiv extern.

QPainter a reușit să lucreze cu dispozitive externe și a reușit să transforme orice operație de desen într-o secvență de apel a funcției cmd () redefinită. Acest lucru ne-a permis să lucreze cu dispozitive arbitrare, dar această abordare are unele dezavantaje, pe care le-am abordat în Qt 4. Una dintre acestea este faptul că dispozitivul nu poate fi reutilizată: abilitatea de a desena pe widget-uri (bitmap-uri) QPainter a fost legat de platforma, la care QPainter a fost atașat. Prin urmare, suportul pentru un dispozitiv de tip OpenGL reutilizabil a fost incomod și nu foarte eficient.

Acest lucru ne-a încurajat să dezvoltăm un API nou și eficient pentru Qt 4.

Implementarea desenului în Qt 4

În Qt 4, am introdus clasa abstractă QPaintEngine. Implementarea acestei clase oferă funcționalitatea pentru desenarea anumitor tipuri de dispozitive. Clasa QPaintEngine este utilizată în QPainter și QPaintDevice. Este ascunsă de programatorii de aplicații, cu excepția cazului în care suprascrie propriile tipuri de dispozitive bazate pe subclasele QPaintEngine. În prezent, Qt furnizează motoarele de desen pentru următoarele platforme și API-uri:

Pentru a implementa suportul pentru un nou cadru de desenare, trebuie să generați clasa de la QPaintEngine și să înlocuiți funcțiile virtuale. De asemenea, trebuie să fie moștenită de la QPaintDevice și suprascrie QPaintDevice funcția virtuală :: paintEngine (), pentru a specifica QPainter care motorul de vopsea ar trebui să fie utilizat pe acest dispozitiv special.

Principalul avantaj al acestei abordări este că toate desenele se realizează uniform. Aceasta înseamnă că sprijinirea caracteristicilor individuale și păstrarea funcțiilor standard au devenit mult mai ușoare.

Noile caracteristici ale sistemului de desenare Qt 4

Gradient Perii

În Qt 4, a devenit posibilă umplerea formelor cu perii de gradient. Un gradient în acest context înseamnă o tranziție lină de la o anumită culoare la primul punct la o altă culoare la al doilea punct. Un gradient poate fi specificat ca o tranziție de la o culoare la alta sau ca o tranziție prin mai multe culori ale căror poziții sunt stabilite în zona de gradient. Qt 4 sprijină gradienții liniare, radiale și conice.

Gradientul liniar este setat folosind două puncte de control. Instalarea unei umpleri gradient liniar se face prin crearea unui obiect QLinearGradient și setarea acestuia ca perie.

Acest cod va afișa următoarea imagine bitmap:

Gradientul radial este stabilit prin specificarea centrului, a razei și a focalizării. Umplerea gradientului radial este stabilită prin crearea unui obiect QRadialGradient și setarea acestuia ca perie.

Acest cod va afișa următoarea imagine bitmap:

Gradientul conic este setat prin specificarea centrului și a unghiului de pornire. Gradientul conic este umplut prin crearea unui obiect QConicalGradient și setarea acestuia ca perie.







Acest cod va afișa următoarea imagine bitmap:

Alpha-Blended Images

În Qt 4, se realizează amestecarea alfa (Alpha-Blended) a contururilor și a zonelor interioare. Canalul alfa color este specificat în QColor. Canalul alfa definește efectul de opacitate, 0 înseamnă culoarea transparentă transparentă și 255 înseamnă o culoare complet opacă. De exemplu:

Acest cod va afișa următoarea imagine bitmap:

Desenarea utilizând amestecarea alfa este acceptată pe sistemele Windows, Mac OS X și X11 cu extensia X Render instalată.

QPainter și QGLWidget

Acum este posibil să lucrați cu QPainter pe QGLWidget ca și cum ar fi un QWidget normal. Unul dintre avantajele acestui lucru este faptul că folosim OpenGL de înaltă performanță pentru majoritatea operațiunilor de desen, cum ar fi transformările și desenele bitmap.

Linii de netezire

Pe platformele care sprijină propriul API de desen, oferim posibilitatea de a netezi contururile imaginilor primitive.

Acest cod va afișa următoarea imagine bitmap:

Anti-aliasing este acceptat atunci când desenul pe QImage pe toate sistemele cu excepția X11 fără X Render instalat.

Utilizarea extensivă a operațiilor grafice încorporate

Sistemul de desenare Qt utilizează un număr mare de operații grafice încorporate. Ca rezultat, multe acțiuni pot fi efectuate pe hardware-ul computerului, ceea ce dă o viteză mare de execuție a programului.

Printre aceste operațiuni, transformările native (Mac OS X și OpenGL) care realizează desenarea pe matrice sunt mult mai rapide. Unele acțiuni de redare a imaginilor raster sunt, de asemenea, aproape de a efectua cu hardware.

Schițe de desen

Desenul conturului este un obiect construit dintr-un număr de blocuri elementare, cum ar fi dreptunghiuri, elipse, linii și curbe. Conturul poate fi folosit pentru umplere, selecție și tăiere. Principalul avantaj al contururilor înainte de desenul obișnuit al desenelor raster este acela că puteți crea forme neliniare care pot fi modificate în orice moment.

Contururile poate include atât subcontours închise, cum ar fi dreptunghiuri sau elipse sau deschis (în acest caz, subcontours nu pot fi umplute).

Mai jos este un exemplu de utilizare a unei căi. Obiectul desenat are o perie albastru deschis de trei pixeli. Mai întâi, adăugăm un dreptunghi care devine un subcontract închis. Apoi adăugăm două curbe Bezier și, în final, tragem întregul contur.

Acest cod va afișa următoarea imagine bitmap:

Dublu widgeturi tamponare

În Qt 4, toate widgeturile utilizează tampon dublu în mod implicit.

În versiunile anterioare ale Qt, dubla tamponare a fost implementată utilizând o imagine ecranată și apoi copiată pe ecran. De exemplu:

Acum bufferul dublu este susținut de QWidget în sine:

Buffer-ul dublu este activat în mod prestabilit, dar poate fi dezactivat prin setarea în setările widgetului Qt :: WA_PaintOnScreen.

Transformările stiloului și pensulei

În Qt 3, matricea transformărilor nu a fost afectată de stilou și perie. De exemplu, dacă desenați un dreptunghi cu lățimea stilou de 1, calculată folosind recipientul de imagine, ca rezultat, tot ar obține un dreptunghi cu o lățime de linie la 1. Acest lucru face dificilă punerea în aplicare a operațiunilor, cum ar fi scalarea și imprimare de înaltă rezoluție.

În Qt 4, pene și perii folosesc matricea de transformare.

Trebuie remarcat faptul că această caracteristică este încă în curs de dezvoltare și nu este susținută de toate platformele.

Creați un stilou manual

În Qt 4 este posibil să se determine modul în care conturul trebuie umplut. Puteți face acest lucru prin codarea greu a culorii sau folosind QBrush. Aceasta vă permite să specificați structura și gradientul de umplere pentru text și schiță.

Acest cod va afișa următoarea imagine bitmap:

QImage ca dispozitiv de desen

Un mare pas inainte in comparatie cu versiunile anterioare in Qt 4 este crearea unui motor de desen raster care permite lucrul cu QImage. Motorul raster QImage suporta toate caracteristicile QPainter (contururi aliasing, alpha blending, etc.) și pot fi folosite pe toate platformele.

Marele avantaj este că puteți garanta exactitatea desenului pe orice platformă.

Desenarea unei imagini este la fel de simplă ca și desenarea pe orice alt dispozitiv.

Suportul de redare SVG

Scalable Vector Graphics (SVG) este o descriere a limbajului grafice vectoriale statice și animate bidimensionale. Qt include suport pentru funcționalitatea statică a SVG 1.2 Tiny. folosind sistemul îmbunătățit de desenare Qt 4. Desenele SVG pot fi afișate pe orice subclasă de QPaintDevice. cum ar fi QWidget. QImage și QGLWidget. profitând de fiecare dintre ele. Această abordare oferă dezvoltatorilor flexibilitate și capacitatea de a experimenta și de a găsi cea mai bună soluție pentru o anumită situație.

Qt 4

Deoarece SVG este un format XML, modulul QtXml este necesar pentru a citi fișierele SVG. Din acest motiv, clasele de lucru cu SVG sunt situate într-un modul QtSvg separat.

Afișarea desenelor SVG într-o aplicație este la fel de simplă ca afișarea imaginilor raster. Widgetul QSvgWidget poate fi localizat oriunde în interfața cu utilizatorul și, dacă este necesar, poate fi încărcat conținut nou. De exemplu, pentru a încărca și afișa un fișier cunoscut anterior, este necesar un efort minim:

Pentru aplicații specifice, clasa QSvgRenderer oferă un număr de controale pentru vizualizarea și animarea graficelor SVG.







Trimiteți-le prietenilor: