首要是促成了地址簿的界面。主要是兑现了地址簿的界面。

  于达到平等首 Qt 地址薄 (一)
界面设计
中,主要是贯彻了地址簿的界面,使用布局管理器进行元素的布局,并解释了
“子类化” 和 “所有权” 的概念。

  以达标同首 Qt 地址薄 (一)
界面设计
中,主要是贯彻了地址簿的界面,使用布局管理器进行元素的布局,并解释了
“子类化” 和 “所有权” 的概念。

  本篇将在上面的功底及,在界面被新加三个 QPushButton 按钮,通过 “信号 –
槽函数” 机制,实现保存 Name 和 Address 内容之功能。

  本篇将在地方的底子及,在界面被新加三个 QPushButton 按钮,通过 “信号 –
槽函数” 机制,实现保存 Name 和 Address 内容的成效。

 

 

1  三个按钮

  如下所示,在 AddressBook 的下手,添加三个按钮,分别命名也
“Add”、“Submit” 和 “Cancel”

  

1  三独按钮

  如下所示,在 AddressBook 的右,添加三只按钮,分别命名也
“Add”、“Submit” 和 “Cancel”

  

1.1  数据成员

  这三个按钮与 AddressBook 是 “包含” 关系 (has-a),因此,可声明也
AddressBook 的多寡成员

 QPushButton  *add_btn_;
 QPushButton  *submit_btn_;
 QPushButton  *cancel_btn_;

 为了保存输入的 Name 和 Address,声明一个 QMap<QString, QString>
类型的数码成员

QMap<QString, QString>  contacts_;

 为了保存 Name 和 Address 之前的情节,再声称两独 QString 类型的数据成员

 QString  old_name_;
 QString  old_addr_;

1.1  数据成员

  这三独按钮与 AddressBook 是 “包含” 关系 (has-a),因此,可声明也
AddressBook 的多寡成员

 QPushButton  *add_btn_;
 QPushButton  *submit_btn_;
 QPushButton  *cancel_btn_;

 为了保留输入的 Name 和 Address,声明一个 QMap<QString, QString>
类型的数目成员

QMap<QString, QString>  contacts_;

 为了保留 Name 和 Address 之前的情节,再声明两独 QString 类型的多寡成员

 QString  old_name_;
 QString  old_addr_;

1.2  布局

  新建 QVBoxLayout 型 layout_btn,将立刻三单按钮组合成一列,再用
layout_btn 参加到 主布局管理器 layout 中

  // three btn 
  add_btn_ = new QPushButton(tr("Add"));
  submit_btn_ = new QPushButton(tr("Submit"));
  cancel_btn_ = new QPushButton(tr("Cancel"));

  // new layout_btn 
  QVBoxLayout  *layout_btn = new QVBoxLayout;
  layout_btn->addWidget(add_btn_, Qt::AlignTop);
  layout_btn->addWidget(submit_btn_);
  layout_btn->addWidget(cancel_btn_);
  layout_btn->addStretch();

  // add layout_btn into layout
  layout->addLayout(layout_btn,1,2);

1.2  布局

  新建 QVBoxLayout 型 layout_btn,将立即三只按钮组合成一列,再以
layout_btn 在到 主布局管理器 layout 中

  // three btn 
  add_btn_ = new QPushButton(tr("Add"));
  submit_btn_ = new QPushButton(tr("Submit"));
  cancel_btn_ = new QPushButton(tr("Cancel"));

  // new layout_btn 
  QVBoxLayout  *layout_btn = new QVBoxLayout;
  layout_btn->addWidget(add_btn_, Qt::AlignTop);
  layout_btn->addWidget(submit_btn_);
  layout_btn->addWidget(cancel_btn_);
  layout_btn->addStretch();

  // add layout_btn into layout
  layout->addLayout(layout_btn,1,2);

1.3  addStrech() 函数

  下图是布局管理器,调用 addStretch() 函数和免调用的区分

 

 

1.3  addStrech() 函数

  下图是布局管理器,调用 addStretch() 函数和未调用的分

 

 

2  信号槽

2  信号槽

2.1  功能描述

1)  Add 功能

   QLineEdit 和 QTextEdit 的默认为才读,若点击 Add
按钮,二者状态成为可编制。此时,用户可输入 Name 和 Address
的内容。同时,显示有 Submit 和 Cancel 两只按钮

2)  Submit 功能

   点击 Submit 按钮,可拿用户输入的 Name 和 Address
保存到程序中。若输入为空,则提醒请输入的信息;若该 Name
已经补给加了,则提示已增长

3)  Cancel 功能

   点击 Cancel 按钮,可拿用户输入的 Name 和 Address
取消掉,不进行保存,同时出示出事先的 Name 和 Address

2.1  功能描述

1)  Add 功能

   QLineEdit 和 QTextEdit 的默认为单独读,若点击 Add
按钮,二者状态成为可编制。此时,用户可输入 Name 和 Address
的情。同时,显示出 Submit 和 Cancel 两单按钮

2)  Submit 功能

   点击 Submit 按钮,可将用户输入的 Name 和 Address
