Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。
快捷編輯器示例展示瞭如何創建一個基本的讀寫層次模型,來與Qt的標準視圖和QKeySequenceEdit類一起使用。
Qt的模型/視圖架構爲視圖提供了一種標準的方式來操作數據源中的信息,使用數據的抽象模型來簡化和標準化訪問數據的方式。快捷編輯器模型將操作表示爲項目樹,並允許視圖通過基於索引的系統訪問此數據。更一般地說,可以使用模型以樹結構的形式表示數據,方法是允許每個項作爲子項表的父項。
設計及概念
我們用來表示數據結構的數據結構採用由ShortcutEditorModelItem對象構建的樹表單,每個ShortcutEditorModelItem表示樹視圖中的一個項,幷包含兩列數據。
快捷編輯器結構
數據使用ShortcutEditorModelItem對象存儲在模型內部,這些對象在基於指針的樹結構中鏈接在一起。通常每個ShortcutEditorModelItem都有一個父項,並且可以有許多子項。但是樹結構中的根項沒有父項,也不會在模型之外被引用。
每個ShortcutEditorModelItem都包含有關其在樹結構中的位置的信息,它可以返回父項及其行號。有了這些隨時可用的信息,就可以更容易地實現模型。
由於樹視圖中的每個項通常包含幾列數據(在本例中是一個名稱和一個快捷方式),因此將這些信息存儲在每個項中是很自然的。爲簡單起見,我們將使用一個QVariant對象列表來存儲項目中每一列的數據。
使用基於指針的樹結構意味着,當將模型索引傳遞給視圖時,我們可以記錄索引中相應項的地址(參見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 主題!