QTreeWidget的右键菜单,展开和折叠,或者其他操作

确定菜单的位置,及获取鼠标选中的项(QTreeWidgetItem)

mainwindow.h

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTreeWidget>
#include <QTreeWidgetItem>


QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    QTreeWidget *treeWidget;
    QMenu* treeMenu;
    QAction* actionTreeExpand;
    QAction* actionTreeFold;

    //这三个可以闪
    QAction* actionRealDevice;
    QAction* actionSimulation;
    QAction* actionHang;



    QTreeWidgetItem* selectItem;

    void treeShowMenu(const QPoint &pos);
    void expandTreeItem();
    void foldTreeItem();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);



    // 创建主窗口
    treeWidget=ui->tw_device_tree;
    treeWidget->setWindowTitle("动物分类展示");
    treeWidget->setColumnCount(1);
    treeWidget->setHeaderLabels({"动物种类"});

    // 创建蛙类父项
    QTreeWidgetItem *frogParentItem = new QTreeWidgetItem(treeWidget);
    frogParentItem->setText(0, "蛙类");

    // 为蛙类添加子项
    QStringList frogList = {"青蛙", "牛蛙", "蛤蟆", "箭毒蛙"};
    for (const QString &frog : frogList) {
        QTreeWidgetItem *frogItem = new QTreeWidgetItem(frogParentItem);
        frogItem->setText(0, frog);
    }

    // 创建鱼类父项
    QTreeWidgetItem *fishParentItem = new QTreeWidgetItem(treeWidget);
    fishParentItem->setText(0, "鱼类");

    // 为鱼类添加子项
    QStringList fishList = {"草鱼", "鲤鱼", "金鱼"};
    for (const QString &fish : fishList) {
        QTreeWidgetItem *fishItem = new QTreeWidgetItem(fishParentItem);
        fishItem->setText(0, fish);
    }

    // 展开所有项
    treeWidget->expandAll();

    // 显示窗口
    treeWidget->show();


    treeMenu = new QMenu(ui->tw_device_tree);
    actionTreeExpand = new QAction("展开", treeMenu);
    actionTreeFold = new QAction("折叠", treeMenu);

    //下面这三个可以删除
    actionRealDevice->setObjectName("RealDevice");
    actionSimulation->setObjectName("Simulation");
    actionHang->setObjectName("hanging");

    treeMenu->addActions({actionTreeExpand, actionTreeFold, actionRealDevice ,  actionSimulation , actionHang});
    treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);

    connect(treeWidget,  &QTreeWidget::customContextMenuRequested, this, &MainWindow::treeShowMenu);

    connect(actionTreeExpand, &QAction::triggered, this, &MainWindow::expandTreeItem);
    connect(actionTreeFold, &QAction::triggered, this, &MainWindow::foldTreeItem);


}

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

void MainWindow::treeShowMenu(const QPoint &pos)
{
    if(ui->tw_device_tree->itemAt(pos) != nullptr){
        selectItem = ui->tw_device_tree->itemAt(pos);
        treeMenu->exec(QCursor::pos());
    }else{
        return;
    }
}

void MainWindow::expandTreeItem()
{
    if(selectItem != nullptr){
        if(selectItem->parent() == nullptr){
            ui->tw_device_tree->expandAll();
        }else{
            ui->tw_device_tree->expandItem(selectItem);
        }
        selectItem = nullptr;
    }
}

void MainWindow::foldTreeItem()
{
    if(selectItem != nullptr){
        if(selectItem->parent() == nullptr){
            ui->tw_device_tree->collapseAll();
        }else{
            ui->tw_device_tree->collapseItem(selectItem);
        }
        selectItem = nullptr;
    }
}
相关推荐
超龄编码人8 小时前
Qt Widgets Designer QTabWidget无法添加布局
开发语言·qt
vegetablesssss8 小时前
vtk镜像图
c++·qt·vtk
Ulyanov11 小时前
基于 Python 的三维动态导弹攻防演示系统设计与实现:从架构到实战的深度剖析
开发语言·python·qt·架构·雷达电子对抗
小短腿的代码世界12 小时前
Qt WebEngine深度解析:Chromium多进程架构与Qt信号槽的双向融合
qt·搜索引擎·单元测试
charlie11451419113 小时前
现代Qt开发教程(新手篇)1.10——进程
开发语言·c++·qt·学习
小短腿的代码世界14 小时前
Qt量化策略编辑器深度解析:从DSL解析到可视化编排的完整架构
qt·架构·编辑器
十五年专注C++开发14 小时前
Qt实现带多选功能的组合复选框
开发语言·c++·qt·qcombobox
柳鲲鹏14 小时前
QT:正确延时调用,Cannot create children for a parent that is in a different thread.
服务器·数据库·qt
(Charon)14 小时前
【C++/Qt】Qt 实现 WebSocket 测试工具:连接、消息收发与通信日志
c++·qt·websocket
十五年专注C++开发14 小时前
CMake基础: Qt之qt5_wrap_ui
开发语言·c++·qt·ui