保存到程序中。若输入为空,则提示请输入的音信;若该 Name
已经补给加了,则提醒已经添加

3)  Cancel 功能

   点击 Cancel 按钮,可将用户输入的 Name 和 Address
取消掉,不开展封存,同时展示有事先的 Name 和 Address

2.2  信号槽机制

   信号槽机制,主要用于 类对象期间的通信,是 Qt
的精粹所在,与的类似之发生:观察者模式,回调机制当

   当特定的波产生后,相应的信号为有,则同拖欠信号 connect 的槽函数,随后于调用

   

2.2  信号槽机制

   信号槽机制,主要用以 类对象之间的通信,是 Qt
的精华所在,与的类似之有:观察者模式,回调机制当

   当特定的事件闹后,相应的信号为出,则与拖欠信号 connect 的槽函数,随后被调用

   

2.3  connect 函数

  使用 connect 函数,将发射信号的类似对象 + 信号,以及接信号的类对象 +
槽函数,连接起来

  具体的贯彻代码如下:

connect(add_btn_, SIGNAL(clicked()), this, SLOT(OnAdd()));
connect(submit_btn_, SIGNAL(clicked()), this, SLOT(OnSubmit()));
connect(cancel_btn_, SIGNAL(clicked()), this, SLOT(OnCancel()));

 

2.3  connect 函数

  使用 connect 函数,将发出信号的类似对象 + 信号,以及接受信号的好像对象 +
槽函数,连接起来

  具体的兑现代码如下:

connect(add_btn_, SIGNAL(clicked()), this, SLOT(OnAdd()));
connect(submit_btn_, SIGNAL(clicked()), this, SLOT(OnSubmit()));
connect(cancel_btn_, SIGNAL(clicked()), this, SLOT(OnCancel()));

 

3  槽函数

  头文件中宣称了三单槽函数,如下所示:

public slots:
    void  OnAdd();
    void  OnSubmit();
    void  OnCancel();

3  槽函数

  头文件被声明了三个槽函数,如下所示:

public slots:
    void  OnAdd();
    void  OnSubmit();
    void  OnCancel();

3.1  OnAdd() 函数

void AddressBook::OnAdd()
{
    old_name_ = name_line_->text();  // 保存以前的 Name 和 Address
    old_addr_ = addr_text_->toPlainText();
    name_line_->clear();
    addr_text_->clear();

    name_line_->setReadOnly(false);  // 设置 QLineEdit 和 QTextEdit 可编辑
    name_line_->setFocus(Qt::OtherFocusReason);
    addr_text_->setReadOnly(false);

    add_btn_->setEnabled(false);  // 显示 Submit 按钮 和 Cancel 按钮 
    submit_btn_->show();
    cancel_btn_->show();
}

3.1  OnAdd() 函数

void AddressBook::OnAdd()
{
    old_name_ = name_line_->text();  // 保存以前的 Name 和 Address
    old_addr_ = addr_text_->toPlainText();
    name_line_->clear();
    addr_text_->clear();

    name_line_->setReadOnly(false);  // 设置 QLineEdit 和 QTextEdit 可编辑
    name_line_->setFocus(Qt::OtherFocusReason);
    addr_text_->setReadOnly(false);

    add_btn_->setEnabled(false);  // 显示 Submit 按钮 和 Cancel 按钮 
    submit_btn_->show();
    cancel_btn_->show();
}

3.2  OnSubmit() 函数

 

void AddressBook::OnSubmit()
{
    QString name = name_line_->text();
    QString address = addr_text_->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()) {
          name_line_->clear();
          addr_text_->clear();
      }

      name_line_->setReadOnly(true);
      addr_text_->setReadOnly(true);
      add_btn_->setEnabled(true);
      submit_btn_->hide();
      cancel_btn_->hide();
}

 

3.2  OnSubmit() 函数

 

void AddressBook::OnSubmit()
{
    QString name = name_line_->text();
    QString address = addr_text_->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()) {
          name_line_->clear();
          addr_text_->clear();
      }

      name_line_->setReadOnly(true);
      addr_text_->setReadOnly(true);
      add_btn_->setEnabled(true);
      submit_btn_->hide();
      cancel_btn_->hide();
}

 

3.3  OnCancel() 函数

void AddressBook::OnCancel()
{
    name_line_->setText(old_name_);
    name_line_->setReadOnly(true);
    addr_text_->setText(old_addr_);
    addr_text_->setReadOnly(true);

    add_btn_->setEnabled(true);
    submit_btn_->hide();
    cancel_btn_->hide();
}

 

3.3  OnCancel() 函数

void AddressBook::OnCancel()
{
    name_line_->setText(old_name_);
    name_line_->setReadOnly(true);
    addr_text_->setText(old_addr_);
    addr_text_->setReadOnly(true);

    add_btn_->setEnabled(true);
    submit_btn_->hide();
    cancel_btn_->hide();
}

 

参考资料:

  Qt 5.9 | Qt Widgets | Part 2 – Adding
Addresses

 

参考资料:

  Qt 5.9 | Qt Widgets | Part 2 – Adding
Addresses