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