W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
前段時(shí)間筆記本壞掉了,一直沒(méi)有更新博客,現(xiàn)在終于修好了啊,還是來(lái)繼續(xù)《Qt 學(xué)習(xí)之路》這個(gè)系列吧!
接著前面的內(nèi)容,今天要說(shuō)的是另外一個(gè) item view class,QTreeWidget。顧名思義,這個(gè)類用來(lái)展示樹(shù)型結(jié)構(gòu)。同前面說(shuō)的 QListWidget 類似,這個(gè)類需要同另外一個(gè)輔助類 QTreeWidgetItem 一同使用。不過(guò),既然是提供方面的封裝類,即便是看上去很復(fù)雜的樹(shù),在使用這個(gè)類的時(shí)候也是顯得比較簡(jiǎn)單的。當(dāng)不需要使用復(fù)雜的 QTreeView 的特性的時(shí)候,我們可以直接使用 QTreeWidget 代替。
下面來(lái)看代碼。
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);
}
首先,我們?cè)跇?gòu)造函數(shù)里面創(chuàng)建了一個(gè) QTreeWidget 的實(shí)例。然后我們調(diào)用 setColumnCount()函數(shù)設(shè)定欄數(shù)。這個(gè)函數(shù)的效果我們以后再看。然后我們要向 QTreeWidget 添加 QTreeWidgetItem。QTreeWidgetItem 有九個(gè)重載的構(gòu)造函數(shù)。我們?cè)谶@里只是來(lái)看看其中的一個(gè),其余的請(qǐng)自行查閱 API 文檔。這個(gè)構(gòu)造函數(shù)的簽名如下:
QTreeWidgetItem::QTreeWidgetItem ( QTreeWidget * parent, const QStringList & strings, int type = Type );
這里有3個(gè)參數(shù),第一個(gè)參數(shù)用于指定這個(gè) item 屬于哪一個(gè)樹(shù);第二個(gè)參數(shù)是指定這個(gè) item 顯示的文字;第三個(gè)參數(shù)用于指定這個(gè) item 的類型。Type 有兩個(gè)可行的取值:QTreeWidgetItem::Type 和 QTreeWidgetItem::UserType,由于我們并沒(méi)有定義用戶類型,所以只使用其默認(rèn)值即可。這里你會(huì)奇怪,第二個(gè)參數(shù)為什么是一個(gè) QStringList 類型的,而不是 QString 類型的?我們先不去管它,繼續(xù)下面的代碼。
后面我們又創(chuàng)建了一個(gè) QTreeWidgetItem,注意它的第一個(gè)參數(shù)不是 QTreeWidget 而是QTreeWidgetItem 類型的,這就把它的父節(jié)點(diǎn)設(shè)置為前面我們定義的 root 了。然后我們使用了setCheckState()函數(shù),讓它變得可以選擇,最后使用 addChild()函數(shù)把它添加進(jìn)來(lái)。
最后一步,我們創(chuàng)建了一個(gè) QList 類型,前面的 root 添加進(jìn)去,然后 insert 到 top items。這里可以想象到,由于這個(gè)樹(shù)組件可以由多個(gè)根組成(嚴(yán)格來(lái)說(shuō)這已經(jīng)不是樹(shù)了,不過(guò)姑且還是叫樹(shù)吧),所以我們傳進(jìn)來(lái)的是一個(gè) list。
好了,編譯運(yùn)行一下我們的代碼吧!
樣子同我們想象的基本一致,只是這個(gè)樹(shù)的頭上怎么會(huì)有一個(gè)1?還記得我們跳過(guò)去的那個(gè)函數(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 對(duì)應(yīng)的有2個(gè)元素。這樣再來(lái)運(yùn)行一下:
原來(lái)這個(gè) columnCount 就是用于在列表中顯示樹(shù)的!這樣,你就可以很容易的將樹(shù)和列表結(jié)合在一起,從而實(shí)現(xiàn)類似 Windows 資源管理器的界面。當(dāng)然,如果你不需要顯示這個(gè) header,可以調(diào)用setHeaderHidden()函數(shù)將這個(gè)功能隱藏掉。
本文出自 “豆子空間” 博客,請(qǐng)務(wù)必保留此出處 http://devbean.blog.51cto.com/448512/193918
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: