Qt 地址薄 (二) 添加地址

在上一篇 Qt 地址薄 (一) 界面设计 中,主要是实现了地址簿的界面,使用布局管理器进行元素的布局,并解释了 “子类化” 和 “所有权” 的概念。

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


(资料图片仅供参考)

1 三个按钮

如下所示,在 AddressBook 的右侧,添加三个按钮,分别命名为 “Add”、“Submit” 和 \"Cancel\"

1.1 数据成员

这三个按钮与 AddressBook 是 \"包含\" 关系 (has-a),因此,可声明为 AddressBook 的数据成员

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

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

QMapcontacts_;

为了保存 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.3 addStrech() 函数

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

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.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()));

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.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); // 设置 Add 按钮使能    submit_btn_->hide();  // 隐藏 Submit 和 Cancel 按钮    cancel_btn_->hide();}

【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】

点击这里:

关键词:

上一篇:讯息:“声”入人心!长沙学院音乐党课开讲
下一篇:世界热消息:安帅:比赛中花了很多精力在高位施压 在斯坦福桥需要战斗和牺牲
热门推荐