前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >QtreeWidget_遍历qtreewidget

QtreeWidget_遍历qtreewidget

作者头像
全栈程序员站长
发布2022-11-10 10:08:36
9290
发布2022-11-10 10:08:36
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

QtreeWidget简介

QtreeWidget会有一个默认的 columncount的property。如下:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
    //qtreewidget 默认的columncount property属性
    /*
    qtreewidget默认的columncount为1.可以通过setcolumncount()把它设置为一个多列的qtreewidget
    */
    ui->treeWidget_2->setColumnCount(2);
    QTreeWidgetItem* topItem1 = new QTreeWidgetItem(ui->treeWidget_2);
    topItem1->setText(0, "百度");
    topItem1->setText(1, "蒙牛");
    ui->treeWidget_2->addTopLevelItem(topItem1);

    QTreeWidgetItem* topItem2 = new QTreeWidgetItem(ui->treeWidget_2);
    topItem2->setText(0, "腾讯");
    topItem2->setText(1, "伊利");
    ui->treeWidget_2->addTopLevelItem(topItem2);

    //ui->treeWidget_2->setHeaderHidden(true); //隐藏qtreewidget的头部
    QStringList strList;
    strList << "互联网公司" << "食品公司";
    ui->treeWidget_2->setHeaderLabels(strList); //自定义qtreewidget的头部

设置右键菜单并实现添加一个子项删除一个子项的功能

代码语言:javascript
复制
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置顶层节点
QTreeWidgetItem* topItem = new QTreeWidgetItem(ui->treeWidget);
topItem->setText(0, "百度");
ui->treeWidget->addTopLevelItem(topItem);
ui->treeWidget->setHeaderHidden(true);
//qtreewidget 默认的columncount property属性
/*
qtreewidget默认的columncount为1.可以通过setcolumncount()把它设置为一个多列的qtreewidget
*/
ui->treeWidget_2->setColumnCount(2);
QTreeWidgetItem* topItem1 = new QTreeWidgetItem(ui->treeWidget_2);
topItem1->setText(0, "百度");
topItem1->setText(1, "蒙牛");
ui->treeWidget_2->addTopLevelItem(topItem1);
//为顶层节点添加子节点
QTreeWidgetItem* subItem1 = new QTreeWidgetItem();
subItem1->setText(0, "人事部");
topItem1->addChild(subItem1);
QTreeWidgetItem* subItem2 = new QTreeWidgetItem();
subItem2->setText(0, "财务部");
topItem1->addChild(subItem2);
QTreeWidgetItem* topItem2 = new QTreeWidgetItem(ui->treeWidget_2);
topItem2->setText(0, "腾讯");
topItem2->setText(1, "伊利");
ui->treeWidget_2->addTopLevelItem(topItem2);
//ui->treeWidget_2->setHeaderHidden(true); //隐藏qtreewidget的头部
QStringList strList;
strList << "互联网公司" << "食品公司";
ui->treeWidget_2->setHeaderLabels(strList); //自定义qtreewidget的头部
//设置右键菜单选项
//允许右键菜单
ui->treeWidget_2->setContextMenuPolicy(Qt::CustomContextMenu);
//设置菜单
QMenu *myMenu = new QMenu(ui->treeWidget_2);
QAction *add = myMenu->addAction("添加");
QAction *del = myMenu->addAction("删除");
//响应右键菜单信号
connect(ui->treeWidget_2, &QTreeWidget::customContextMenuRequested, this, [=](const QPoint pos){
qDebug() << "x: " << pos.x() << " y: " << pos.y();
myMenu->exec(ui->treeWidget_2->mapToGlobal(pos));
});
//响应添加的action点击
connect(add, &QAction::triggered, this, [=](){
//添加一个固定的子节点
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0, "营销部");
topItem1->addChild(item);
});
//响应删除的action点击
connect(del, &QAction::triggered, this, [=](){
qDebug() << topItem1->childCount();
if(topItem1->childCount() >= 1)
{
QTreeWidgetItem *item = topItem1->child(topItem1->childCount() - 1);
topItem1->removeChild(item);
delete item;
item = nullptr;
}
});
}

这样有两个缺点 1. 只能添加特定的子项。2. 不能实现不同层级节点的不同菜单。

  1. 通过弹出dialog的方式询问用户,添加用户自定义的子项 添加一个dialog界面
在这里插入图片描述
在这里插入图片描述

dialog.h

代码语言:javascript
复制
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QString>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
public:
QString partmenName;
private:
Ui::Dialog *ui;
};
#endif // DIALOG_H

dialog.cpp

代码语言:javascript
复制
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog),
partmenName("")
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, [&](){
if(ui->lineEdit->text() != "")
{
partmenName = ui->lineEdit->text();
}
this->accept();
});
connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){
this->reject();
});
}
Dialog::~Dialog()
{
delete ui;
}

widget.cpp

