WindowAppTreeTool.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "WindowAppTreeTool.h"
  2. #include "ToolDepository.h"
  3. #include "DragMimeData.h"
  4. extern ToolDepository toolDepository;
  5. WindowAppTreeTool::WindowAppTreeTool(TREETOOL_MODE mode, QTreeWidget* parent)
  6. : QTreeWidget(parent)
  7. , m_Mode(mode)
  8. {
  9. // 创建界面布局
  10. createLayouts();
  11. // 创建节点的右键菜单
  12. createMenu();
  13. // 加载工具
  14. toolDepository.LoadTools();
  15. // 添加所有工具到树形结构中
  16. initTreeTools();
  17. }
  18. WindowAppTreeTool::~WindowAppTreeTool()
  19. {
  20. }
  21. /// <summary>
  22. /// 清空工具箱
  23. /// </summary>
  24. void WindowAppTreeTool::clear()
  25. {
  26. m_RootItems.clear();
  27. m_CateItems.clear();
  28. m_ItemTools.clear();
  29. QTreeWidget::clear();
  30. }
  31. /// <summary>
  32. /// 创建界面布局
  33. /// </summary>
  34. void WindowAppTreeTool::createLayouts()
  35. {
  36. // 1列
  37. this->setColumnCount(1);
  38. // 隐藏表头
  39. this->setHeaderHidden(true);
  40. // 显示虚线
  41. this->setStyle(QStyleFactory::create("windows"));
  42. // 添加右键菜单策略
  43. this->setContextMenuPolicy(Qt::CustomContextMenu);
  44. // 设置根节点有连接线
  45. this->setRootIsDecorated(true);
  46. // 设置节点展开
  47. this->setItemsExpandable(true);
  48. //设置树节点允许拖拽(只允许拖出,不允许拖入)
  49. this->setDragEnabled(true);
  50. // 下面这种方式也可以
  51. //this->setDragDropMode(QAbstractItemView::DragOnly);
  52. //拖拽节点的移动
  53. //this->setDefaultDropAction(Qt::MoveAction);
  54. }
  55. /// <summary>
  56. /// 创建节点的右键菜单
  57. /// </summary>
  58. void WindowAppTreeTool::createMenu()
  59. {
  60. // 绑定槽函数
  61. // connect(nodeMenus[NODE_GVL], SIGNAL(triggered(QAction*)), this, SLOT(onMenuGVL(QAction*)));
  62. // 节点菜单的Action
  63. actionAdd = new QAction(("Add"), this);
  64. actionInfo = new QAction(("ToolInfo"), this);
  65. m_menuTool = new QMenu(this);
  66. m_menuTool->addAction(actionAdd);
  67. m_menuTool->addAction(actionInfo);
  68. connect(m_menuTool, SIGNAL(triggered(QAction*)), this, SLOT(onMenuAdd(QAction*)));
  69. connect(m_menuTool, SIGNAL(triggered(QAction*)), this, SLOT(onMenuinfo(QAction*)));
  70. // connect(this, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(checkself(QTreeWidgetItem*, int)));
  71. // 右键菜单
  72. connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(popMenu(const QPoint&)));
  73. }
  74. /// <summary>
  75. /// 添加所有工具到树形结构中
  76. /// </summary>
  77. void WindowAppTreeTool::initTreeTools(TREETOOL_MODE mode)
  78. {
  79. clear();
  80. m_Mode = mode;
  81. for (int i = 0; i < toolDepository.m_TotalTools.size(); i++)
  82. {
  83. const TOOL_CATEGORY& cate = toolDepository.m_TotalTools[i];
  84. // 2021-6-8增加,区分Pou和Hardware
  85. if (m_Mode == TREETOOL_MODE::MODE_HARDWARE &&
  86. cate.strName != CATEGORY_TOOL_HARDWARE)
  87. {
  88. this->expandAll();
  89. continue;
  90. }
  91. AddCateItem(cate.strName);
  92. for (int j = 0; j < cate.staticTools.size(); j++)
  93. {
  94. const STATIC_TOOL& tool = cate.staticTools[j];
  95. AddToolItem(cate.strName, tool);
  96. }
  97. }
  98. }
  99. /// <summary>
  100. /// 添加分类父节点
  101. /// </summary>
  102. /// <param name="cateName"></param>
  103. void WindowAppTreeTool::AddCateItem(const QString& cateName)
  104. {
  105. QTreeWidgetItem* newItem = new QTreeWidgetItem(this, QStringList(cateName));
  106. newItem->setIcon(0, QIcon(":/image/tree_folder.png"));
  107. // 2021-3-23增加,使父节点不可选中
  108. newItem->setFlags(Qt::ItemIsEnabled);
  109. m_RootItems.append(newItem);
  110. m_CateItems.insert(cateName, newItem);
  111. }
  112. /// <summary>
  113. /// 添加Tool子节点
  114. /// </summary>
  115. /// <param name="cateName"></param>
  116. /// <param name="tool"></param>
  117. void WindowAppTreeTool::AddToolItem(const QString& cateName, const STATIC_TOOL& tool)
  118. {
  119. QTreeWidgetItem* newItem = new QTreeWidgetItem(m_CateItems.value(cateName), QStringList(tool.strName));
  120. newItem->setIcon(0, QIcon(":/image/tree_item.png"));
  121. m_CateItems[cateName]->addChild(newItem);
  122. // 将新加入的item和对应的tool绑定
  123. m_ItemTools.insert(newItem, &tool);
  124. }
  125. /// <summary>
  126. /// 显示右键菜单
  127. /// </summary>
  128. /// <param name=""></param>
  129. void WindowAppTreeTool::popMenu(const QPoint&)
  130. {
  131. QTreeWidgetItem* curItem = this->currentItem(); //获取当前被点击的节点
  132. // 点击到空白处则不显示菜单
  133. if (curItem == nullptr)
  134. {
  135. return;
  136. }
  137. m_menuTool->exec(QCursor::pos()); //在当前鼠标位置显示
  138. }
  139. /// <summary>
  140. /// 右键菜单槽函数 - Add
  141. /// </summary>
  142. /// <param name="action"></param>
  143. void WindowAppTreeTool::onMenuAdd(QAction* action)
  144. {
  145. Q_UNUSED(action);
  146. }
  147. /// <summary>
  148. /// 右键菜单槽函数 - Info
  149. /// </summary>
  150. /// <param name="action"></param>
  151. void WindowAppTreeTool::onMenuinfo(QAction* action)
  152. {
  153. Q_UNUSED(action);
  154. }
  155. /// <summary>
  156. /// 鼠标按下时获取用户拖拽的节点
  157. /// </summary>
  158. /// <param name="event"></param>
  159. void WindowAppTreeTool::mousePressEvent(QMouseEvent* event)
  160. {
  161. if (event->button() & Qt::LeftButton)
  162. {
  163. // 获取拖拽的节点
  164. QTreeWidgetItem* dragItem = this->itemAt(event->pos());
  165. // 2021-3-23 如果是父节点,则不允许选中
  166. const STATIC_TOOL* pTool = m_ItemTools.value(dragItem);
  167. if (pTool != nullptr)
  168. {
  169. // 拖动时的图标(实际应该是一个功能块的缩略图)
  170. QPixmap pixmap(":/image/tree_item.png");
  171. // 设置拖拽信息
  172. DragMimeData* mimeData = new DragMimeData();
  173. mimeData->setDragData(FORMAT_DRAG_TOOL, pTool);
  174. // 执行拖动
  175. QDrag* drag = new QDrag(this);
  176. drag->setMimeData(mimeData);
  177. drag->setPixmap(pixmap);
  178. drag->exec(Qt::CopyAction);
  179. }
  180. }
  181. QTreeWidget::mousePressEvent(event);
  182. }