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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于1DCNN(一维卷积神经网络)的机械振动故障诊断

    基于1DCNN(一维卷积神经网络)的机械振动故障诊断基于1DCNN(一维卷积神经网络)的机械振动故障诊断机械振动故障诊断最为经典的还是凯斯西储实验室的轴承故障诊断,开学一周了,上次改编鸢尾花分类的代码可用,但是并不准确。开学一周重新改编了别人的一篇代码,亲测好用。不多咧咧直接放上去(基于Tensorflow2.0)(Spyder4软件上跑的)数据集时本人把凯西轴承实验驱动端内圈损坏尺寸0.14和0.21做的二分类,数据集中0代表的0.14而1代表的0.21具体看下面最后#-*-coding:utf-8-*-“””CreatedonTue

    2022年6月8日
    99
  • Socket无限SocketTimeoutException真凶–WLAN助手

    Socket无限SocketTimeoutException真凶–WLAN助手看到标题你可能不知道我说的是什么鬼东西,但是如果你有类似的经历的话,那么恭喜你,也恭喜我自己,终于解决这个问题了。用过小米、华为等手机的都知道,当我们连接上一个不能上网的WIFI时,系统都会友好的给出“此WLAN无法访问互联网,请更换网络/切换为移动数据网络”等类似的提示,今天我就说下本人在这里面遇到的坑。背景:有个Android项目需要连接硬件设备的WIFI,然后通过socket进行通信…

    2022年10月21日
    2
  • Linux 查看环境变量_linux查看环境变量env

    Linux 查看环境变量_linux查看环境变量envLinux设置和查看环境变量   环境变量,简要的说,就是指定一个目录,运行软件的时候,相关的程序将会按照该目录寻找相关文件。设置变量对于一般人最实用的功能就是:不用拷贝某些dll文件到系统目录中了,而path这一系统变量就是系统搜索dll文件的一系列路径。   在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“commandnotfound

    2022年10月1日
    3
  • 【真题21套】计算机二级公共基础知识选择题真题【含解析】「建议收藏」

    【真题21套】计算机二级公共基础知识选择题真题【含解析】「建议收藏」目录第1套公共基础选择题真题第2套公共基础选择题真题第3套公共基础选择题真题第4套公共基础选择题真题第5套公共基础选择题真题第6套公共基础选择题真题第7套公共基础选择题真题第8套公共基础选择题真题第9套公共基础选择题真题第10套公共基础选择题真题第11套公共基础选择题真题第12套公共基础选择题真题第13套公共基础选择题真题第14套公共基础选择题真题第15套公共基础选择题真题第16套公共基础选择题真题第17套公共基础选择题真题第18套公.

    2022年6月11日
    28
  • c++解决大整数乘法

    c++解决大整数乘法c++解决大整数乘法问题描述:求两个不超过200位的非负整数的积输入数据:输入有两行,每行是一个不超过200位的非负整数,没有多余的前导0。输出要求:输出只一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么不能输出0342。输入样例:1234567890098765432100输出样例:1219326311126352690000解题思路:采用列乘法竖式的求解思路,采用数组…

    2022年6月2日
    43
  • 2、wxWidgets介绍–菜单栏、状态栏、图标简介

    2、wxWidgets介绍–菜单栏、状态栏、图标简介wxWidgetswxWidgets是一个用来编写C++程序的GUI(图形用户界面)工具包。它是一个开源的、成熟的、跨平台的工具包。wxWidgets应用程序能在所有主流的操作系统上运行,Windo

    2022年7月2日
    26

发表回复

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

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