翻譯|使用教程|編輯:龔雪|2024-04-29 11:15:07.653|閱讀 125 次
概述:本文將為大家介紹如何使用Qt Widget小部件如何實現一個快捷編輯器,歡迎下載最新版組件體驗~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用于超過70個行業、數千家企業,支持數百萬設備及應用。
快捷編輯器示例展示了如何創建一個基本的讀寫層次模型,來與Qt的標準視圖和QKeySequenceEdit類一起使用。
Qt技術交流群:166830288 歡迎一起進群討論
Qt的模型/視圖架構為視圖提供了一種標準的方式來操作數據源中的信息,使用數據的抽象模型來簡化和標準化訪問數據的方式。快捷編輯器模型將操作表示為項目樹,并允許視圖通過基于索引的系統訪問此數據。更一般地說,可以使用模型以樹結構的形式表示數據,方法是允許每個項作為子項表的父項。
我們用來表示數據結構的數據結構采用由ShortcutEditorModelItem對象構建的樹表單,每個ShortcutEditorModelItem表示樹視圖中的一個項,并包含兩列數據。
快捷編輯器結構
數據使用ShortcutEditorModelItem對象存儲在模型內部,這些對象在基于指針的樹結構中鏈接在一起。通常每個ShortcutEditorModelItem都有一個父項,并且可以有許多子項。但是樹結構中的根項沒有父項,也不會在模型之外被引用。
每個ShortcutEditorModelItem都包含有關其在樹結構中的位置的信息,它可以返回父項及其行號。有了這些隨時可用的信息,就可以更容易地實現模型。
由于樹視圖中的每個項通常包含幾列數據(在本例中是一個名稱和一個快捷方式),因此將這些信息存儲在每個項中是很自然的。為簡單起見,我們將使用一個QVariant對象列表來存儲項目中每一列的數據。
使用基于指針的樹結構意味著,當將模型索引傳遞給視圖時,我們可以記錄索引中相應項的地址(參見QAbstractItemModel::createIndex()),并稍后使用QModelIndex::internalPointer()檢索它。這使得編寫模型更容易,并確保引用同一項的所有模型索引具有相同的內部數據指針。
有了適當的數據結構,我們就可以用最少的額外代碼創建樹模型,為其他組件提供模型索引和數據。
ShortcutEditorModelItem類定義如下:
這個類是一個基本的c++類,它不繼承QObject,也不提供信號和插槽。它用于保存qvariables列表,其中包含列數據和關于其在樹結構中的位置的信息。這些函數提供以下特性:
父項和列數據存儲在parentItem和itemData私有成員變量中,childItems變量包含一個指向該項自身子項的指針列表。
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()函數是特定于這個模型的。此外,我們還提供了一個析構函數,以便在模型被銷毀時進行清理。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都網