Qt学习(002-4)

这次是添加编辑和删除功能。
Qt5.1.1下使用creator创建项目addressbook。

新建addressbook.h:

#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



可以看到,我们定义了枚举类型Mode用来指定通讯录的三种状态:导航、添加、编辑。在类AddressBook中添加了两个槽:
void editContact();
    void removeContact();
以及,添加了两个按钮和Mode变量:
QPushButton *editButton;
    QPushButton *removeButton;
    Mode currentMode;

新建addressbook.cpp:

#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;
    }
}



在程序开始运行时,只有add按钮是启用的,点击add按钮,进入addContact(),将nameLine和addressText中的内容保存到私有变量oldName和oldAddress中,然后清空nameLine和addressText,进入AddingMode。
在updateInterface函数中可以看到AddingMode和EdittingMode做的是同一件事。addContact()和submitContact()的部分代码重构到了updateInterface()函数中。

修改main.cpp:

#include "addressbook.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    AddressBook addressBook;
    addressBook.show();

    return a.exec();
}



OK。

参考:

http://qt-project.org/doc/qt-4.8/tutorials-addressbook-part4.html

转载于:https://my.oschina.net/letiantian/blog/178468

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值