Ferestre și dialoguri

Generalități

Un widget care nu este inclus într-un widget părinte se numește fereastră. De obicei, ferestrele au o ramă și o bară de titlu, deși este posibil să fie create ferestre și fără asemenea decorațiuni. În Qt, QMainWindow [doc.qt.nokia.com] și alte diverse subclase ale lui QDialog [doc.qt.nokia.com] sunt cele mai obișnuite tipuri de ferestre. Orice QWidget [doc.qt.nokia.com] care nu are fereastră devine fereastră și va fi listat în taskbar-ul sistemului de operare. Acest lucru este de dorit pentru o singură fereastră, numită și fereastra principală. În plus orice QWidget care are părinte poate deveni fereastră prin setarea flagului Qt::WA_Window [doc.qt.nokia.com]. În funcție de sistemul de management al ferestrelor, ferestrele secundare sunt de obicei puse deasupra ferestrei lor principale și nu apar în taskbar-ul sistemului de operare. Clasele QMainWindow și QDialog setează flag-ul Qt::WA_Window în constructorul lor, întrucât sunt proiectate pentru a fi folosite ca ferestre. Fereastra principală a unei aplicații furnizează instrumentele pentru construirea unei interfețe principale cu utilizatorul și este creată prin subclasarea QMainWindow . QMainWindow are propriul său layout la care poate fi adăugat o bară de meniu, bară cu instrumente, widget-uri andocabile și o bară de status. Centrul ferestrei principale poate fi ocupat de orice tip de QWidget. Ferestrele de dialog sunt folosite ca ferestre secundare care prezintă utilizatorului opțiuni și alegeri. Dialogurile sunt create prin subclasarea clasei QDialog și folosind widgeturi și layout-uri pentru implementarea interfeței cu utilizatorul. În plus Qt furnizează un număr de dialoguri specializate care pot fi utilizate pentru niște sarcini standard precum selecția unui fișier sau a unui font.

Fereastra principală

Fereastra princiapală unei aplicații se crează prin subclasarea clasei QMainWindow. O fereastră principală Qt are propriul său layout și putem adăuga o bară de unelte (QToolBar [doc.qt.nokia.com]), widget-uri andocabile (QDockWidget [doc.qt.nokia.com]), o bară de meniu (QMenuBar [doc.qt.nokia.com]) și o bară de status (QStatusBar [doc.qt.nokia.com]). Centrul ferestrei principale poate fi ocupat de orice tip de widget și se setează prin apelul funcției void setCentralWidget [doc.qt.nokia.com].


Model de fereastră în Qt

Pentru a adăuga o bară de instrumente mai întâi trebuie să creem o serie de acțiuni. O acțiune este implementată prin clasa QAction [doc.qt.nokia.com]. Aceasta asigură o acțiune abstractă a interfeței grafice care poate fi inserată în widgeturi. În aplicații multe comenzi comune pot fi invocate din meniuri, bară de instrumente sau scurtături de tastatură. Cum utilizatorul se așteaptă ca orice comandă să fie efectuată în același mod, indiferent de modul de apelare, este extrem de util să reprezentăm astfel de comenzi ca acțiuni. Acțiunilor le putem asocia o imagine, un text, o scurtătură de tastatură sau un tooltip. Un exemplu în acest sens îl aveți mai jos:

  1.  newAct = new QAction(QIcon(":/images/new.png"), tr("&New;"), this);
  2.  newAct->setShortcuts(QKeySequence::New);
  3.  newAct->setStatusTip(tr("Crează un nou fisier"));
  4.  connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
Mai apoi creem barele de instrumente propriu-zise:
  1.  fileToolBar = addToolBar(tr("Fisier"));
  2.  fileToolBar->addAction(newAct);
  3.  fileToolBar->addAction(openAct);
  4.  fileToolBar->addAction(saveAct);
  5.  editToolBar = addToolBar(tr("Editare"));
  6.  editToolBar->addAction(cutAct);
  7.  editToolBar->addAction(copyAct);
  8.  editToolBar->addAction(pasteAct);
Aceleași acțiuni pot fi adăugate și la bara de meniu, precum mai jos:
  1.  fileMenu = menuBar()->addMenu(tr("&Fisier;"));
  2.  fileMenu->addAction(newAct);
  3.  fileMenu->addAction(openAct);
  4.  fileMenu->addAction(saveAct);
  5.  fileMenu->addAction(saveAsAct);
  6.  fileMenu->addSeparator();
  7.  fileMenu->addAction(exitAct);
  8.  
  9.  editMenu = menuBar()->addMenu(tr("&Editare;"));
  10.  editMenu->addAction(cutAct);
  11.  editMenu->addAction(copyAct);
  12.  editMenu->addAction(pasteAct);
  13.  menuBar()->addSeparator();
  14.  
  15.  helpMenu = menuBar()->addMenu(tr("&Ajutor;"));
  16.  helpMenu->addAction(aboutAct);
  17.  helpMenu->addAction(aboutQtAct);

Pentru a seta widget-ul central ne folosim de funcția void setCentralWidget [doc.qt.nokia.com] precum în exemplul următor :

  1.  textEdit = new QPlainTextEdit;
  2.  setCentralWidget(textEdit);

Iar dacă dorim să avem acces la bara de status, folosim funcția void showMessage [doc.qt.nokia.com] precum mai jos:
  1.  statusBar()->showMessage(tr("Gata"));
