创建addressbook.h:
#ifndef ADDRESSBOOK_H#define ADDRESSBOOK_H#include#include #include #include #include #include class AddressBook : public QWidget{ Q_OBJECTpublic: AddressBook(QWidget *parent = 0);public slots: void addContact(); void submitContact(); void cancel(); void next(); void previous();private: QPushButton *addButton; QPushButton *submitButton; QPushButton *cancelButton; QPushButton *nextButton; QPushButton *previousButton; QLineEdit *nameLine; QTextEdit *addressText; QMap contacts; QString oldName; QString oldAddress;};#endif // ADDRESSBOOK_H
可以看到新增了两个按钮:nextButton和previousButton;新增了两个槽next()、previous()。
新建addressbook.cpp:
#include "addressbook.h"#include在构造函数中可以看到新建了水平布局buttonLayout2,并将nextButton和previousButton添加到该布局中。buttonLayout2布局被添加到mainLayout布局中。 next()和previous()方法中主要是对QMap对象的操作。 contacts对象的find()方法会返回一个STL风格的迭代器,该迭代器是key等于find()参数的第一个键值对。 关于QMap,详细见: 。 开始时候,next和previous按钮是禁用状态,但是在submitContact()中的:#include #include #include #include AddressBook::AddressBook(QWidget *parent) : QWidget(parent){ QLabel *nameLabel = new QLabel(tr("Name:")); nameLine = new QLineEdit; nameLine->setReadOnly(true); QLabel *addressLabel = new QLabel(tr("Address:")); addressText = new QTextEdit; addressText->setReadOnly(true); addButton = new QPushButton(tr("&Add")); addButton->show(); submitButton = new QPushButton(tr("&Submit")); submitButton->hide(); cancelButton = new QPushButton(tr("&Cancel")); cancelButton->hide(); connect(addButton, SIGNAL(clicked()), this, SLOT(addContact())); connect(submitButton, SIGNAL(clicked()), this, SLOT(submitContact())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(cancel())); QVBoxLayout *buttonLayout1 = new QVBoxLayout; buttonLayout1->addWidget(addButton, Qt::AlignTop); buttonLayout1->addWidget(submitButton); buttonLayout1->addWidget(cancelButton); buttonLayout1->addStretch(); nextButton = new QPushButton(tr("&Next")); nextButton->setEnabled(false); previousButton = new QPushButton(tr("&Previous")); previousButton->setEnabled(false); connect(nextButton, SIGNAL(clicked()), this, SLOT(next())); connect(previousButton, SIGNAL(clicked()), this, SLOT(previous())); QHBoxLayout *buttonLayout2 = new QHBoxLayout; buttonLayout2->addWidget(previousButton); buttonLayout2->addWidget(nextButton); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(nameLabel, 0, 0); mainLayout->addWidget(nameLine, 0, 1); mainLayout->addWidget(addressLabel, 1, 0, Qt::AlignTop); mainLayout->addWidget(addressText, 1, 1); mainLayout->addLayout(buttonLayout1, 1, 2); mainLayout->addLayout(buttonLayout2, 2, 1); setLayout(mainLayout); setWindowTitle(tr("Simple Address Book"));}void AddressBook::addContact(){ oldName = nameLine->text(); oldAddress = addressText->toPlainText(); nameLine->clear(); addressText->clear(); nameLine->setReadOnly(false); nameLine->setFocus(Qt::OtherFocusReason); addressText->setReadOnly(false); addButton->setEnabled(false); submitButton->show(); cancelButton->show();}void AddressBook::submitContact(){ QString name = nameLine->text(); QString address = addressText->toPlainText(); if (name.isEmpty() || address.isEmpty()) { QMessageBox::information(this, tr("Empty Field"), tr("Please enter a name and address.")); return; } if (!contacts.contains(name)) { contacts.insert(name, address); QMessageBox::information(this, tr("Add Successful"), tr("\"%1\" has been added to your address book.").arg(name)); } else { QMessageBox::information(this, tr("Add Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); return; } if (contacts.isEmpty()) { nameLine->clear(); addressText->clear(); } nameLine->setReadOnly(true); addressText->setReadOnly(true); addButton->setEnabled(true); submitButton->hide(); cancelButton->hide(); int number = contacts.size(); nextButton->setEnabled(number > 1); previousButton->setEnabled(number > 1);}void AddressBook::cancel(){ nameLine->setText(oldName); nameLine->setReadOnly(true); addressText->setText(oldAddress); addressText->setReadOnly(true); addButton->setEnabled(true); submitButton->hide(); cancelButton->hide();}void AddressBook::next(){ QString name = nameLine->text(); QMap ::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());}void AddressBook::previous(){ QString name = nameLine->text(); QMap ::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());}
int number = contacts.size(); nextButton->setEnabled(number > 1); previousButton->setEnabled(number > 1);当添加的条目大于1时候,这两个按钮被激活。
修改main.cpp:
#include "addressbook.h"#includeint main(int argc, char *argv[]){ QApplication a(argc, argv); AddressBook addressBook; addressBook.show(); return a.exec();}
运行结果:
#include "addressbook.h"#includeint main(int argc, char *argv[]){ QApplication a(argc, argv); AddressBook addressBook; addressBook.show(); return a.exec();}