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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...