Qt中實現(xiàn)樹形結構可以使用QTreeWidget類,也可以使用QTreeView類,QTreeWidget繼承自QTreeView類。樹形效果如下圖所示:
這是怎么實現(xiàn)的呢?還有點擊節(jié)點時會有相應的事件響應。
1. 樹形結構實現(xiàn)
QT GUI中有treeWidget部件,將該控件在Gui中布局好,假設其對象名為treeWidget。
QTreeWidget類官方文檔:http://qt-project.org/doc/qt-4.8/qtreewidget.html
樹形結構通過QTreeWidget類和QTreeWidgetItem類實現(xiàn),QTreeWidgetItem類實現(xiàn)結點的添加。上圖代碼實現(xiàn)如下:
ui->treeWidget->setColumnCount(1); //設置列數(shù) ui->treeWidget->setHeaderLabel(tr("圖像選擇")); //設置頭的標題 QTreeWidgetItem *imageItem1 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("圖像1"))); imageItem1->setIcon(0,QIcon("xxx.png")); QTreeWidgetItem *imageItem1_1 = new QTreeWidgetItem(imageItem1,QStringList(QString("Band1"))); //子節(jié)點1 imageItem1->addChild(imageItem1_1); //添加子節(jié)點 QTreeWidgetItem *imageItem2 = new QTreeWidgetItem(ui->treeWidget,QStringList(QString("圖像2"))); QTreeWidgetItem *imageItem2_1 = new QTreeWidgetItem(imageItem2,QStringList(QString("Band1"))); //子節(jié)點1 QTreeWidgetItem *imageItem2_2 = new QTreeWidgetItem(imageItem2,QStringList(QString("Band2"))); //子節(jié)點2 imageItem2->addChild(imageItem2_1); //添加子節(jié)點 imageItem2->addChild(imageItem2_2); ui->treeWidget->expandAll(); //結點全部展開
當然,還有其他的一些方法用于設置,具體需要時查查幫助文檔學習。
除了使用上面這種方法之外,還可以使用QList<QTreeWidgetItem *> & items實現(xiàn)結點的添加。QT中對C++中的STL庫中的容器使用進行了封裝,使用其封裝的類可以很方便的解決很多類似很復雜數(shù)據(jù)結構的問題。實現(xiàn)如下:
//只寫結點的實現(xiàn) QList<QTreeWidgetItem *> rootList; QTreeWidgetItem *imageItem1 = new QTreeWidgetItem; //添加第一個父節(jié)點 imageItem1->setText(0,tr("圖像1")); rootList.append(imageItem1); QTreeWidgetItem *imageItem1_1 = new QTreeWidgetItem(imageItem1,QStringList(QString("Band1"))); //添加子節(jié)點 imageItem1->addChild(imageItem1_1); QTreeWidgetItem *imageItem2 = new QTreeWidgetItem; //添加第二個父節(jié)點 imageItem2->setText(0,tr("圖像2")); rootList.append(imageItem2); QTreeWidgetItem *imageItem2_1 = new QTreeWidgetItem(imageItem2,QStringList(QString("Band1"))); //添加子節(jié)點 QTreeWidgetItem *imageItem2_2 = new QTreeWidgetItem(imageItem2,QStringList(QString("Band2"))); imageItem2->addChild(imageItem2_1); imageItem2->addChild(imageItem2_2); ui->treeWidget->insertTopLevelItems(0,rootList); //將結點插入部件中 ui->treeWidget->expandAll(); //全部展開
2. 點擊節(jié)點的事件響應
首先想到有沒有點擊某個節(jié)點的信號,查看文檔,有一個void itemClicked ( QTreeWidgetItem * item, int column )信號,是雙擊某個節(jié)點的信號,將該信號與某個自定義槽相連,當雙擊節(jié)點時觸發(fā)槽函數(shù)。
看一下這個信號,第一個參數(shù)為點擊的QTreeWidgetItem類對象,第二個參數(shù)為節(jié)點所在列號。
思路:根據(jù)點擊的QTreeWidgetItem類對象可以通過parent()函數(shù)得到父節(jié)點,如果QTreeWidgetItem類對象就是最最頂端的節(jié)點時,parent()函數(shù)返回的就是NULL。通過insertChildren ( int index, const QList<QTreeWidgetItem *> & children )函數(shù)可以得到該節(jié)點在父節(jié)點中的索引值。
目前只能解決只有一個最頂端父節(jié)點時的事件響應,當最頂端的父節(jié)點有多個(比如本文開頭有2個),這時點擊子節(jié)點時,無法判斷子節(jié)點的父節(jié)點是哪一個(本人愚笨啊!),因此沒法為其槽函數(shù)執(zhí)行相應的操作。
這里就以一個分支為例。
private slots: void showSelectedImage(QTreeWidgetItem * item, int column); //點擊樹節(jié)點事件 connect(ui->treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(showSelectedImage(QTreeWidgetItem*,int))); void MainWindow::showSelectedImage(QTreeWidgetItem *item, int column) { QTreeWidgetItem *parent = item->parent(); if(NULL==parent) //注意:最頂端項是沒有父節(jié)點的,雙擊這些項時注意(陷阱) return; int col = parent->indexOfChild(item); //item在父項中的節(jié)點行號(從0開始) if(0==col) //Band1 { //執(zhí)行對應操作 } if(1==col) //Band2 { //執(zhí)行對應操作 } }
如果不加父節(jié)點是否為空的判斷,當節(jié)點有父節(jié)點時,不會出錯,當節(jié)點沒有父節(jié)點時,程序會出錯(運行錯誤),判斷之后,雙擊沒有父節(jié)點的節(jié)點就會是樹的收縮操作。
轉載地址:http://www.cnblogs.com/Romi/archive/2012/04/16/2452709.html
到此這篇關于Qt QTreeWidget 樹形結構實現(xiàn)代碼的文章就介紹到這了,更多相關Qt QTreeWidget 樹形結構內容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/yuanzhangmei1/article/details/7818591