Iar la final vom obține o fereastră principală ca în imaginile de mai jos :

Ferestre de dialog

Clasa QAction [doc.qt.nokia.com] este clasa de bază pentru ferestrele de dialog. O fereastră de dialog este o fereastră folosită mai ales pentru sarcini pe termen scurt și comunicări succinte cu utilizatorul. Dialogurile pot fi modale, caz în care utilizatorul trebuie să furnizeze informațiile necesare înainte ca lucrul în fereastra principală să poate continua, sau nemodale. Dialogurile nemodale permit utilizatorului să interacționeze și cu alte ferestre ale aplicației. Butonul implicit al unui dialog este butonul care este apăsat atunci când utilizatorul apasă tasta Enter. Pentru a seta butonul implicit al unui dialog apelăm funcția : void setDefault(bool) [doc.qt.nokia.com] al clasei QPushButton [doc.qt.nokia.com] . Atunci când utilizatorul va apăsa tasta Esc într-un fereastră de dialog, se va invoca funcția void reject() [doc.qt.nokia.com]. Acest lucru va duce la închiderea ferestrei. Qt ne pune la dispoziție un set de dialoguri gata implementate precum :
  • QColorDialog [doc.qt.nokia.com] – asigură o fereastră de dialog prin intermediul căreia putem alege și specifica culori. De exemplu, în cadrul unui program de desenare putem folosi un asemenea dialog pentru a alege culoarea cu care se desenează.

  • QFileDialog [doc.qt.nokia.com] – furnizează o fereastră de dialog prin intermediul căreia putem selecta fișiere sau directoare. El permite utilizatorului să navigheze prin sistemul de fișiere. Cel mai ușor mod de a folosi acest dialog este printr-o funcție statică precum în următorul exemplu :
    1.  QFileDialog::getOpenFileName(0, "Open Image", "",
    2.    "Image (*.png *.jpg *.bmp)");
  • QFontDialog [doc.qt.nokia.com] – ne dă posibilitatea să creăm o fereastră de dialog prin care să selectăm un font. Un exemplu de apel aveți mai jos :

  1.  QFont font = QFontDialog::getFont(QFont("Helvetica [Cronyx]", 10), 0);

  • QInputDialog [doc.qt.nokia.com] – este o fereastră de dialog prin care obținem o singură valoare de de la utilizator. Această valoare poate fi un text, un număr sau un element dintr-o listă. De asemenea trebuie precizat și o etichetă prin care să înștiințăm utilizatorul ce anume trebuie să introducă. Pentru a ne declara o asemenea fereastră se folosește în mod uzual funcțiile statice getText(), [doc.qt.nokia.com] getInt() [doc.qt.nokia.com], getDouble() [doc.qt.nokia.com] și getItem() [doc.qt.nokia.com] precum în exemplul următor :

  1.  QString text = QInputDialog::getText(0, "QInputDialog::getText()",
  2.    "Numele tau:", QLineEdit::Normal,QDir::home().dirName());

  • QMessageBox [doc.qt.nokia.com] – este o fereastră modală de dialog folosită pentru a informa utilizatorul sau pentru a-l interoga cu intenția de obține un răspuns. Ea afișează un text informativ, iar uneori se cere de la utilizator un răspuns. O astfel de fereastră poate afișa o imagine sau niște butoane standard. Ea suportă 4 nivele predefinite a nivelului de securitate, care se diferențiază prin imaginea pe care o afișează fiecare.
    1. Întrebare – pentru a interoga un utilizator.
    2. Informație – pentru a raporta informații.
    3. Avertisment – pentru a raporta erori non-critice.
    4. Critic – pentru a raporta erori critice. Cel mai convenabil mod de folosi aceste ferestre este prin apelarea funcţiilor ei statice precum în exemplul următor:

  1.  int ret = QMessageBox::warning(0, "Aplicatia mea",
  2.    "Documentul a fost modificat.\n"
  3.     "Doriti sa salvati schimbarile?",
  4.    QMessageBox::Save | QMessageBox::Discard |     QMessageBox::Cancel,QMessageBox::Save);

  • QPageSetupDialog [doc.qt.nokia.com] – este o fereastră de dialog care ne oferă opțiuni de printare pentru o pagină.
  • QPrintDialog [doc.qt.nokia.com] – ne dă posibilitatea să specificăm configurarea unei imprimante. Putem schimba mărimea foii, orientarea, tipul de imprimare (color sau alb-negru), paginile care urmează să fie printate, respectiv numărul de copii.
  • QPrintPreviewDialog [doc.qt.nokia.com] – putem vedea și configura așezarea în pagină a paginilor pe care urmează să le printăm.
  • QProgressDialog – este o fereastră de dialog care ne informează despre progresul unei operații de lungă durată. Această fereastră dă posibilitatea utilizatorului să anuleze respectiva operație. Următorul cod ne propune o variantă de utilizare a acestei ferestre de dialog:

  1.  qint32 numFiles = 100000;
  2.  QProgressDialog progress("Copiaza fisiere...", "Anuleaza copiere", 0,numFiles, 0);
  3.  progress.setWindowModality(Qt::WindowModal);
  4.  for (int i = 0; i < numFiles; i++) {
  5.   progress.setValue(i); if (progress.wasCanceled())break;
  6.  }
  7.  progress.setValue(numFiles);

Categories: