Qt 地址薄 (一) 界面設計

来源:http://www.cnblogs.com/xinxue/archive/2017/01/20/6305951.html
-Advertisement-
Play Games

實現一個簡單的地址薄,功能包括:地址的添加、瀏覽、編輯、查找、輸出文件等。 1 界面和元素 整個地址薄界面,可視為一個 AddressBook 類。而其中的 Name、Address 以及右側的兩個編輯欄,是包含在 AddressBook 中的元素,也即 “包含” 關係 (“has-a”)。因此,可 ...


  實現一個簡單的地址薄,功能包括:地址的添加、瀏覽、編輯、查找、輸出文件等。

1  界面和元素

  整個地址薄界面,可視為一個 AddressBook 類。而其中的 Name、Address 以及右側的兩個編輯欄,是包含在 AddressBook 中的元素,也即 “包含” 關係 (“has-a”)。因此,可以將它們聲明為AddressBook 的成員數據。

   

  Name 和 Address 不涉及與用戶的交互,只顯示文本,因此,可用 QLabel 來實現,其描述為 QLabel is used for displaying text or an image. No user interaction functionality is provided“

  Name 右側的單行編輯框,可用 QLineEdit 來實現,其描述為 ”The QLineEdit widget is a one-line text editor“

  Address 右側的多行編輯框,可用 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,使用 Qt Creator 創建工程,會自動生成如下的代碼框架 (除綠色標記的代碼外,其餘的都是自動生成的)

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 class QLineEdit;
 4 class QTextEdit;
 5 
 6 class AddressBook : public QWidget
 7 {
 8     Q_OBJECT
 9 
10 public:
11     AddressBook(QWidget *parent = 0);
12     ~AddressBook();
13 
14 private:
15     QLineEdit  *m_nameLine;
16     QTextEdit  *m_addrText;
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 是如何獲得 m_nameLinem_addrText 所有權的,會在 “3  佈局管理中” 詳細闡述。

 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 *nameLabel = new QLabel("Name:");
12     m_nameLine = new QLineEdit;
13     QLabel *addressLabel = new QLabel("Address:");
14     m_addrText = new QTextEdit;
15 
16     ... ... ...
17 
22     setWindowTitle("Address Book");
23 }
24 
25 AddressBook::~AddressBook()
26 {
27 }

  2.3  main.cpp

#include "addressbook.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    AddressBook w;
    w.show();

    return a.exec();
}

 

3  佈局管理

  Qt 中有三個佈局管理類,可以處理視窗部件的位置擺放,分別是 QHBoxLayout、QVBoxLayout 和 QGridLayout

  其中 QGridLayout 可以通過指定視窗部件的行數和列數,來控制各個視窗部件的佈局,如下所示:

   

  按照上面的行數和列號,在 AddressBook 的構造函數中,添加如下代碼:

16     QGridLayout *layout = new QGridLayout;
17 
18     layout->addWidget(nameLabel, 0, 0);
19     layout->addWidget(m_nameLine, 0, 1);
20     layout->addWidget(addressLabel, 1, 0, Qt::AlignTop);
21     layout->addWidget(m_addrText, 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 的擁有權。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近兩天在學習MongoDB,強大的文檔資料庫。給我最大的感覺就是相比於SQL或者MSQ等傳統的關係型資料庫,在使用和配置上真的是簡化了很多。無論是在集群的配置還是故障轉移方面,都省去了許多繁瑣的步驟,但最重要是的什麼呢?是效率,它的出現解決了傳統關係型資料庫的IO瓶頸,極大的提高了工作效率,適合海 ...
  • 以前一直沒註意actionresult都能返回哪些類型的類型值(一直用的公司的內部工具類初始化進行返回的),今天跟大家分享一下(也是轉載的別人的日誌qaq)。 首先我們瞭解一下對action的要求: 1.必須是一個public方法 2.必須是實例方法 3.不能被重載 4.必須返回ActionResu ...
  • 接觸SourceCode公司的工作流產品K2.NET 2003有一段時間了,想把一些心得分享出來,和各位共同探討一下,拋磚引玉,希望能對相關人士以啟發。 K2.Net 2003是基於微軟.Net Framework技術框架之上的工作流平臺,能夠實現企事業內部人與人、人與部門、以及人與系統間的流程自動 ...
  • Delphi/Lazarus 裡面有個概念就是介面,這個概念在很多語言裡面也都存在,而且發揚,dot Net 就是這樣。 提到介面自然而然就想到COM、DCOM、OLE、ActiveX等相關知識,不錯,確實可以應用於這些環境,而且Delphi/Lazarus中的Interface功能強大到不僅實現微... ...
  • MySQL的簡易封裝以及使用 源碼地址 https://github.com/YouXianMing/MySQL-Example 確保你的 MySQL 處於運行狀態 其中有個資料庫文件是 MyDataBase 以及該資料庫中有一個表 t_Student 沒有的話就用這3個命令進行創建 代碼中與之對應 ...
  • gcc 最開始的時候是 GNU C Compiler, 如你所知,就是一個c編譯器。但是後來因為這個項目裡邊集成了更多其他不同語言的編譯器,GCC就代表 the GNU Compiler Collection,所以表示一堆編譯器的合集。 g++則是GCC的c++編譯器。現在你在編譯代碼時調用的gcc ...
  • //在註冊時用戶名不能是純數字, 防止一個人的用戶名和另一個人的手機號相同public function Login(){ if (IS_AJAX) { $username = I('param.username'); //var_dump($username); $password = I('pa... ...
  • 我是一個C++初學者,控制台實現了一個俄羅斯方塊游戲。 代碼如下: C++ //"俄羅斯方塊"V1.0 //李國良於2017年1月20日編寫完成 include include include include include include using namespace std; int bloc ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...