QFileSystemModel中通過flags函數反應代碼的層級思考

来源:https://www.cnblogs.com/microthink/archive/2018/08/24/9527566.html
-Advertisement-
Play Games

QFileSystemModel繼承自QAbstractItemModel類,作為子類,需要實現一些成員函數。面向對象編程中,如何劃分父類和子類的職責需要仔細權衡。拿flags函數的設計來說,目的是讓model能獲取肚子里的某一個node的信息。如果把它放在父類中,會出現什麼問題呢?問題是,無法針對 ...


   Qt的Model/View設計中,有一些隱藏的代碼,它們大多放在私有類里,對於類的作用非常關鍵,體現著Qt的整體設計思想。然而,由於它們比較隱蔽,學習起來比較繁瑣,受到人們的忽視。然而,體現設計思想,提高編程水平往往需要研讀深層次代碼。所謂奇偉鬼怪之觀,大多在於險遠,非有志者不能至也。

  QFileSystemModel繼承自QAbstractItemModel類,作為子類,需要實現一些成員函數。面向對象編程中,如何劃分父類和子類的職責需要仔細權衡。拿flags函數的設計來說,目的是讓model能獲取肚子里的某一個node的信息。如果把它放在父類中,會出現什麼問題呢?問題是,無法針對子類的個性而做出調整。

  在QFileSystemModel的flags函數裡面,有這樣一行:

    if ((index.column() == 0) && indexNode->permissions() & QFile::WriteUser) {

  這裡面用到了QFile::WriteUser,代表用戶可以寫這個node。正是由於需要根據model的項目而確定一些細節,所以要在子類中寫這個flags函數。

  在函數 QFileSystemModelPrivate::_q_fileSystemChanged中,調用了addNode函數。

void QFileSystemModelPrivate::_q_fileSystemChanged(const QString &path, const QVector<QPair<QString, QFileInfo> > &updates)

  而在addNode函數中,又使用了populate函數,這個單詞的意思是“填充”,這個詞的意思對於理解這個函數的作用非常關鍵:對於一個文件系統的節點,它要麼是文件,要麼是文件夾,都需要一些信息來描述,比如對於文件夾,程式在運行的時候就會為其分配特定的圖標,而對於特定文件類型,則分配對於它的文件類型的圖標。除此之外,如果是文件,他就會有大小信息,這個信息也要在view中顯示出來。populate函數就是用來把文件的信息“填充”到節點裡面的。

另附Qt命名空間中,與flags相關的定義:

enum Qt::ItemFlag
flags Qt::ItemFlags

This enum describes the properties of an item:

 

Constant

Value

Description

Qt::NoItemFlags

0

It does not have any properties set.

Qt::ItemIsSelectable

1

It can be selected.

Qt::ItemIsEditable

2

It can be edited.

Qt::ItemIsDragEnabled

4

It can be dragged.

Qt::ItemIsDropEnabled

8

It can be used as a drop target.

Qt::ItemIsUserCheckable

16

It can be checked or unchecked by the user.

Qt::ItemIsEnabled

32

The user can interact with the item.

Qt::ItemIsAutoTristate

64

The item's state depends on the state of its children. This enables automatic management of the state of parent items in QTreeWidget (checked if all children are checked, unchecked if all children are unchecked, or partially checked if only some children are checked).

Qt::ItemIsTristate

ItemIsAutoTristate

This enum value is deprecated. Use Qt::ItemIsAutoTristate instead.

Qt::ItemNeverHasChildren

128

The item never has child items. This is used for optimization purposes only.

Qt::ItemIsUserTristate

256

The user can cycle through three separate states. This value has been added in Qt 5.5.

Note that checkable items need to be given both a suitable set of flags and an initial state, indicating whether the item is checked or not. This is handled automatically for model/view components, but needs to be explicitly set for instances of QListWidgetItem, QTableWidgetItem, and QTreeWidgetItem.

Note that it is undefined behavior to reimplement QAbstractItemModel::hasChildren to return true for an index if that index has the Qt::ItemNeverHasChildren flag set.

The ItemFlags type is a typedef for QFlags<ItemFlag>. It stores an OR combination of ItemFlag values.

See also QAbstractItemModel.

 還有QFileDevice內部涉及到的定義:

enum QFileDevice::Permission
flags QFileDevice::Permissions

This enum is used by the permission() function to report the permissions and ownership of a file. The values may be OR-ed together to test multiple permissions and ownership values.

 

Constant

Value

Description

QFileDevice::ReadOwner

0x4000

The file is readable by the owner of the file.

QFileDevice::WriteOwner

0x2000

The file is writable by the owner of the file.

QFileDevice::ExeOwner

0x1000

The file is executable by the owner of the file.

QFileDevice::ReadUser

0x0400

The file is readable by the user.

QFileDevice::WriteUser

0x0200

The file is writable by the user.

QFileDevice::ExeUser

0x0100

The file is executable by the user.

QFileDevice::ReadGroup

0x0040

The file is readable by the group.

QFileDevice::WriteGroup

0x0020

The file is writable by the group.

QFileDevice::ExeGroup

0x0010

The file is executable by the group.

QFileDevice::ReadOther

0x0004

The file is readable by anyone.

QFileDevice::WriteOther

0x0002

The file is writable by anyone.

QFileDevice::ExeOther

0x0001

The file is executable by anyone.

Warning: Because of differences in the platforms supported by Qt, the semantics of ReadUser, WriteUser and ExeUser are platform-dependent: On Unix, the rights of the owner of the file are returned and on Windows the rights of the current user are returned. This behavior might change in a future Qt version.

Note: On NTFS file systems, ownership and permissions checking is disabled by default for performance reasons. To enable it, include the following line:


  extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;

Permission checking is then turned on and off by incrementing and decrementing qt_ntfs_permission_lookup by 1.


  qt_ntfs_permission_lookup++; // turn checking on
  qt_ntfs_permission_lookup--; // turn it off again

The Permissions type is a typedef for QFlags<Permission>. It stores an OR combination of Permission values.


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

-Advertisement-
Play Games
更多相關文章
  • 1.Solr的安裝 2.核心概念 1.Solr伺服器 >理解為資料庫 2.核 >表 3.field >表中欄位 3.創建核 1.在solr-home下創建一個目錄(目錄名隨意,例如t_item) 2.拷貝核中所需要的配置文件(solr-home下configsets裡面) : cp -r confi ...
  • Thymeleaf Thymeleaf是跟Velocity、FreeMarker類似的模板引擎,它可以完全替代JSP,相較與其他的模板引擎,它主要有以下幾個特點: 1. Thymeleaf在有網路和無網路的環境下皆可運行,即它可以讓美工在瀏覽器查看頁面的靜態效果,也可以讓程式員在伺服器查看帶數據的動 ...
  • 題意 抄襲自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 正在玩飛行棋。輸入n,m表示飛行棋有n個格子,有m個飛行點,然後輸入m對u,v表示u點可以直接飛向v點,即u為飛行點。如果格子不是飛行點,扔骰子(1~6等概率)前進。否則直接飛到目標 ...
  • 題意 抄襲自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 有n個房間,由n-1條隧道連通起來,形成一棵樹,從結點1出發,開始走,在每個結點i都有3種可能(概率之和為1):1.被殺死,回到結點1處(概率為ki)2.找到出口,走出迷宮 (概率為 ...
  • Python中的if和while語句 1.if流程式控制制 1.語法結構 if 條件測試為 true: 執行語句 elif 條件測試為 true: 執行語句 else true: 執行語句 註意(一個if流程式控制制里,可以有多個elif 條件測試,可以省略else) 2.條件測試(返回布爾值true或者f ...
  • evpp是360出品的一個網路庫,基於libevent,進行了許多改造,對c++11友好。據稱比libevent性能要好。到底有多好呢?360開發人員有自己的測試,信不信由你。 ...
  • 1. jdk,jre,jvm之間的關係 是`Java Java JVM Java JVM`。 可以說 語言是跨平臺的,但 不是。 是`Java JVM`+核心類庫。 是`Java JRE`。 2. Java的分類 JAVASE、JAVAEE、JAVAME 為標準版, 為企業版, 為微型版 3. Ja ...
  • 目錄: 一、一些相關的BIF 二、、課時40課後習題及答案 ********************** 一、一些相關的BIF ********************** 1、issubclass(class,classinfo) 如果第一個參數(class)是第二個參數(classinfo)的一 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...