Creați-vă propriile widget-uri qt
Când am început să studieze biblioteca Qt. foarte util pentru a arăta un exemplu de un widget care afișează o linie de rulare. Un astfel de exemplu este descris în acest articol, vom face cu ea:
- mecanism și sloturi Qt de semnalizare;
- organizarea Qt obiectelor într-o structură arborescentă oferind deallocation obiect automat fractură-mamă;
- eveniment de manipulare în Qt.
Ca rezultat, vom crea propriul widget, și conectați-l la controalele standard.
Propriul widget Qt
clasa QObject
Biblioteca Qt este un set de cele mai diferite clase, multe dintre ele sunt descendenți ai QObject de clasă. care vă permite să:
- utilizarea semnalelor Qt și mecanismul de sloturi;
- organiza obiectele într-o structură arborescentă;
- informații complementare despre tipul obiectului (obiect de date meta);
- muta obiectul într-un flux separat [1];
- se ocupe de evenimente (QEvent);
- utilizați Timer-ul încorporat QObject;
Semnale Mecanism și sloturi Qt
Semnale și mecanismul de sloturi permite obiectelor să comunice. De exemplu, modificarea textului în câmpul de introducere a semnalului (QLineEdit) este generat textChanged. care se pot ocupa orice alt obiect, cu funcția sa handler este numit un slot. Pentru că, în cazul unui semnal de control a primit unele sloturi, suficient pentru a le conecta funcția de conectare.
In exemplu, atunci când generarea unui semnal obiect valueChanged speedSpinBox activat slotul setSpeed obiect runline.
Un semnal poate fi conectat cu mai multe fante. semnale și sloturi mecanism face posibilă site-uri de chat, situate în diferite fluxuri. Ultimul argument al metodei poate fi tipul de conectare de conectare, care să permită trecerea de procesare a semnalului asincron și sincron. Tipul de conexiune implicit Qt :: AutoConnection. însemnând procesarea asincronă dacă sursa și procesorul de semnal sunt situate într-un singur flux și sincron (semnalele acumulate în linia de curgere), în caz contrar. Pentru a utiliza acest mecanism în descrierea timpurie a clasei ar trebui să fie macro Q_OBJECT.
Listarea arată că linia noastră de rulare are două sloturi, pentru a schimba șirul de text și viteza de mișcare, dar nu generează nici un semnal.
Colectarea automată a gunoiului în Qt
Atunci când se utilizează Qt obiecte de biblioteci formează adesea o structură arborescentă cu relația „părinte-copil“. Orice obiect poate fi atribuit un părinte prin apelarea setParent. obține o listă de obiecte pentru copii de către copii sau, de exemplu, pentru a căuta prin obiecte copil. De obicei obiectul părinte este trecut ca un parametru de constructor obiect copil.
Odată cu distrugerea părintelui, șterge recursiv toate obiectele copil. Uneori, acest proces este numit de colectare a gunoiului automat (ca memoria alocăm mâinile, și a distrus obiectele în sine).
În exemplul nostru creează o fereastră principală (clasa MainWidget), care include clasa de obiecte QSpinBox. QLineEdit și RunLine. Este evident că a investit QLineEdit nu are nici un sens „să plece în viață“ după fereastra principală este închisă, adică, durata de viață a câmpului de intrare nu este mai mare decât durata de viață a ferestrei principale, astfel încât fereastra principală poate fi un părinte pentru obiectul sub ea. Situația nu este întotdeauna atât de evident, atunci când stabilesc relații „părinte-copil“ în Qt ar trebui să fie ghidate cu precizie de durata de viață a obiectelor.
Diagrama utilizate clase Qt
findChild findChildren și metode permit să găsească obiecte copil printre cei care trebuie să aibă un tip și nume prestabilit (nume poate fi setat metoda setObjectName). Informații despre tipul și numele unui obiect se numește o meta-obiect.
Informațiile meta-obiect este, de asemenea, utilizat, de exemplu, atunci când apelarea funcției qobject_cast. verificarea obiectului aparține unui anumit tip.
compilator C ++ nu stie nimic despre numele obiectelor (clase in C ++ structura mai simple), semnale, sloturi, evenimente, etc. În legătură cu aceasta, de fiecare dată când o trimite compilare Qt program, mai întâi este alimentat la intrarea compilator meta-obiect (MOC). care inițiază meta-obiecte și generează un cod compilator obișnuit de înțeles.
eveniment de manipulare în Qt
După lucrul cu alte biblioteci, cum ar fi WinAPI poate fi dificil de înțeles diferența dintre semnalul și evenimentul, acesta este în sursa de expunere:
- Dacă vom apăsa butonul, butonul se ocupă de un eveniment (QKeyEvent / QMouseEvent, QTouchEvent caută decât presat.), Butonul generează un semnal;
- dacă am fi avut un mouse-ul peste o fereastra, elementele de sub mouse-ul primit despre acest eveniment QHoverEvent. În plus, să se ocupe de eveniment QPaintEvent. deoarece zona a ferestrei sub mouse-ul este redesenat.
Din aceste exemple, este clar că semnalul obiect ar trebui să fie generate atunci când schimbă starea sa internă și evenimentul vine întotdeauna din mediul extern. Sursa evenimentului poate fi un pointer, și butonul mouse-ului roata, tastatura, touch screen, adaptor AC, sau, de exemplu, timer-ul de sistem.
Când primiți evenimentele în cerere, se extinde atâta timp cât este manipulat (în cazul în care orice obiect să se ocupe de un eveniment, acesta trebuie să-l facă să accepte o metodă care să nu se răspândească în continuare).
De exemplu, am dat click pe butonul spinboksa, evenimentul primește o primă MainWidget. ci pentru că l trateze, el nu poate, atunci se trece la elementul copil, click a fost făcută pe care (la spinboksu) spinboks trece butonul de eveniment, pe care le procesează și solicită să accepte metoda. generarea unui semnal dat click.
Exemplu reflectă mecanismul de manipulare eveniment de esență, cu toate acestea, oricare dintre intermediarii ar putea ocupa de asemenea eveniment (în acest caz, ca alerga la accepta. Intrerupând evenimentul de procesare și de transfer este procesat mai departe). eveniment metodă virtuală poate fi utilizată pentru a pune în aplicare un astfel de comportament. În plus, obiectul poate genera evenimente și metode sendEvent postEvent.
Personal, cred că generarea de evenimente nu este abordarea corectă. Poate că ar trebui utilizat în anumite situații foarte specifice, nu este posibil să se utilizeze semnale și sloturi (care nu se văd astfel de situații). mai multe tipuri de manipulare eveniment, precum și evenimente din alte obiecte în metoda transformă codul eveniment în terci de cereale și că nu este bun. Utilizați corect evenimentele.
evenimente timer de procesare
Biblioteca Qt există 3 tipuri de timer - construit în QObject, QTimer și QBasicTimer. Toate aceste cronometre implicite rula pe firul în care au fost create, și anume, ei nu pot lucra în timp ce efectuează orice alt cod în fluxul de curent, și, prin urmare, exactitatea lor depinde de volumul de muncă și granulația (granularitate, complexitatea funcțiilor) curs de apa. Dacă aveți nevoie de precizie, timer-ul ar trebui să fie mutat într-un fir separat.
Cel mai convenabil dintre acestea este QTimer, se recomandă să utilizați înregistrările oficiale - acesta generează un semnal de frecvență predeterminată. O descriere mai detaliată și exemplu de utilizare QTimer pot fi găsite în articolul următor [2].
QBasicTimer este nivelul scăzut, periodic (generează evenimente până este oprit) cronometrul. Toate cronometre de interfață sunt 4 metoda - isActive returnează true dacă timer-ul se execută, timer-ul returnează timerId Identificator (necesar în cazul în care handler obiect primește evenimente din mai multe cronometre și ar trebui să se facă distincția între ele). Metode de oprire și de a porni și opri cronometrul este pornit, respectiv. Metoda Start preia ca argumente intervalul în milisecunde la care evenimentele vor fi generate și un pointer la un obiect de tratare a evenimentului pentru care trebuie să fie înlocuită metoda timerEvent.
Cronometrele de interfață construit în QObject este mult ca QBasicTimer. Ei, de asemenea, sunt periodice și generează evenimente, mai degrabă decât semnale. Start cronometru implementat startTimer metoda, care primește frecvența și returnează un ID temporizator. Temporizatorul rulează și generează evenimente, atâta timp până când este distrusă de killTimer (primind identificator temporizator ca argument).
Linia noastră de funcționare trebuie să fie mutat la intervale regulate, pentru a îndeplini această cerință este cel mai convenabil de a folosi un contor de timp. Aplicăm timer-ul încorporat pentru a da un exemplu de manipulare eveniment în Qt.
Creați o interfață cu utilizatorul Qt
Clasa de QWidget este baza pentru toate widget-uri (de control). Această clasă cuprinde o multitudine de câmpuri și metode, de exemplu, metode pentru redimensionarea sau mutarea obiectului. Widget-urile pot fi imbricate (vizual, mai degrabă decât cu atitudinea de instalare „părinte-copil“ a discutat mai sus), containerul widget poate utiliza managerul de plasare (QLayout).
Listarea designerul MainWidget prezentat managerului de mai sus au folosit QGridLayout, permițând să plaseze widget-uri nested pe grila, acesta poate fi utilizat în plus sau QVBoxLayout QHBoxLayout (pentru plasarea widget într-o linie verticală sau pe orizontală, respectiv). layout manager controlează mărimea și poziția de widget-uri imbricate atunci când mărimea containerului widget. În plus, managerii pot găzdui imbricate. Locul widget convenabil vizual mouse-ul folosind QtDesigner [2], dar în acest articol noi numim în mod clar addWidget. În multe cazuri, în mod explicit utilizarea addWidget este posibilă numai, de exemplu, dacă vom dezvolta jocul „Minesweeper“ și dimensiunea terenului de joc nu a fost cunoscut în prealabil.
Metoda de clasa addWidget QGridLayout preia ca argumente coordonează doua și a treia ale celulei din stânga sus a tabelului în care să plaseze widget-ul specificat în primul argument. Ultimele două argumente sunt numărul de celule pe verticală și pe orizontală, care va avea widgetul.
La listele de mai sus, este posibil să observați că clasa Marquee moștenește QLabel și solicită setText metodei sale. clasa QLabel este proiectat pentru afișarea textului sau a imaginilor este subclasă de QFrame.QLabel vă permite să utilizați etichete HTML pentru conținutul de design, cu toate acestea, in articolul curent foloseste numai metoda setText () pentru a seta textul afișat.
Clasa QFrame extinde capacitatea de a afișa QWidget margine în jurul unui widget și este o bază pentru controale, care necesită cadru special. Mostenitorii clasa QFrame sunt, de exemplu, bara de instrumente widget (QToolBox), derulați specii de widget (QAbstractScrollArea) sau un widget de afișare text / imagine (QLabel).