QTreeWidget

2018-10-07 15:18 更新

QTreeWidget

前段時間筆記本壞掉了,一直沒有更新博客,現(xiàn)在終于修好了啊,還是來繼續(xù)《Qt 學(xué)習(xí)之路》這個系列吧!

接著前面的內(nèi)容,今天要說的是另外一個 item view class,QTreeWidget。顧名思義,這個類用來展示樹型結(jié)構(gòu)。同前面說的 QListWidget 類似,這個類需要同另外一個輔助類 QTreeWidgetItem 一同使用。不過,既然是提供方面的封裝類,即便是看上去很復(fù)雜的樹,在使用這個類的時候也是顯得比較簡單的。當(dāng)不需要使用復(fù)雜的 QTreeView 的特性的時候,我們可以直接使用 QTreeWidget 代替。

下面來看代碼。

treewidget.h


#ifndef TREEWIDGET_H 
#define TREEWIDGET_H 

#include <QtGui> 

class TreeWidget : public QWidget 
{ 
public: 
        TreeWidget(); 

private: 
        QTreeWidget *tree; 
}; 

#endif // TREEWIDGET_H

treewidget.cpp


#include "treewidget.h" 

TreeWidget::TreeWidget() 
{ 
        tree = new QTreeWidget(this); 
        tree->setColumnCount(1); 
        QTreeWidgetItem *root = new QTreeWidgetItem(tree, QStringList(QString("Root"))); 
        QTreeWidgetItem *leaf = new QTreeWidgetItem(root, QStringList(QString("Leaf 1"))); 
        root->addChild(leaf); 
        QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root, QStringList(QString("Leaf 1"))); 
        leaf2->setCheckState(0, Qt::Checked); 
        root->addChild(leaf2); 
        QList<QTreeWidgetItem *> rootList; 
        rootList << root; 
        tree->insertTopLevelItems(0, rootList); 
} 

首先,我們在構(gòu)造函數(shù)里面創(chuàng)建了一個 QTreeWidget 的實例。然后我們調(diào)用 setColumnCount()函數(shù)設(shè)定欄數(shù)。這個函數(shù)的效果我們以后再看。然后我們要向 QTreeWidget 添加 QTreeWidgetItem。QTreeWidgetItem 有九個重載的構(gòu)造函數(shù)。我們在這里只是來看看其中的一個,其余的請自行查閱 API 文檔。這個構(gòu)造函數(shù)的簽名如下:


QTreeWidgetItem::QTreeWidgetItem ( QTreeWidget * parent, const QStringList & strings, int type = Type );

這里有3個參數(shù),第一個參數(shù)用于指定這個 item 屬于哪一個樹;第二個參數(shù)是指定這個 item 顯示的文字;第三個參數(shù)用于指定這個 item 的類型。Type 有兩個可行的取值:QTreeWidgetItem::Type 和 QTreeWidgetItem::UserType,由于我們并沒有定義用戶類型,所以只使用其默認值即可。這里你會奇怪,第二個參數(shù)為什么是一個 QStringList 類型的,而不是 QString 類型的?我們先不去管它,繼續(xù)下面的代碼。

后面我們又創(chuàng)建了一個 QTreeWidgetItem,注意它的第一個參數(shù)不是 QTreeWidget 而是QTreeWidgetItem 類型的,這就把它的父節(jié)點設(shè)置為前面我們定義的 root 了。然后我們使用了setCheckState()函數(shù),讓它變得可以選擇,最后使用 addChild()函數(shù)把它添加進來。

最后一步,我們創(chuàng)建了一個 QList 類型,前面的 root 添加進去,然后 insert 到 top items。這里可以想象到,由于這個樹組件可以由多個根組成(嚴格來說這已經(jīng)不是樹了,不過姑且還是叫樹吧),所以我們傳進來的是一個 list。

好了,編譯運行一下我們的代碼吧!

樣子同我們想象的基本一致,只是這個樹的頭上怎么會有一個1?還記得我們跳過去的那個函數(shù)嗎?下面我們修改一下代碼看看:


#include "listwidget.h" 

TreeWidget::TreeWidget() 
{ 
        tree = new QTreeWidget(this); 
        tree->setColumnCount(2); 
        QStringList headers; 
        headers << "Name" << "Number"; 
        tree->setHeaderLabels(headers); 
        QStringList rootTextList; 
        rootTextList << "Root" << "0"; 
        QTreeWidgetItem *root = new QTreeWidgetItem(tree, rootTextList); 
        QStringList leafTextList; 
        leafTextList << "Leaf 1" << "1"; 
        QTreeWidgetItem *leaf = new QTreeWidgetItem(root, leafTextList); 
        root->addChild(leaf); 
        QStringList leaf2TextList; 
        leaf2TextList << "Leaf 2" << "2"; 
        QTreeWidgetItem *leaf2 = new QTreeWidgetItem(root, leaf2TextList); 
        leaf2->setCheckState(0, Qt::Checked); 
        root->addChild(leaf2); 
        QList<QTreeWidgetItem *> rootList; 
        rootList << root; 
        tree->insertTopLevelItems(0, rootList); 
}

我們把 columnCount 設(shè)為2,然后傳入的 QStringList 對應(yīng)的有2個元素。這樣再來運行一下:

原來這個 columnCount 就是用于在列表中顯示樹的!這樣,你就可以很容易的將樹和列表結(jié)合在一起,從而實現(xiàn)類似 Windows 資源管理器的界面。當(dāng)然,如果你不需要顯示這個 header,可以調(diào)用setHeaderHidden()函數(shù)將這個功能隱藏掉。

本文出自 “豆子空間” 博客,請務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號