QTreeWidget 的使用说明 包含创建、新增、删除 ( Qt在重写一个部件之后、需要指定其父窗口)

本文详细介绍了如何在C++中使用QTreeWidget,包括类的继承、构造函数的使用,以及处理上下文菜单事件、插入和删除数据的方法。
摘要由CSDN通过智能技术生成

widget.h 代码

    #ifndef WIDGET_H
    #define WIDGET_H

    #include <QWidget>
    #include <QTreeWidget>
    #include <QMenu>
    #include <QContextMenuEvent>
    #include "QDebug"

    QT_BEGIN_NAMESPACE
    namespace Ui {
    class Widget;
    }
    QT_END_NAMESPACE




    // 父类 BaseWidget
    class BaseWidget {
    public:
        BaseWidget(int baseValue) : m_baseValue(baseValue) {
            qDebug()<< "父类构造: " << m_baseValue ;
        }

    protected:
        int m_baseValue;
    };

    // 子类 CustomWidget 继承自 BaseWidget
    class CustomWidget : public BaseWidget {
    public:
        //构造函数初始化父类 构造      默认父类构造是0
        CustomWidget(int value, QString name = "", int baseValue = 0) : BaseWidget(baseValue), m_value(value), m_name(name) {}

        void displayInfo() {
            qDebug()<<"子类Value: " << m_value << ", Name: " << m_name << ", BaseValue: " << m_baseValue;
        }

    private:
        int m_value;
        QString m_name;
    };


    class Widget;
    class AA: public QTreeWidget{
    public:
        //实参是: static_cast<QWidget*>(this)  形参是: QWidget* parent(作用用来初始化父类指针)
        AA(QWidget* parent = nullptr,Widget *a_w = nullptr)
            : QTreeWidget(parent),w(a_w) {}

        int a = 10;
    protected:
        void contextMenuEvent(QContextMenuEvent *event) override;

    private:
        Widget *w;
    };

    class Widget : public AA
    {
        Q_OBJECT

    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();

        void insert_data();

        //删除
        void update_data1();
        QList<QTreeWidgetItem*> list_Item_parent;
        QList<QTreeWidgetItem*> list_Item_child;

        QTreeWidgetItem* parent1;
        QTreeWidgetItem* child1_1;
        QTreeWidgetItem* child1_2;

        QTreeWidgetItem* parent2;
        QTreeWidgetItem* child2_1;
        QTreeWidgetItem* child2_2;

        QTreeWidgetItem *child2_3;

    private:
        Ui::Widget *ui;
        AA* treeWidget;



    };
    #endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QSet>
#include <QStringList>


Widget::Widget(QWidget *parent)
{

    QStringList li = {"aa","bb","cc","dd"};
    QStringList la = {"aa","bb"};
    QSet<QString> set_li = QSet<QString>::fromList(li);
    QSet<QString> set_la = QSet<QString>::fromList(la);
    QSet<QString> result = set_li - set_la;

    qDebug()<<"result: "<<result;

    CustomWidget widget1(10, "Widget1",100);
    widget1.displayInfo();

    CustomWidget widget2(20,"qqqqqq");
    widget2.displayInfo();

    if(li.size() > la.size())
    {
        QSet<QString> result = set_li - set_la;
    }
    else{
        QSet<QString> result = set_li - set_la;
    }


    ui->setupUi(this);
    //qDebug()<<"a:"<<a;  //继承了A类的元素  所以可以直接使用aa这个属性


    //下面的构造第一个参数是强制类型转换 把当前对象指针this强转成QWidget类型、给QWidget* parent、(子类构造初始化父类构造传参)(可以转是因为Widget 继承AA类、AA类继承了QTreeWidget,QTreeWidget又继承了QWidget所以可以强行转换)
    //下面的构造第二个参数是当前指针的对象、 通过构造函数列表初始化传递给了AA类成员Widget *w了。
    treeWidget = new AA(static_cast<QWidget*>(this),this);  // 这里进行了修改

    treeWidget->resize(500,500);

    // 假设 treeWidget 是你的 QTreeWidget 对象

    // 创建父节点1
    parent1 = new QTreeWidgetItem(treeWidget);
    parent1->setText(0, "Parent 1");

    // 创建子节点1-1
    child1_1 = new QTreeWidgetItem(parent1);
    child1_1->setText(0, "Child 1-1");

    // 创建子节点1-2
    child1_2 = new QTreeWidgetItem(parent1);
    child1_2->setText(0, "Child 1-2");


    list_Item_parent.append(parent1);
    list_Item_child.append(child1_1);
    list_Item_child.append(child1_2);
    // 将子节点添加到父节点1
    // parent1->addChild(child1_1);
    // parent1->addChild(child1_2);

    // 添加到根节点
    // treeWidget->addTopLevelItem(parent1);

    // 创建父节点2
    parent2 = new QTreeWidgetItem(treeWidget);
    parent2->setText(0, "Parent 2");

    // 创建子节点2-1
    child2_1 = new QTreeWidgetItem(parent2);
    child2_1->setText(0, "Child 2-1");

    // 创建子节点2-2
    child2_2 = new QTreeWidgetItem(parent2);
    child2_2->setText(0, "Child 2-2");

}

