树形控件中的子项点击显示按钮弹窗

发布时间:2024年01月15日

效果

在这里插入图片描述

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include"QStandardItemModel"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
private slots:
    // QTreeView鼠标左键选中子节点事件响应槽函数
    void _on_m_treeView_current_changed(const QModelIndex& current, const QModelIndex& previous);
    void _on_m_treeView_MenuPopup(const QPoint &pos);

};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 1.初始化model
    QStandardItemModel* m_standardItemModel = new QStandardItemModel();

    // 2.使用model设置QTreeView表头
    m_standardItemModel->setHorizontalHeaderLabels(QStringList(QStringLiteral("资源")));

    // 3.创建根节点,抽象Item,并没有实际数据
    QStandardItem* itemRoot = m_standardItemModel->invisibleRootItem();

    // 4.创建并添加Item的第一个子节点
    QStandardItem* itemCam = new QStandardItem(QStringLiteral("相机"));
    itemRoot->appendRow(itemCam);

    // 5.向第一个子节点itemCam添加子节点数据
    QList<QStandardItem*> camList;
    camList.append(new QStandardItem("cam1"));
    camList.append(new QStandardItem("cam2"));
    camList.append(new QStandardItem("cam3"));
    itemCam->appendRows(camList);

    // 6.创建并添加Item的第二个子节点
    QStandardItem* itemImg = new QStandardItem(QStringLiteral("图片"));
    itemRoot->appendRow(itemImg);

    // 7.向第二个子节点itemImg添加子节点数据
    QList<QStandardItem*> imgList;
    imgList.append(new QStandardItem("img1"));
    imgList.append(new QStandardItem("img2"));
    imgList.append(new QStandardItem("img3"));
    itemImg->appendRows(imgList);

    // 8.TreeView控件载入model
    ui->m_treeView->setModel(m_standardItemModel);

    // 9.展开数据
    ui->m_treeView->expandAll();

    // 槽函数
    connect(ui->m_treeView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MainWindow::_on_m_treeView_current_changed);
    connect(ui->m_treeView, &QTreeView::customContextMenuRequested, this, &MainWindow::_on_m_treeView_MenuPopup);

    // 其他操作

    // 节点设置checkBox
    itemCam->setCheckable(true);
    itemImg->setCheckable(true);

    // 节点设置图标
    itemCam->setIcon(QIcon("C:/Users/admin/Desktop/Alexnet_Structure.png"));// 只能添加png, jpg等格式文件,无法添加.ico图标文件

    // 节点不可编辑
    ui->m_treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    // 右键菜单
    ui->m_treeView->setContextMenuPolicy(Qt::CustomContextMenu);

}
void MainWindow::_on_m_treeView_current_changed(const QModelIndex& current, const QModelIndex& previous)
{
    // 你的操作 ...
    QModelIndex index = current.sibling(current.row(), 0); //子节点只有一行的情况下
}

void MainWindow::_on_m_treeView_MenuPopup(const QPoint& pos)
{
    QMenu* menu = new QMenu(ui->m_treeView);
    menu->addAction(QStringLiteral("添加"));
    menu->addAction(QStringLiteral("删除"));
    menu->exec(ui->m_treeView->mapToGlobal(pos));
}

//void MainWindow::_on_m_treeView_MenuPopup(const QPoint& pos)
//{
//    QMenu* menu = new QMenu(ui->m_treeView);
//    menu->addAction(QStringLiteral("添加"));
//    menu->addAction(QStringLiteral("删除"));
//    menu->exec(ui->m_treeView->mapToGlobal(pos));
//}

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


文章来源:https://blog.csdn.net/weixin_42797483/article/details/135601842
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。