Carnet d'adresses 3 - Navigation entre les ?l?mentsФайлы:
L'application "Carnet d'adresses" est maintenant ? moiti? termin?e. Il nous faut maintenant ajouter quelques fonctions pour naviguer entre les contacts. Avant de commencer, il faut se d?cider sur le type de structure de donn?es le plus appropri? pour stocker les contacts. Dans le chapitre 2, nous avons utilis? un QMap utilisant des paires cl?-valeur, avec le nom du contact comme cl?, et l'adresse du contact comme valeur. Cela fonctionnait bien jusqu'ici, mais pour ajouter la navigation entre les entr?es, quelques am?liorations sont n?cessaires. Nous am?liorerons le QMap en le faisant ressembler ? une structure de donn?es similaire ? une liste li?e, o? tous les ?l?ments sont connect?s, y compris le premier et le dernier ?l?ment. La figure ci-dessous illustre cette structure de donn?e. D?finition de la classe AddressBookPour ajouter les fonctions de navigation au carnet d'adresses, nous avons besoin de deux slots suppl?mentaires dans notre classe AddressBook: next() et previous(). Ceux-ci sont ajout?s au fichier addressbook.h: void next(); void previous(); Nous avons aussi besoin de deux nouveaux objets QPushButton, nous ajoutons donc les variables priv?es nextButton et previousButton. QPushButton *nextButton; QPushButton *previousButton; Impl?mentation de la classe AddressBookA l'int?rieur du constructeur de AddressBook, dans addressbook.cpp, nous instancions nextButton et previousButton et nous les d?sactivons par d?faut. Nous faisons ceci car la navigation ne doit ?tre activ?e que lorsqu'il y a plus d'un contact dans le carnet d'adresses. nextButton = new QPushButton(tr("&Next")); nextButton->setEnabled(false); previousButton = new QPushButton(tr("&Previous")); previousButton->setEnabled(false); Nous connectons alors ces boutons ? leur slots respectifs: connect(nextButton, SIGNAL(clicked()), this, SLOT(next())); connect(previousButton, SIGNAL(clicked()), this, SLOT(previous())); L'image ci-dessous montre l'interface utilisateur que nous allons cr?er. Remarquez que cela ressemble de plus en plus ? l'interface du programme complet. Nous suivons les conventions pour les fonctions next() et previous() en pla?ant nextButton ? droite et previousButton ? gauche. Pour faire cette mise en page intuitive, nous utilisons un QHBoxLayout pour placer les widgets c?te ? c?te: QHBoxLayout *buttonLayout2 = new QHBoxLayout; buttonLayout2->addWidget(previousButton); buttonLayout2->addWidget(nextButton); L'objet QHBoxLayout, buttonLayout2, est ensuite ajout? ? mainLayout. mainLayout->addLayout(buttonLayout2, 2, 1); La figure ci-dessous montre les syst?mes de coordonn?es pour les widgets du mainLayout. Dans notre m?thode addContact(), nous avons desactiv? ces boutons pour ?tre s?r que l'utilisateur n'utilise pas la navigation lors de l'ajout d'un contact. nextButton->setEnabled(false); previousButton->setEnabled(false); Dans notre m?thode submitContact(), nous activons les boutons de navigation, nextButton et previousButton, en fonction de la taille de contacts. Commen mentionn? plus t?t, la navigation n'est activ?e que si il y a plus d'un contact dans le carnet d'adresses. Les lignes suivantes montrent comment faire cela: int number = contacts.size(); nextButton->setEnabled(number > 1); previousButton->setEnabled(number > 1); Nous incluons aussi ces lignes de code dans le bouton cancel(). Souvenez vous que nous voulons ?muler une liste-li?e ciruculaire ? l'aide de l'objet QMap, contacts. Pour faire cela, nous obtenons un it?rateur sur contact dans la m?thode next(), et ensuite:
void AddressBook::next() { QString name = nameLine->text(); QMap<QString, QString>::iterator i = contacts.find(name); if (i != contacts.end()) i++; if (i == contacts.end()) i = contacts.begin(); nameLine->setText(i.key()); addressText->setText(i.value()); } Une fois que nous avons it?r? jusqu'? l'objet recherch? dans contacts, nous affichons son contenu sur nameLine et addressText. De la m?me fa?on, pour la m?thode previous(), nous obtenons un it?rateur sur contacts et ensuite:
void AddressBook::previous() { QString name = nameLine->text(); QMap<QString, QString>::iterator i = contacts.find(name); if (i == contacts.end()){ nameLine->clear(); addressText->clear(); return; } if (i == contacts.begin()) i = contacts.end(); i--; nameLine->setText(i.key()); addressText->setText(i.value()); } ? nouveau, nous affichons le contenu de l'objet courant dans contacts. |
Попытка перевода Qt документации. Если есть желание присоединиться, или если есть замечания или пожелания, то заходите на форум: Перевод Qt документации на русский язык... Люди внесшие вклад в перевод: Команда переводчиков |