Widget::~Widget()
{
    delete ui;
}

void Widget::insert_data()
{

    // 创建子节点2-2
    child2_3 = new QTreeWidgetItem(parent2);
    child2_3->setText(0, "Child 2-3");
}
//删除父节点和父节点下的子节点
// void Widget::update_data1()
// {
//     //** 通过子节点  删除父节点   假设 child1_1 是要删除的子节点
//     QTreeWidgetItem* parentItem = child1_1->parent();
//     // 假设 parentItem 是父节点
//     QList<QTreeWidgetItem*> childItems = parentItem->takeChildren(); // 获取所有子节点

//     // 释放子节点的内存
//     for (QTreeWidgetItem* child : childItems)
//     {
//         delete child;
//     }

//     // 释放父节点的内存(如果需要)
//     delete parentItem;

// }

//删除一个子节点
void Widget::update_data1()
{

    // 释放父节点的内存(如果需要)
    delete child1_2;

}

#include "QVBoxLayout"
#include "QLabel"


void AA::contextMenuEvent(QContextMenuEvent *event) {
    QMenu menu(this);
    QAction* action0 = menu.addAction("新增");
    QAction* action1 = menu.addAction("删除");
    QAction* action2 = menu.addAction("图表");
    // TreefileDock t;
    // Advanced_Docking advance_docking;
    // TreefileDock tree_dock;
    QAction* selectedItem = menu.exec(event->globalPos());
    if (selectedItem == action1) {

        // 执行 Action 1 的操作
        // t.createWidgets();
        w->update_data1();

    }else if(selectedItem == action0)
    {
        w->insert_data();
    }


    else if (selectedItem == action2) {
        // 获取所有项目
        QList<QTreeWidgetItem*> allItems;
        QTreeWidgetItemIterator it(this);
        while (*it) {
            allItems.append(*it);
            ++it;
        }

        int num = 0;
        // 遍历所有项目,检查是否被勾选
        for (QTreeWidgetItem* item : allItems) {
            if (item->checkState(0) == Qt::Checked) {

                // 获取并打印项目的名称
                QString name = item->text(0);
                qDebug() << "Checked item: " << name;

                // 创建一个新的 QWidget 实例
                QWidget* window = new QWidget();

                // 设置 Qt::WA_DeleteOnClose 属性为 true
                window->setAttribute(Qt::WA_DeleteOnClose);

                // 创建一个新的 QVBoxLayout 实例
                QVBoxLayout* layout = new QVBoxLayout();
                // 创建一个新的 QLabel 实例,并设置其文本为项目的名称
                QLabel* label = new QLabel(name);
                // 创建一个新的 QCustomPlot 实例
                QLabel* plot = new QLabel("哇咔咔");
                // 将 QLabel 和 QCustomPlot 实例添加到布局中
                layout->addWidget(label);
                layout->addWidget(plot);
                // 将布局设置为 QWidget 的布局
                window->setLayout(layout);

                window->move(num,num);
                num+=20;
                // 显示 QWidget
                window->show();
            }
        }
    }

}

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

下载地址:
QTreeWidget的使用说明包含创建、新增、删除资源-CSDN文库

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值