Pagina principala
Informatii
Internationalizarea
pROgrame KDE/Qt
Download
Documentatii
Despre LKR
Contact
Resurse
Harta site-ului

Programarea setarilor utilizator in KDE 3


   Andreas Nicolai
   18 Mai 2003

Partea a-VII-a: Conectarea dialogului si a obiectului de configurare

Acum sa vedem cum iteractioneaza dialogul si obiectul de configurare. Ori de cite ori dialogul este afisat, widget-urile ar trebui sa contina valorile din obiectul de configurare. De aceea ne trebuie o functie care va transfera datele din obiect in dialog, functie pe care o nunim updateDialog(). Pe de alta parte ne mai trebuie o functie care va transfera setarile facute in dialog catre obiectul de configurare. Acest transfer trebuie facut ori de cite ori utilizatorul apasa butoanele "Seteaza" sau "Ok". Vom numi aceasta functie updateConfiguration(). Bineinteles sinteti liber sa numiti aceste functii cum doriti.

Implementarea functiilor membru arata astfel (nu uitati sa declarati functiile in fiserul antet!):


void PrefDialog::updateDialog() {
  m_prefGeneral->m_textEdit->setText( Config().m_text );
  m_prefStyle->m_colorBtn->setColor( Config().m_textColor );
  m_prefStyle->m_fontLabel->setFont( Config().m_font );
}

void PrefDialog::updateConfiguration() {
  Config().m_text         = m_prefGeneral->m_textEdit->text();
  Config().m_textColor    = m_prefStyle->m_colorBtn->color();
  Config().m_font         = m_prefStyle->m_fontLabel->font();
};
prefdialog.cpp

Aceste functii sint foarte simple asa ca nu le mai explic.

Nota:
Daca doar copiati si lipiti codul sursa, veti primiti niste mesaje stranii de compilare. De obicei sint rezultatul lipsei unor fisiere antet. Am folosit widget-urile KLineEdit, QLabel si KColorButton de aceea trebuie sa includem fisierele antet corespunzatoare (am sa va las sa le gasiti singur)

Acum unde trebuie apelate aceste functii? Inainte ca dialogul sa fie executat, vom adauga un apel la updateDialog() in functia executePreferencesDlg() din fereastra principala. Mai adaugam un apel la updateConfiguration() cind utilizatorul accepta setarile (apasind butonul "Ok"). Butonul "Seteaza" este mai special, asa ca il sarim pentru moment.

Iata mai jos noua functie executePreferencesDlg():


void SettingsTutorial::executePreferencesDlg() {
  if (m_prefDialog==0)
	  // creeaza dialogul la cerere
    m_prefDialog=new PrefDialog(this);
	// actualizeaza widget-urile dialogului
  m_prefDialog->updateDialog();
  // executa dialogul
  if (m_prefDialog->exec()==QDialog::Accepted) {
    // salveaza setarile in obiectul de configurare
    m_prefDialog->updateConfiguration();
		// aplica setarile
    applyPreferences();
  };
};
settingstutorial.cpp

Dupa ce veti compila si rula programul puteti deja sa modificati doua dintre setari si vor avea efect imediat dupa ce apasati butonul "Ok". Oricum problema este ca nu am cerut obiectului de configurare sa salveze datele. Salvarea configurarilor depinde de proiectarea aplicatiei. De obicei daca salvarea setarilor se face in punctul in care se aplica nu este o idee rea. Cel putin trebuie sa luati in considerare ca aplicatia dumneavoastra s-ar putea sa crape si toate setarile se vor pierde. Ca alternativa ar fi salvarea la iesirea din program. Acest tutorial va merge pe calea usoara. Vom adauga un apel la Config().write() in functia membru applyPreferences(). Nu o sa va arat acest cod sursa, ci ar trebui sa-l scrieti dumneavoastra.

Acum aplicatia va salva setarile si le va restaura la urmatoarea executie. Dar butonul "Choose..." ("Alege") nu merge inca. Aceasta este inca o oportunitate de a folosi conectarea unui semnal la un slot.

Cum stim deja ca semnalul clicked() nu trimite nici un parametru, vom crea un slot numit chooseBtnClicked() pe care il declaram ca slot privat. Slotul poate fi privat deoarece semnalul este emis in interiorul clasei PrefStyle si nu vom folosi acest slot niciodata din afara clasei. Declaratia clasei PrefStyle devine:


#ifndef PREFSTYLE_H
#define PREFSTYLE_H

#include 
#include 

/// Implementarea paginii "Style settings"
/// din dialogul de preferinte.
class PrefStyle : public PrefStyleLayout {
    Q_OBJECT
  public:
    /// Constructorul
    PrefStyle(QWidget *parent, const char *name=0, WFlags f=0);

  private slots:
    /// Apelat cind este apasat butonul "Choose..."
    void chooseBtnClicked();
};

#endif  // PREFSTYLE_H
prefstyle.h

Acum sa aruncam o privire la mofificariile pe care trebuie sa le facem in fisierul prefstyle.cpp:


#include <qfont.h>          // pentru QFont
#include <kpushbutton.h>    // pentru KPushButton
#include <kfontdialog.h>    // pentru KFontDialog
#include <qlabel.h>

#include "prefstyle.h"
#include "prefstyle.moc"

PrefStyle::PrefStyle(QWidget *parent, const char *name, WFlags f)
 : PrefStyleLayout(parent, name, f)
{
  connect(m_fontBtn, SIGNAL(clicked()), this, SLOT(chooseBtnClicked()));
}

void PrefStyle::chooseBtnClicked() {
  QFont tmpFont = m_fontLabel->font();
  int result = KFontDialog::getFont(tmpFont);
  if (result==KFontDialog::Accepted)
    m_fontLabel->setFont(tmpFont);
};
prefstyle.cpp

Prima modificare este in constructor. Am adaugat o linie care conecteaza semnalul clicked() al butonului la slotul nostru.

Acum haideti sa discutam despre implementarea slotului. Mare parte din implementare va este familiara, dar KFontDialog este ceva nou. Cele mai des folosite dialoguri sint puse la dispozitie de librariile KDE. Dialogul tipic pentru fonturi poate fi folosit imediat. Spatiul de nume KFontDialog contine o functie declarata static care permite utilizatorului sa selecteze un font. Se numeste getFont() si dintre parametrii pe care ii primeste ne intereseaza doar unul singur: fontul preselectat. Parametrul trimis este o referinta la font si dupa ce dialogul este inchis, acesta va contine fontul selectat de utilizator.

Restul este evident. La inceput luam fontul din eticheta, deschidem dialogul si daca utilizatorul accepta dialogul (apasa butonul "Ok"), setam noul font la eticheta. Acum avem un dialog de setari complet cu posibilitatea salvarii si restaurarii setarilor. Putem spune ca am ajuns la sfirsitul tutorialului... dar nu inca! Butoanele "Implicit" si "Seteaza" nu functioneaza inca!

Oricum, aici puteti gasi o arhiva a proiectului curent: settingstutorial-05.tar.gz

Daca va trebuie un dialog simplu fara butoanele "Implicit" si "Seteaza", puteti termina aici, dar nu uitati sa stergeti codurile butoanelor din apelul constructorului KDialogBase.



Traducere de Bogdan Daniel Vatra. Adaptare de Claudiu Costin.