Qt 地址薄 (二) 添加地址

Stella981
• 阅读 473

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

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

1  三个按钮

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

   Qt 地址薄 (二)  添加地址

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.3  addStrech() 函数

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

  Qt 地址薄 (二)  添加地址

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 的槽函数,随后被调用

    Qt 地址薄 (二)  添加地址

2.3  connect 函数

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

Qt 地址薄 (二)  添加地址

  具体的实现代码如下:

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 5.9 | Qt Widgets | Part 2 - Adding Addresses

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这