「Qt Widget中文示例指南」如何實現一個快捷編輯器(一)

Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。

快捷編輯器示例展示瞭如何創建一個基本的讀寫層次模型,來與Qt的標準視圖和QKeySequenceEdit類一起使用。

「Qt Widget中文示例指南」如何實現一個快捷編輯器

Qt的模型/視圖架構爲視圖提供了一種標準的方式來操作數據源中的信息,使用數據的抽象模型來簡化和標準化訪問數據的方式。快捷編輯器模型將操作表示爲項目樹,並允許視圖通過基於索引的系統訪問此數據。更一般地說,可以使用模型以樹結構的形式表示數據,方法是允許每個項作爲子項表的父項。

設計及概念

我們用來表示數據結構的數據結構採用由ShortcutEditorModelItem對象構建的樹表單,每個ShortcutEditorModelItem表示樹視圖中的一個項,幷包含兩列數據。

快捷編輯器結構

數據使用ShortcutEditorModelItem對象存儲在模型內部,這些對象在基於指針的樹結構中鏈接在一起。通常每個ShortcutEditorModelItem都有一個父項,並且可以有許多子項。但是樹結構中的根項沒有父項,也不會在模型之外被引用。

每個ShortcutEditorModelItem都包含有關其在樹結構中的位置的信息,它可以返回父項及其行號。有了這些隨時可用的信息,就可以更容易地實現模型。

由於樹視圖中的每個項通常包含幾列數據(在本例中是一個名稱和一個快捷方式),因此將這些信息存儲在每個項中是很自然的。爲簡單起見,我們將使用一個QVariant對象列表來存儲項目中每一列的數據。

「Qt Widget中文示例指南」如何實現一個快捷編輯器

使用基於指針的樹結構意味着,當將模型索引傳遞給視圖時,我們可以記錄索引中相應項的地址(參見QAbstractItemModel::createIndex()),並稍後使用QModelIndex::internalPointer()檢索它。這使得編寫模型更容易,並確保引用同一項的所有模型索引具有相同的內部數據指針。

有了適當的數據結構,我們就可以用最少的額外代碼創建樹模型,爲其他組件提供模型索引和數據。

ShortcutEditorModelItem類定義

ShortcutEditorModelItem類定義如下:

這個類是一個基本的c++類,它不繼承QObject,也不提供信號和插槽。它用於保存qvariables列表,其中包含列數據和關於其在樹結構中的位置的信息。這些函數提供以下特性:

  • appendChildItem()用於在模型首次構造時添加數據,在正常使用期間不會使用。
  • child()和childCount()函數允許模型獲取任何子項的信息。
  • 與項目相關聯的列數信息由columnCount()提供,每列中的數據可以通過data()函數獲得。
  • row()和parent()函數用於獲取項的行號和父項。

父項和列數據存儲在parentItem和itemData私有成員變量中,childItems變量包含一個指向該項自身子項的指針列表。

ShortcutEditorModel類定義

ShortcutEditorModel類定義如下:

 

class ShortcutEditorModel : public QAbstractItemModel
{
Q_OBJECT

class ShortcutEditorModelItem
{
public:
explicit ShortcutEditorModelItem(const QList<QVariant> &data,
ShortcutEditorModelItem *parentItem = nullptr);
~ShortcutEditorModelItem();

void appendChild(ShortcutEditorModelItem *child);

ShortcutEditorModelItem *child(int row) const;
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
ShortcutEditorModelItem *parentItem() const;
QAction *action() const;

private:
QList<ShortcutEditorModelItem *> m_childItems;
QList<QVariant> m_itemData;
ShortcutEditorModelItem *m_parentItem;
};

public:
explicit ShortcutEditorModel(QObject *parent = nullptr);
~ShortcutEditorModel() override;

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
Qt::ItemFlags flags(const QModelIndex &index) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &index) const override;
int rowCount(const QModelIndex &index = QModelIndex()) const override;
int columnCount(const QModelIndex &index = QModelIndex()) const override;

bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;

void setActions();

private:
void setupModelData(ShortcutEditorModelItem *parent);

ShortcutEditorModelItem *m_rootItem;
};

 

這個類類似於提供讀寫模型的QAbstractItemModel的大多數其他子類,只有構造函數的表單和setupModelData()函數是特定於這個模型的。此外,我們還提供了一個析構函數,以便在模型被銷燬時進行清理。

Qt Widget組件推薦

  • QtitanRibbon - Ribbon UI組件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技術的Ribbon UI組件,QtitanRibbon致力於爲Windows、Linux和Mac OS X提供功能完整的Ribbon組件。
  • QtitanChart - Qt類圖表組件:是一個C ++庫,代表一組控件,這些控件使您可以快速地爲應用程序提供漂亮而豐富的圖表。
  • QtitanDataGrid - Qt網格組件:提供了一套完整的標準 QTableView 函數和傳統組件無法實現的獨特功能。使您能夠將不同來源的各類數據加載到一個快速、靈活且功能強大的可編輯網格中,支持排序、分組、報告、創建帶狀列、拖放按鈕和許多其他方便的功能。
  • QtitanDocking:允許您像 Visual Studio 一樣爲您的偉大應用程序配備可停靠面板和可停靠工具欄。黑色、白色、藍色調色板完全支持 Visual Studio 2019 主題!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章