QTreeWidget的簡單使用

?使用 QTreeWidget 實現復雜樹控件功能的詳細教程_treewidget 加控件-CSDN博客

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTreeWidget>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QTreeWidget * treeWidget;
};#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);treeWidget = new QTreeWidget;QVBoxLayout *layout = new QVBoxLayout();layout->addWidget(treeWidget);QWidget *centralWidget = new QWidget(this);centralWidget->setLayout(layout);setCentralWidget(centralWidget);treeWidget->setColumnCount(3);QStringList headers;headers << QString("班級")<< QString("分配科目")<< QString("是否達標");treeWidget->setHeaderLabels(headers);QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget);item->setText(0, QString("某班級"));item->setCheckState(2, Qt::Unchecked);QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(treeWidget);topLevelItem->setText(0, QString("頂層項目"));treeWidget->addTopLevelItem(topLevelItem);
}MainWindow::~MainWindow()
{delete ui;
}

    QTreeWidgetItem *newTopLevelItem = new QTreeWidgetItem();newTopLevelItem->setText(0, QString("插入頂層項目"));newTopLevelItem->setText(1,"第1列");newTopLevelItem->setText(2,"第2列");treeWidget->insertTopLevelItem(0, newTopLevelItem);

    QTreeWidgetItem *childItem = new QTreeWidgetItem();childItem->setText(0, QString("子項目"));topLevelItem->addChild(childItem);QTreeWidgetItem *childItem1 = new QTreeWidgetItem();childItem1->setText(0, QString("子項目1"));topLevelItem->addChild(childItem1);

    topLevelItem->removeChild(childItem);

    QTreeWidgetItem *removedItem = treeWidget->takeTopLevelItem(0);delete removedItem;

    QTreeWidgetItem *childItem2 = new QTreeWidgetItem();childItem1->setText(1, QString("子項目2"));topLevelItem->addChild(childItem2);

一個demo:

?一個有兩種類型的QTreeWidgetItem:節點和名稱

可以添加節點,添加名稱,刪除,修改QTreeWidgetItem的名稱

右鍵彈出菜單

(根據右鍵的位置:分3種:1.點擊節點? ?2.點擊名稱 3.點擊空白處)

彈出相關的菜單按鈕

