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.
|