#ifndef ADDRESSBOOK_H #define ADDRESSBOOK_H #include <QWidget> #include <QLineEdit> #include <QTextEdit> #include <QPushButton> #include <QMap> #include <QString> enum Mode { NavigationMode, AddingMode, EditingMode }; class AddressBook : public QWidget { Q_OBJECT public: AddressBook(QWidget *parent = 0); public slots: void addContact(); void submitContact(); void cancel(); void next(); void previous(); void editContact(); void removeContact(); private: void updateInterface(Mode mode); QPushButton *addButton; QPushButton *submitButton; QPushButton *cancelButton; QPushButton *nextButton; QPushButton *previousButton; QLineEdit *nameLine; QTextEdit *addressText; QMap<QString, QString> contacts; QString oldName; QString oldAddress; QPushButton *editButton; QPushButton *removeButton; Mode currentMode; }; #endif // ADDRESSBOOK_H
void editContact(); void removeContact();以及,添加了两个按钮和Mode变量:
QPushButton *editButton; QPushButton *removeButton; Mode currentMode;
#include "addressbook.h" #include <QLabel> #include <QGridLayout> #include <QHBoxLayout> #include <QVBoxLayout> #include <QMessageBox> 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())); editButton = new QPushButton(tr("&Edit")); editButton->setEnabled(false); removeButton = new QPushButton(tr("&Remove")); removeButton->setEnabled(false); connect(editButton, SIGNAL(clicked()), this, SLOT(editContact())); connect(removeButton, SIGNAL(clicked()), this, SLOT(removeContact())); QVBoxLayout *buttonLayout1 = new QVBoxLayout; buttonLayout1->addWidget(addButton, Qt::AlignTop); buttonLayout1->addWidget(submitButton); buttonLayout1->addWidget(cancelButton); buttonLayout1->addWidget(editButton); buttonLayout1->addWidget(removeButton); 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() { this->oldName = nameLine->text(); this->oldAddress = addressText->toPlainText(); nameLine->clear(); addressText->clear(); // nameLine->setReadOnly(false); // nameLine->setFocus(Qt::OtherFocusReason); // addressText->setReadOnly(false); // addButton->setEnabled(false); // submitButton->show(); // cancelButton->show(); this->updateInterface(AddingMode); } 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 (currentMode == AddingMode) { 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 (currentMode == EditingMode) { if (this->oldName != name) { if (!contacts.contains(name)) { contacts.remove(this->oldName); contacts.insert(name, address); QMessageBox::information(this, tr("Edit Successful"), tr("\"%1\" has been edited in your address book.").arg(this->oldName)); } else { QMessageBox::information(this, tr("Edit Unsuccessful"), tr("Sorry, \"%1\" is already in your address book.").arg(name)); } } else if (oldAddress != address) { QMessageBox::information(this, tr("Edit Successful"), tr("\"%1\" has been edited in your address book.").arg(name)); contacts[name] = address; } } this->updateInterface(NavigationMode); // 下面的代码调整到updateInterface()函数中 // 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(this->oldName); nameLine->setReadOnly(true); addressText->setText(this->oldAddress); addressText->setReadOnly(true); addButton->setEnabled(true); submitButton->hide(); cancelButton->hide(); } 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()); } 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()); } void AddressBook::editContact() { oldName = nameLine->text(); oldAddress = addressText->toPlainText(); updateInterface(EditingMode); } void AddressBook::removeContact() { QString name = nameLine->text(); QString address = addressText->toPlainText(); if (contacts.contains(name)) { int button = QMessageBox::question(this, tr("Confirm Remove"), tr("Are you sure you want to remove \"%1\"?").arg(name), QMessageBox::Yes | QMessageBox::No); if (button == QMessageBox::Yes) { previous(); contacts.remove(name); QMessageBox::information(this, tr("Remove Successful"), tr("\"%1\" has been removed from your address book.").arg(name)); } } updateInterface(NavigationMode); } void AddressBook::updateInterface(Mode mode) { currentMode = mode; switch (currentMode) { case AddingMode: case EditingMode: nameLine->setReadOnly(false); //可写 nameLine->setFocus(Qt::OtherFocusReason); addressText->setReadOnly(false); //可写 addButton->setEnabled(false); //禁用 editButton->setEnabled(false); //禁用 removeButton->setEnabled(false); //禁用 nextButton->setEnabled(false); //禁用 previousButton->setEnabled(false); //禁用 submitButton->show(); //submit按钮用来提交 cancelButton->show(); //取消更改 break; case NavigationMode: if (contacts.isEmpty()) { nameLine->clear(); addressText->clear(); } nameLine->setReadOnly(true); addressText->setReadOnly(true); addButton->setEnabled(true); int number = contacts.size(); editButton->setEnabled(number >= 1); removeButton->setEnabled(number >= 1); nextButton->setEnabled(number > 1); previousButton->setEnabled(number >1 ); submitButton->hide(); cancelButton->hide(); break; } }
#include "addressbook.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); AddressBook addressBook; addressBook.show(); return a.exec(); }