代码语言:javascript
复制
#include "widget.h"
#include "ui_widget.h"
#include <QString>
#include <QStringList>
#include <QMenu>
#include <QPoint>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//设置顶层节点
QTreeWidgetItem* topItem = new QTreeWidgetItem(ui->treeWidget);
topItem->setText(0, "百度");
ui->treeWidget->addTopLevelItem(topItem);
ui->treeWidget->setHeaderHidden(true);
//qtreewidget 默认的columncount property属性
/*
qtreewidget默认的columncount为1.可以通过setcolumncount()把它设置为一个多列的qtreewidget
*/
ui->treeWidget_2->setColumnCount(2);
QTreeWidgetItem* topItem1 = new QTreeWidgetItem(ui->treeWidget_2);
topItem1->setText(0, "百度");
topItem1->setText(1, "蒙牛");
ui->treeWidget_2->addTopLevelItem(topItem1);
//为顶层节点添加子节点
QTreeWidgetItem* subItem1 = new QTreeWidgetItem();
subItem1->setText(0, "人事部");
topItem1->addChild(subItem1);
QTreeWidgetItem* subItem2 = new QTreeWidgetItem();
subItem2->setText(0, "财务部");
topItem1->addChild(subItem2);
QTreeWidgetItem* topItem2 = new QTreeWidgetItem(ui->treeWidget_2);
topItem2->setText(0, "腾讯");
topItem2->setText(1, "伊利");
ui->treeWidget_2->addTopLevelItem(topItem2);
//ui->treeWidget_2->setHeaderHidden(true); //隐藏qtreewidget的头部
QStringList strList;
strList << "互联网公司" << "食品公司";
ui->treeWidget_2->setHeaderLabels(strList); //自定义qtreewidget的头部
//设置右键菜单选项
//允许右键菜单
ui->treeWidget_2->setContextMenuPolicy(Qt::CustomContextMenu);
//设置菜单
QMenu *myMenu = new QMenu(ui->treeWidget_2);
QAction *add = myMenu->addAction("添加");
QAction *del = myMenu->addAction("删除");
//响应右键菜单信号
connect(ui->treeWidget_2, &QTreeWidget::customContextMenuRequested, this, [=](const QPoint pos){
qDebug() << "x: " << pos.x() << " y: " << pos.y();
myMenu->exec(ui->treeWidget_2->mapToGlobal(pos));
});
//响应添加的action点击
connect(add, &QAction::triggered, this, [=](){
//添加一个固定的子节点
if(dlg.exec() == QDialog::Accepted)
{
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText(0, dlg.partmenName);
topItem1->addChild(item);
}
});
//响应删除的action点击
connect(del, &QAction::triggered, this, [=](){
qDebug() << topItem1->childCount();
if(topItem1->childCount() >= 1)
{
QTreeWidgetItem *item = topItem1->child(topItem1->childCount() - 1);
topItem1->removeChild(item);
delete item;
item = nullptr;
}
});
}
Widget::~Widget()
{
delete ui;
}

widget.h

代码语言:javascript
复制
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include "dialog.h"
#include "ui_dialog.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
Dialog dlg;
};
#endif // WIDGET_H

还可以通过TYPE属性来确定每一个节点的层级。

在这里插入图片描述
在这里插入图片描述

代码实现 mainwindow.cpp

代码语言:javascript
复制
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置这是一个多列的treewidget
ui->treeWidget->setColumnCount(2);
//设置表头
QStringList strList;
strList << "互联网公司" << "食品公司";
ui->treeWidget->setHeaderLabels(strList);
//设置topItem
QTreeWidgetItem *topItem1 = new QTreeWidgetItem(TYPE_1);
topItem1->setText(0, "百度");
topItem1->setText(1, "蒙牛");
ui->treeWidget->addTopLevelItem(topItem1);
//为topItem添加子Item
QTreeWidgetItem *item1 = new QTreeWidgetItem(TYPE_2);
item1->setText(0, "事业部");
topItem1->addChild(item1);
//为topItem添加子Item
QTreeWidgetItem *item2 = new QTreeWidgetItem(TYPE_2);
item2->setText(0, "营销部");
topItem1->addChild(item2);
//开启右键菜单属性
ui->treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
QMenu *myMenu = new QMenu(ui->treeWidget);
QAction *add = myMenu->addAction("添加");
QAction *del = myMenu->addAction("删除");
connect(ui->treeWidget, &QTreeWidget::customContextMenuRequested, this, [=](const QPoint pos){
auto itemList = ui->treeWidget->selectedItems(); //得到选中的itemList,默认情况下是不可以多选的
if(itemList.size() < 1) //异常情况下直接返回
{
return;
}
int type = itemList.first()->type(); //获取选中状态的item的类型
if(type == TYPE_1) //如果是一级item就弹出菜单栏
{
myMenu->exec(ui->treeWidget->mapToGlobal(pos));
}
});
//为两个action设置对应功能
connect(add, &QAction::triggered, this, [=](){
if(dlg.exec() == QDialog::Accepted)
{
QTreeWidgetItem *item = new QTreeWidgetItem(TYPE_2);
item->setText(0, dlg.getPartmentName());
topItem1->addChild(item);
}
});
connect(del, &QAction::triggered, this, [=](){
if(topItem1->childCount() >= 1)
{
topItem1->removeChild(topItem1->child(topItem1->childCount() - 1));
}
});
}
MainWindow::~MainWindow()
{
delete ui;
}

mainwindow.h

代码语言:javascript
复制
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QString>
#include <QStringList>
#include <QMenu>
#include <QAction>
#include <QPoint>
#include "dialog.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
Dialog dlg;
};
enum TYPE
{
TYPE_1,
TYPE_2,
};
#endif // MAINWINDOW_H

dialog.cpp

代码语言:javascript
复制
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, [&](){
if(ui->lineEdit->text() != "")
{
partmentName = ui->lineEdit->text();
}
this->accept();
});
connect(ui->pushButton_2, &QPushButton::clicked, this, [=](){
this->reject();
});
}
Dialog::~Dialog()
{
delete ui;
}
QString Dialog::getPartmentName()
{
return partmentName;
}

dialog.h

代码语言:javascript
复制
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QString>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
QString getPartmentName();
private:
Ui::Dialog *ui;
QString partmentName;
};
#endif // DIALOG_H
在这里插入图片描述
在这里插入图片描述

参考博客

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187135.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月1日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • QtreeWidget简介
    • QtreeWidget会有一个默认的 columncount的property。如下:
      • 设置右键菜单并实现添加一个子项删除一个子项的功能
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档