#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H#include <QMainWindow>
#include <QMenu>
#include <QTreeWidget>
namespace Ui {
class MainWindow1;
}class MainWindow1 : public QMainWindow
{Q_OBJECTenum TreeItemType{none = 0,point = 1,name = 2};
public:explicit MainWindow1(QWidget *parent = 0);~MainWindow1();private slots:void on_actionAddPoint_triggered();void on_actionAddName_triggered();void PopMenu(QPoint);void on_actionDel_triggered();void on_actionChangeItemName_triggered();private:void setActionsState(bool addPoint,bool addName,bool del,bool changeName);void RemoveItem(QTreeWidgetItem *pItem);
protected:private:Ui::MainWindow1 *ui;int mPoint;int mName;QMenu* mMenu;
};#endif // MAINWINDOW1_H
#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include <QMouseEvent>
#include <QInputDialog>
#include <QDebug>
MainWindow1::MainWindow1(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow1)
{ui->setupUi(this);ui->treeWidget->setHeaderLabel("HeaderLabel");ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);connect(ui->treeWidget,&QTreeWidget::customContextMenuRequested,this,&MainWindow1::PopMenu);mMenu = new QMenu(this);mMenu->addAction(ui->actionAddPoint);mMenu->addAction(ui->actionAddName);mMenu->addAction(ui->actionDel);mMenu->addAction(ui->actionChangeItemName);mPoint = 0;mName = 0;}MainWindow1::~MainWindow1()
{delete ui;
}void MainWindow1::on_actionAddPoint_triggered()
{QTreeWidgetItem *Item = ui->treeWidget->currentItem();if(Item == nullptr){QStringList strList;strList<<QString("節點%1").arg(mPoint);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::point);ui->treeWidget->addTopLevelItem(pItem);mPoint++;}else{QStringList strList;strList<<QString("節點%1").arg(mPoint);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::point);Item->addChild(pItem);mPoint++;}
}void MainWindow1::on_actionAddName_triggered()
{QTreeWidgetItem *Item = ui->treeWidget->currentItem();if(Item == nullptr){QStringList strList;strList<<QString("名稱%1").arg(mName);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::name);ui->treeWidget->addTopLevelItem(pItem);mName++;}else{QStringList strList;strList<<QString("名稱%1").arg(mName);QTreeWidgetItem* pItem = new QTreeWidgetItem(strList);pItem->setData(0,Qt::UserRole+1,TreeItemType::name);Item->addChild(pItem);mName++;}
}void MainWindow1::PopMenu(QPoint pos)
{QModelIndex index = ui->treeWidget->indexAt(pos);if(!index.isValid()){ui->treeWidget->setCurrentIndex(QModelIndex());}QTreeWidgetItem *pItem = ui->treeWidget->currentItem();if(nullptr == pItem){setActionsState(1,1,0,0);}else{TreeItemType type = (TreeItemType)pItem->data(0,Qt::UserRole+1).toInt();switch (type) {case TreeItemType::point:setActionsState(1,1,1,1);break;case TreeItemType::name:setActionsState(0,0,1,1);break;default:break;}qDebug()<<pItem->text(0).toStdString().c_str();}mMenu->exec(QCursor::pos());
}void MainWindow1::on_actionDel_triggered()
{QTreeWidgetItem *pItem = ui->treeWidget->currentItem();if(nullptr == pItem){}else{RemoveItem(pItem);}
}void MainWindow1::on_actionChangeItemName_triggered()
{QTreeWidgetItem *pItem = ui->treeWidget->currentItem();TreeItemType type = (TreeItemType)pItem->data(0,Qt::UserRole+1).toInt();QString str;switch (type) {case TreeItemType::point:str="節點";break;case TreeItemType::name:str="名稱";break;default:break;}QInputDialog dialog;dialog.exec();pItem->setData(0,Qt::DisplayRole,str+dialog.textValue());
}void MainWindow1::setActionsState(bool addPoint, bool addName, bool del, bool changeName)
{ui->actionAddPoint->setVisible(addPoint);ui->actionAddName->setVisible(addName);ui->actionChangeItemName->setVisible(changeName);ui->actionDel->setVisible(del);
}void MainWindow1::RemoveItem(QTreeWidgetItem *pItem)
{int nChildCount = pItem->childCount();if(nChildCount == 0){delete pItem;pItem = nullptr;return ;}for(int i = 0; i < nChildCount; ++i){QTreeWidgetItem *pTmp = pItem->child(0);RemoveItem(pTmp);}delete pItem;pItem = nullptr;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40997.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里巴巴Arthas分析調優JVM實戰及常量池詳解

目錄 一、阿里巴巴Arthas詳解 Arthas使用場景 Arthas命令 Arthas使用 二、GC日志詳解 如何分析GC日志 CMS G1 GC日志分析工具 三、JVM參數匯總查看命令 四、Class常量池與運行時常量池 字面量 符號引用 五、字符串常量池 字符串常量池的設計思想 三種字符串操作…

墨烯的語言技術棧-C語言基礎-005

在VS的安裝路徑下有一個文件: newcfile.cpp的文件 在VS工程中創建新的.c或者.cpp文件的時候,都是拷貝newcfile.cpp這個文件的! everything工具中 有一個newcfile.cpp 然后打開文件路徑在newcfile.cpp 添加#define _CRT_SECURE_NO_WARNINGS替換即可 五.變量的作用域(局部變量…

freemarker生成pdf,同時pdf插入頁腳,以及數據量大時批量處理

最近公司有個需求&#xff0c;就是想根據一個模板生成一個pdf文檔&#xff0c;當即我就想到了freemarker這個遠古老東西&#xff0c;畢竟freemarker在模板渲染方面還是非常有優勢的。 準備依賴&#xff1a; <dependency><groupId>org.springframework.boot</gr…

【IDEA】maven如何進行文件導入,配置并打包

一&#xff0c;介紹、安裝 1、maven介紹 maven是一個Java世界中&#xff0c;構建工具。 核心功能&#xff1a; (1) 管理依賴&#xff1a; 管理文件運行的順序邏輯依賴關系。對配置文件&#xff0c;進行構建和編譯。其也是在調用jdk&#xff0c;來進行編譯打包工作。 (2) 打…

JavaScript中的原型和原型鏈

一、原型&#xff1a;每個函數都有prototype屬性&#xff0c;稱之為原型&#xff0c;這個屬性也是個對象所以也稱之為原型對象。 1.原型可以放一些屬性和方法&#xff0c;供實例對象使用。 <body><script>const arr new Array(1,3,5,7,6)document.getElementByI…

Go語言--延遲調用defer、獲取命令行參數、局部變量以及全局變量

延遲調用defer 關鍵字 defer 用于延遲一個函數或者方法(或者當前所創建的匿名函數)的執行。注意&#xff0c;defer語句只能出現在函數或方法的內部。 defer 語句經常被用于處理成對的操作&#xff0c;如打開、關閉、連接、斷開連接、加鎖、釋放鎖。通過defer 機制&#xff0…

NASA——quarius(水瓶座) L3 網格化 1 度年土壤濕度,第 5 版

Aquarius L3 Gridded 1-Degree Annual Soil Moisture V005 水瓶座 L3 網格化 1 度年土壤濕度&#xff0c;第 5 版 簡介 該數據集包含美國國家航空航天局&#xff08;NASA&#xff09;科學應用衛星&#xff08;SAC-D&#xff09;上的寶瓶座被動微波輻射計得出的第 3 級網格化…

SLAM 精度評估

SLAM 精度的評估有兩個最重要的指標&#xff0c;即絕對軌跡誤差&#xff08;ATE&#xff09;和相對位姿誤差&#xff08;RPE&#xff09;的 均方根誤差&#xff08;RMSE&#xff09;: 絕對軌跡誤差:直接計算相機位姿的真實值與 SLAM 系統的估計值之間的差值&#xff0c;首先將…

交換機基本原理

文章目錄 前言一、交換機的轉發行為二、交換機的轉發原理1.MAC地址表2.交換機初始狀態3.學習MAC地址4.ARP協議5.交換機轉發數據幀6.目標主機回復 三、華為交換機基本命令1.VRP視圖分層2.命令行補全3.命令行幫助4.配置設備名稱5.命令等級6.用戶界面7.配置console認證8.配置用戶界…

python-Django項目:圖書后臺管理系統

具體操作&#xff1a;請參考 Django項目&#xff1a;圖書后臺管理系統

基于深度學習的圖像補全

基于深度學習的圖像補全是一項利用深度學習技術來填補圖像中缺失區域的研究領域。這項技術可以有效地恢復損壞或不完整的圖像&#xff0c;使其變得完整和自然&#xff0c;廣泛應用于圖像修復、圖像編輯、視頻恢復和增強現實等領域。以下是關于這一領域的系統介紹&#xff1a; …

運維鍋總詳解計算機緩存

本文從OSI模型中的每一層緩存介紹、常見開源中間件緩存舉例、TCP/IP協議棧中的緩存機制、操作系統中的緩存、訪問緩存數據的時間范圍統計等方面對計算機中的緩存進行詳細介紹。希望對您有所幫助&#xff01; 一、OSI模型中的每一層緩存 1. 物理層&#xff08;Physical Layer&…

Unity--異步加載場景

Unity–異步加載場景 異步加載場景其實和異步加載資源是一樣的,只是加載的內容比較特殊而已. 也可以將場景視為特殊資源. 1.SceneManager.LoadScene 加載場景的方式,在Unity 中加載場景是通過SceneManager.LoadScene("場景名稱"); 來實現加載場景,這和UE4中的Open…

如何在Java中實現批量數據處理

如何在Java中實現批量數據處理 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 引言 在大數據時代&#xff0c;處理大量數據是許多應用程序中必不可少的需…

自動化立體倉庫出入庫能力及堆垛機節拍

導語 大家好&#xff0c;我是社長&#xff0c;老K。專注分享智能制造和智能倉儲物流等內容。 新書《智能物流系統構成與技術實踐》人俱樂部 完整版文件和更多學習資料&#xff0c;請球友到知識星球【智能倉儲物流技術研習社】自行下載 自動化立體倉庫的出入庫能力、堆垛機節拍以…

安全協議:SSL/TLS與Java實現

在當今的互聯網環境中&#xff0c;數據安全至關重要。SSL&#xff08;Secure Sockets Layer&#xff09;和其繼任者TLS&#xff08;Transport Layer Security&#xff09;是確保數據在網絡中安全傳輸的關鍵技術。本文將詳細介紹SSL/TLS協議的工作原理&#xff0c;并通過Java代碼…

掌握電路交換與分組交換:計算機網絡的核心技術

計算機網絡是現代信息社會的基石&#xff0c;而交換技術是實現網絡通信的核心。本文將詳細介紹兩種典型的交換方式&#xff1a;電路交換和分組交換&#xff0c;幫助基礎小白快速掌握這兩種技術的基本概念和區別。 什么是電路交換&#xff1f; 電路交換&#xff08;Circuit Swi…

Java中的服務化架構設計與實現

Java中的服務化架構設計與實現 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 引言 隨著軟件系統規模的不斷擴大和業務需求的增加&#xff0c;傳統的單體…

CentOS7開啟sshd失敗解決方法

Could not load host key: /etc/ssh/ssh_host_rsa_key Could not load host key: /etc/ssh/ssh_host_ecdsa_key Could not load host key: /etc/ssh/ssh_host_ed25519_key sshd: no hostkeys available – exiting. 1、檢查主機密鑰文件是否存在 ls -l /etc/ssh/ssh_host_*2、…