QtreeWidget_遍历qtreewidget

QtreeWidget_遍历qtreewidget设置右键菜单并实现添加一个子项删除一个子项的功能这样有两个缺点1.只能添加特定的子项。2.不能实现不同层级节点的不同菜单。dialog.cppwidget.cppwidget.h还可以通过TYPE属性来确定每一个节点的层级。代码实现mainwindow.cppmainwindow.hdialog.cppdialog.h参考博客…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

QtreeWidget简介

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

在这里插入图片描述

    //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的头部

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

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
#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

#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

#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

#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

#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

#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

#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

#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.net/187135.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python解析xps文件_xps文件的基本操作

    python解析xps文件_xps文件的基本操作最近一直研究XPS文件,目前已经解决了二进制流转XPS文件、XPS文件转二进流、XPS文件的解析、XPS文件转图片、XPS文件打印等。但是一直没有找到如何向xps文件中插入图片的方法,好烦恼啊!!!!如果那位大神有向xps文件中插入图片的方法请及时联系我谢谢,QQ470163177。本人研究的成果如下,需要的码友可以学习下。注意:xps命名空间在ReachFramework.dll中using…

    2022年6月3日
    35
  • 计算机网络————IP地址分类以及网络地址的计算[通俗易懂]

    计算机网络————IP地址分类以及网络地址的计算[通俗易懂]一,IP地址分类 1.二进制与十进制的关系 2,IP地址的地址结构及分类IP地址结构:网络号+主机号网络号:中主机中指明中的所在物理网络的编号主机号:中中中主机在物理网络中的编号 IP地址分类:A类(大型),B类(中型),C类(小型),D类(组播),E类(保留地址-研究时使用) A类地址默认掩码:255.0.0.0/8B类地址默认掩码:2…

    2022年6月6日
    180
  • vue + echarts 省份地图 以及打包后地图加载不出来(比较详细)「建议收藏」

    vue + echarts 省份地图 以及打包后地图加载不出来(比较详细)「建议收藏」刚开始地图怎么也出不来,经过解决,是因为echarts.min.js引入位置在index.html中引入需要的js版本按照自己需要的来<scriptsrc=”./static/plugins/echarts-5.1.2/echarts.common.min.js”></script><scriptsrc=”./static/plugins/echarts.min.js”></script>(必须引入,地图才能加载)全局引入im

    2022年10月12日
    1
  • Hadoop、Yarn和vcpu资源的配置

    Hadoop、Yarn和vcpu资源的配置

    2022年3月13日
    65
  • 官方微信开发_第三方微信制作平台

    官方微信开发_第三方微信制作平台升讯威微信营销系统(微信第三方平台)在线体验:http://wxcm.eeipo.cn/开源地址GitHub:https://github.com/iccb1013/Sheng.WeixinCons

    2022年8月6日
    4
  • 【愚公系列】2022年03月 漏洞扫描与利用之AWVS「建议收藏」

    【愚公系列】2022年03月 漏洞扫描与利用之AWVS「建议收藏」实验步骤一首先需要添加一个扫描目标,先不进行登陆操作:设置爬虫扫描开始扫描得出网站目录如果需要账号密码则需要设置方式一:方式二:之后点击“save”,保存后就可以进行扫描备注:FullScan–使用FullScan来发起一个扫描的话,Acunetix会检查所有可能得安全漏洞。HighRishVulnerabilities–这个扫描选项将仅仅只会检查那些对web站点影响最大的缺陷漏洞。Cross-SiteScripting(XSS)–XXS漏洞扫描只会检测跨站

    2022年9月23日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号