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