123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- #include "WindowAppTreeTool.h"
- #include "ToolDepository.h"
- #include "DragMimeData.h"
- extern ToolDepository toolDepository;
- WindowAppTreeTool::WindowAppTreeTool(TREETOOL_MODE mode, QTreeWidget* parent)
- : QTreeWidget(parent)
- , m_Mode(mode)
- {
- // 创建界面布局
- createLayouts();
- // 创建节点的右键菜单
- createMenu();
- // 加载工具
- toolDepository.LoadTools();
- // 添加所有工具到树形结构中
- initTreeTools();
- }
- WindowAppTreeTool::~WindowAppTreeTool()
- {
- }
- /// <summary>
- /// 清空工具箱
- /// </summary>
- void WindowAppTreeTool::clear()
- {
- m_RootItems.clear();
- m_CateItems.clear();
- m_ItemTools.clear();
- QTreeWidget::clear();
- }
- /// <summary>
- /// 创建界面布局
- /// </summary>
- void WindowAppTreeTool::createLayouts()
- {
- // 1列
- this->setColumnCount(1);
- // 隐藏表头
- this->setHeaderHidden(true);
- // 显示虚线
- this->setStyle(QStyleFactory::create("windows"));
- // 添加右键菜单策略
- this->setContextMenuPolicy(Qt::CustomContextMenu);
- // 设置根节点有连接线
- this->setRootIsDecorated(true);
- // 设置节点展开
- this->setItemsExpandable(true);
- //设置树节点允许拖拽(只允许拖出,不允许拖入)
- this->setDragEnabled(true);
- // 下面这种方式也可以
- //this->setDragDropMode(QAbstractItemView::DragOnly);
- //拖拽节点的移动
- //this->setDefaultDropAction(Qt::MoveAction);
- }
- /// <summary>
- /// 创建节点的右键菜单
- /// </summary>
- void WindowAppTreeTool::createMenu()
- {
- // 绑定槽函数
- // connect(nodeMenus[NODE_GVL], SIGNAL(triggered(QAction*)), this, SLOT(onMenuGVL(QAction*)));
- // 节点菜单的Action
- actionAdd = new QAction(("Add"), this);
- actionInfo = new QAction(("ToolInfo"), this);
- m_menuTool = new QMenu(this);
- m_menuTool->addAction(actionAdd);
- m_menuTool->addAction(actionInfo);
- connect(m_menuTool, SIGNAL(triggered(QAction*)), this, SLOT(onMenuAdd(QAction*)));
- connect(m_menuTool, SIGNAL(triggered(QAction*)), this, SLOT(onMenuinfo(QAction*)));
- // connect(this, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(checkself(QTreeWidgetItem*, int)));
- // 右键菜单
- connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(popMenu(const QPoint&)));
- }
- /// <summary>
- /// 添加所有工具到树形结构中
- /// </summary>
- void WindowAppTreeTool::initTreeTools(TREETOOL_MODE mode)
- {
- clear();
- m_Mode = mode;
-
- for (int i = 0; i < toolDepository.m_TotalTools.size(); i++)
- {
- const TOOL_CATEGORY& cate = toolDepository.m_TotalTools[i];
- // 2021-6-8增加,区分Pou和Hardware
- if (m_Mode == TREETOOL_MODE::MODE_HARDWARE &&
- cate.strName != CATEGORY_TOOL_HARDWARE)
- {
- this->expandAll();
- continue;
- }
- AddCateItem(cate.strName);
- for (int j = 0; j < cate.staticTools.size(); j++)
- {
- const STATIC_TOOL& tool = cate.staticTools[j];
- AddToolItem(cate.strName, tool);
- }
- }
- }
- /// <summary>
- /// 添加分类父节点
- /// </summary>
- /// <param name="cateName"></param>
- void WindowAppTreeTool::AddCateItem(const QString& cateName)
- {
- QTreeWidgetItem* newItem = new QTreeWidgetItem(this, QStringList(cateName));
- newItem->setIcon(0, QIcon(":/image/tree_folder.png"));
- // 2021-3-23增加,使父节点不可选中
- newItem->setFlags(Qt::ItemIsEnabled);
- m_RootItems.append(newItem);
- m_CateItems.insert(cateName, newItem);
- }
- /// <summary>
- /// 添加Tool子节点
- /// </summary>
- /// <param name="cateName"></param>
- /// <param name="tool"></param>
- void WindowAppTreeTool::AddToolItem(const QString& cateName, const STATIC_TOOL& tool)
- {
- QTreeWidgetItem* newItem = new QTreeWidgetItem(m_CateItems.value(cateName), QStringList(tool.strName));
- newItem->setIcon(0, QIcon(":/image/tree_item.png"));
- m_CateItems[cateName]->addChild(newItem);
- // 将新加入的item和对应的tool绑定
- m_ItemTools.insert(newItem, &tool);
- }
- /// <summary>
- /// 显示右键菜单
- /// </summary>
- /// <param name=""></param>
- void WindowAppTreeTool::popMenu(const QPoint&)
- {
- QTreeWidgetItem* curItem = this->currentItem(); //获取当前被点击的节点
- // 点击到空白处则不显示菜单
- if (curItem == nullptr)
- {
- return;
- }
- m_menuTool->exec(QCursor::pos()); //在当前鼠标位置显示
- }
- /// <summary>
- /// 右键菜单槽函数 - Add
- /// </summary>
- /// <param name="action"></param>
- void WindowAppTreeTool::onMenuAdd(QAction* action)
- {
- Q_UNUSED(action);
- }
- /// <summary>
- /// 右键菜单槽函数 - Info
- /// </summary>
- /// <param name="action"></param>
- void WindowAppTreeTool::onMenuinfo(QAction* action)
- {
- Q_UNUSED(action);
- }
- /// <summary>
- /// 鼠标按下时获取用户拖拽的节点
- /// </summary>
- /// <param name="event"></param>
- void WindowAppTreeTool::mousePressEvent(QMouseEvent* event)
- {
- if (event->button() & Qt::LeftButton)
- {
- // 获取拖拽的节点
- QTreeWidgetItem* dragItem = this->itemAt(event->pos());
- // 2021-3-23 如果是父节点,则不允许选中
- const STATIC_TOOL* pTool = m_ItemTools.value(dragItem);
- if (pTool != nullptr)
- {
- // 拖动时的图标(实际应该是一个功能块的缩略图)
- QPixmap pixmap(":/image/tree_item.png");
- // 设置拖拽信息
- DragMimeData* mimeData = new DragMimeData();
- mimeData->setDragData(FORMAT_DRAG_TOOL, pTool);
- // 执行拖动
- QDrag* drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->setPixmap(pixmap);
- drag->exec(Qt::CopyAction);
- }
- }
- QTreeWidget::mousePressEvent(event);
- }
|