zoukankan      html  css  js  c++  java
  • 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<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() 函数和未调用的区别

     

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

  • 相关阅读:
    JAVA序列化
    python教程
    原来root用户只有本地的权限,需要手动将远程的权限打开,尝试了好几种方法,最后还是下面这种方法管用
    MYsql开启远程连接
    雅虎36条优化准则
    需要学习的技术
    可用的谷歌地址
    propertype和_proto_分析
    mvn 插件
    通过 api 调用检查具体日期是否为法定节假日
  • 原文地址:https://www.cnblogs.com/xinxue/p/6306827.html
Copyright © 2011-2022 走看看