zoukankan      html  css  js  c++  java
  • QTreewidget的使用

    1 QtreeWidget显示右键菜单

    #include "treewidget.h"
    
    #include <QPushButton>
    #include <QMenu>
    
    TreeWidget::TreeWidget(QWidget *parent)
      : QMainWindow(parent)
    {
      ui.setupUi(this);
    
      //设置树形控件每一列的名称
      QStringList sl;
      sl << u8"名称";
      ui.treeWidget->setHeaderLabels(sl);
    
      //treewidget鼠标右键菜单事件,需要在代码手动设置ContextMenuPolicy属性或者在ui文件中设置
      ui.treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
      connect(ui.treeWidget, &QWidget::customContextMenuRequested, this,
              &TreeWidget::ShowContextMenu);
    
      //为树形控件添加一级结点
      connect(ui.add_first_node_button, &QPushButton::clicked, this,
              &TreeWidget::AddFirstNode);
    
      //为树形控件添加二级结点
      connect(ui.add_second_node_button, &QPushButton::clicked, this,
              &TreeWidget::AddSecondNode);
    }
    
    void TreeWidget::ShowContextMenu(const QPoint &pos)
    {
      QMenu *menu = new QMenu(this);
      QTreeWidgetItem *item = ui.treeWidget->itemAt(pos);
      if (item)
      {
        if ((int)TreeItemType::kFisrtNode == item->type())
        {
          QAction *action1 = new QAction(u8"一级结点1", this);
          menu->addAction(action1);
          QAction *action2 = new QAction(u8"一级结点2", this);
          menu->addAction(action2);
          QAction *action3 = new QAction(u8"一级结点3", this);
          menu->addAction(action3);
        }
        else if ((int)TreeItemType::kSecondNode == item->type())
        {
          QAction *action1 = new QAction(u8"二级结点1", this);
          menu->addAction(action1);
          QAction *action2 = new QAction(u8"二级结点2", this);
          menu->addAction(action2);
          QAction *action3 = new QAction(u8"二级结点3", this);
          menu->addAction(action3);
        }
      }
      else
      { //在空白处点击,没有选中QTreeWidgetItem
        QAction *action1 = new QAction(u8"空白结点1", this);
        menu->addAction(action1);
        QAction *action2 = new QAction(u8"空白结点2", this);
        menu->addAction(action2);
        QAction *action3 = new QAction(u8"空白结点3", this);
        menu->addAction(action3);
      }
    
      menu->exec(QCursor::pos());
    }

    2 QtreeWidget添加结点

    void TreeWidget::AddFirstNode()
    {
      QTreeWidgetItem *node = new QTreeWidgetItem(ui.treeWidget,
          (int)TreeItemType::kFisrtNode);
      QString text = QString::number(++node_sequence_);
      node->setText(0, text);
      ui.treeWidget->addTopLevelItem(node);
    }
    
    void TreeWidget::AddSecondNode()
    {
      QTreeWidgetItem *it = ui.treeWidget->currentItem();
      if (!it)
      {
        return;
      }
      QTreeWidgetItem *item = new QTreeWidgetItem(it, (int)TreeItemType::kSecondNode);
      item->setText(0,u8"二级结点");
      it->addChild(item);
    }

    3 QtreeWidget删除结点

    void TreeWidget::DeleteNode()
    {
      QTreeWidgetItem *item = ui.treeWidget->currentItem();
      if (!item)
      {
        return;
      }
      if ((int)TreeItemType::kFisrtNode == item->type())
      {
        int index = ui.treeWidget->indexOfTopLevelItem(item);
        ui.treeWidget->takeTopLevelItem(index);
      }
      else if ((int)TreeItemType::kSecondNode == item->type())
      {
        ui.treeWidget->removeItemWidget(item, 0);
        delete item;
      }
    }

     效果如下图:

     代码源码下载(treewidget文件夹):git@github.com:Mr-jiayunfei/qt_code.git

  • 相关阅读:
    浅谈线段树
    浅谈KMP
    20200729线上模拟题解
    20200727线上模拟题解
    声明
    tarjan--割点,缩点
    20201029模拟
    高精模板
    二分图--二分图的几种模型
    树的直径与树的重心
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/11008467.html
Copyright © 2011-2022 走看看