地址的拉长、浏览、编辑、查找、输出文件等

 
达成一个简便的地点薄,成效包蕴:地址的增加、浏览、编辑、查找、输出文件等。

1  分界面和要素

  整个地址薄分界面,为 AddressBook 类。在那之中的 Name、Address
以及多少个编辑栏,与 AddressBook 是 “包括” 关系 (has-a),故可将它们注解为 AddressBook
的分子数量。

    图片 1

1) QLabel 

    Name 和 Address 只 呈现文本,可用 QLabel 完结,Qt 中其陈诉为 ”QLabel is used for displaying text or an image. No
user interaction functionality is provided“

2) QLineEdit 

    单行编辑框,可用 QLineEdit 完成,其呈报为 ”The QLineEdit widget is a one-line text editor“

3) QTextEdit

    多行编辑框,可用 QTextEdit 达成,其描述为 ”The QTextEdit class provides a widget that is
used to edit and display both plain and
rich text“

 

2  子类化 (Subclassing)

  地址薄 属于 自定义窗口部件 (custom widget),在 Qt
中并从未对号入座的规范类。常用艺术是:子类化 Qt 中的标准类。

  其他,当三个窗口部件的效果,兼有多少个正规窗口部件的效应时,也常用该方法。子类化的长处如下:

  1)  只需重写基类中的虚函数,来落到实处所要求的功用,浮现了 “面向对象” 的
多态性

  2)  将 UI 界面封装在二个类中,隐蔽了贯彻的内部情形,展现了 “面向对象” 的
封装性

  3)  达成的子类可被三个程序或库调用,呈现了统一准备的 可复用 原则
(reusable)

 
因而,能够通过子类化 QWidget 来贯彻地点薄类 AddressBook

2.1  Q_OBJECT 宏

  #8 的 Q_OBJECT
宏时,可粗略理解为,Qt 中允许此类应用 tr() 和 connect() 函数。

  #15 和 #16 处,申明了七个民用成员数量,QLineEdit 型 和 QTextEdit
型指针,分别代表地址薄中的 Name 和 Address 左边的编辑框。

  那么,在析构函数 ~AddressBook()
中,是或不是内需 delete 这四个指针呢?

 1 #include <QWidget>  // addressbook.h 
 2 
 3 #include <QLineEdit>
 4 #include <QTextEdit>
 5 
 6 class AddressBook : public QWidget
 7 {
 8     Q_OBJECT
 9 
10 public:
11     AddressBook(QWidget *parent = nullptr);
12     ~AddressBook();
13 
14 private:
15     QLineEdit  *name_line_;
16     QTextEdit  *addr_text_;
17 };

  2.2  所有权 (ownership)

  在 AddressBook 的构造函数中,明明 new 了 QLineEdit 和 QTextEdit
型指针,不过在析构函数中,并从未 delete
相应的指针,难道未有内部存储器走漏么?那要从 Qt 的内部存款和储蓄器处理谈到。

  #11 构造函数扬言中,它有三个 QWidget* 类型的参数
parent,该参数会传给其基类的布局函数 (QWidget)。那样,当实例化二个AddressBook 对象时,假诺为其内定了二个父类,则该父类便具备了这些子类的
”全数权“(ownership)。

 
当实行能源处理时,只须求销毁那些父类,则它所具有的具备子类,都会被自动删除,这是
Qt 中的贰个最重要概念 — “全数权”。

  Qt 中的描述为:“The constructor of AddressBook accepts a QWidget parameter.  By convention, we pass this
parameter to the base class’s
constructor.  This concept of ownership, where a parent can have
one or more children, is useful for grouping widgets.  For example,
if you delete a parent, all of its children
will be deleted as well.”

  具体 AddressBook 是怎么着赢得 name_line_ 和 addr_text_ 全数权的,会在 “
布局处理中
” 详细阐释。

 1 #include <QtWidgets/QLabel>
 2 #include <QtWidgets/QLineEdit>
 3 #include <QtWidgets/QTextEdit>
 4 #include <QtWidgets/QGridLayout>
 5 
 6 #include "addressbook.h"
 7 
 8 AddressBook::AddressBook(QWidget *parent)
 9     : QWidget(parent)
10 {
11     QLabel *name_label = new QLabel("Name:");
12     name_line = new QLineEdit;
13     QLabel *addr_label = new QLabel("Address:");
14     addr_text = new QTextEdit;
15 
16     ... ... ...
17 
22     setWindowTitle("Address Book");
23 }
24 
25 AddressBook::~AddressBook()
26 {
27 }

 

3  布局管理

  Qt 中有二种布局管理类,能够拍卖窗口部件的职分摆放,分别是
QHBoxLayout、QVBoxLayout 和 QGridLayout

  当中 QGridLayout
能够因而点名窗口部件的行数和列数,来决定各类窗口部件的布局,如下所示:

    图片 2

  根据地点的行数和列号,在 AddressBook 的构造函数中,增多如下代码:

16     QGridLayout *layout = new QGridLayout;
17 
18     layout->addWidget(name_label, 0, 0);
19     layout->addWidget(name_line_, 0, 1);
20     layout->addWidget(addr_label, 1, 0, Qt::AlignTop);
21     layout->addWidget(addr_text_, 1, 1);
21     setLayout(layout);

   Qt 中 setLayout() 函数的原型为:

void QWidget::setLayout(QLayout *layout);

  具体陈诉为 “Sets the layout manager for this widget to layout.
The QWidget
will take ownership of layout.”

  通过 #21,可以将 AddressBook
的布局管理器设置为 layout, 同时
AddressBook 获得了 layout
的具有权。

 

参谋资料:

   Qt 5.9 | Qt Widgets | Part 1 –
Designning the User Interface

 

相关文章