1.代码
cpp
#define FormName (char*)"ZsCcTreeView"
#define id1 1
static int nodeId0 = 0;//根节点ID
void UI_普通对话框_ZsCcTreeView()
{
ZF_VOID(cvxFormShow(FormName));
}
int _UI_普通对话框_ZsCcTreeView_插入节点(const char* label, int parentNode = 0)
{
int siblingId = VX_INSERT_LAST;//兄弟节点
int imgIdx = -1;
int folderIdx = -1;
evxTreeItemType nodeType = VX_ITEM;
int dbIdx = -1;
int nodeFlag = VX_TREE_IS_ENABLE + VX_TREE_IS_EDITABLE + VX_TREE_IS_DRAG_ENABLE + VX_TREE_IS_DROP_ENABLE + VX_TREE_IS_SELECTABLE;
int outItemId = -1;
const char* cmdName = NULL;
ZF_CALL(cvxTreeAddItem(
FormName,
id1,
parentNode,
siblingId,
label,
imgIdx,
folderIdx,
nodeType,
dbIdx,
nodeFlag,
&outItemId,
cmdName));
return outItemId;
}
//树控件初始化
void _UI_普通对话框_ZsCcTreeView_Init()
{
//获取控件的宽高
int treeHeader_width = 0;
int treeHeader_height = 0;
ZF_CALL(cvxTreeHeaderGetSize(FormName, id1, &treeHeader_width, &treeHeader_height));
WriteMessage("获取控件的宽 = %d, 高 = %d", treeHeader_width, treeHeader_height);
//插入列
ZF_VOID(cvxTreeSetHeaderText(FormName, id1, 0, "序号"));
ZF_VOID(cvxTreeSetColumnWidth(FormName, id1, 0, 100));
ZF_VOID(cvxTreeSetHeaderText(FormName, id1, 1, "零件编号"));
ZF_VOID(cvxTreeSetColumnWidth(FormName, id1, 1, 100));
ZF_VOID(cvxTreeSetHeaderText(FormName, id1, 2, "零件名称"));
ZF_VOID(cvxTreeSetColumnWidth(FormName, id1, 2, 100));
ZF_VOID(cvxTreeSetHeaderText(FormName, id1, 3, "采购规格"));
ZF_VOID(cvxTreeSetColumnWidth(FormName, id1, 3, 100));
//获取列数
int columnCount = cvxTreeGetColumnCount(FormName, id1);
WriteMessage("获取树的列数 = %d", columnCount);
//设置列数
cvxTreeSetColumnCount(FormName, id1, ++columnCount);
WriteMessage("设置树的列数 = %d", columnCount);
//设置列标题对齐方式
ZF_CALL(cvxTreeSetHeaderTextAlignment(FormName, id1,0, evxAlignFlag::VX_ALIGN_CENTER));
ZF_CALL(cvxTreeSetHeaderTextAlignment(FormName, id1,1, evxAlignFlag::VX_ALIGN_CENTER));
ZF_CALL(cvxTreeSetHeaderTextAlignment(FormName, id1,2, evxAlignFlag::VX_ALIGN_CENTER));
ZF_CALL(cvxTreeSetHeaderTextAlignment(FormName, id1,3, evxAlignFlag::VX_ALIGN_CENTER));
//获取列宽
int colum_width = cvxTreeGetColumnWidth(FormName, id1, 0);
WriteMessage("获取第0列的列宽 = %d", colum_width);
//设置列宽
ZF_VOID(cvxTreeSetColumnWidth(FormName, id1, 0, colum_width));
WriteMessage("设置第0列的列宽 = %d", colum_width);
//自动调整列宽
//ZF_CALL(cvxTreeAutoResizeColumn(FormName, id1, 0));
//获取列是否隐藏
int isHidden = cvxTreeIsColumnHidden(FormName, id1, 0);
WriteMessage("第0列%s", isHidden ? "隐藏":"没有隐藏");
//设置列是否隐藏
ZF_VOID(cvxTreeSetColumnHidden(FormName, id1, 0, isHidden));
WriteMessage("设置第0列%s", isHidden ? "隐藏" : "不隐藏");
//设置列图标
ZF_VOID(cvxTreeSetHeaderIcon(FormName, id1, 0, "ICON1704"));
//插入节点
nodeId0 = _UI_普通对话框_ZsCcTreeView_插入节点("一级节点0", 0);
int nodeId1 = _UI_普通对话框_ZsCcTreeView_插入节点("一级节点1", 0);
int nodeId2 = _UI_普通对话框_ZsCcTreeView_插入节点("一级节点2", 0);
int nodeId3 = _UI_普通对话框_ZsCcTreeView_插入节点("一级节点3", 0);
//删除节点及后辈节点
ZF_CALL(cvxTreeDeleteItem(FormName, id1, nodeId3));
WriteMessage("删除节点[%d]及后辈节点", nodeId3);
//获取同级的上一个节点
int previousId = -1;
ZF_CALL(cvxTreeGetPrevSiblingItem(FormName, id1, nodeId1, &previousId));
WriteMessage("节点【%d】同级的上一个节点 = %d", nodeId1,previousId);
//获取同级的下一个节点
int nextId = 0;
ZF_CALL(cvxTreeGetNextSiblingItem(FormName, id1, nodeId1, &nextId));
WriteMessage("节点【%d】同级的下一个节点 = %d", nodeId1, nextId);
//插入子节点
int childNodeId0 = _UI_普通对话框_ZsCcTreeView_插入节点("二级节点0", nodeId0);
int childNodeId1 = _UI_普通对话框_ZsCcTreeView_插入节点("二级节点1", nodeId0);
int childNodeId2 = _UI_普通对话框_ZsCcTreeView_插入节点("二级节点2", nodeId0);
int childNodeId3 = _UI_普通对话框_ZsCcTreeView_插入节点("二级节点3", nodeId1);
//删除节点的所有子结点
ZF_CALL(cvxTreeDeleteSubItem(FormName, id1, nodeId1));
//获取子节点
int count_children = 0;
ZF_CALL(cvxTreeGetChildrenCount(FormName, id1, nodeId0, &count_children));
WriteMessage("节点[%d]共有[%d]个子节点:", nodeId0, count_children);
for (int i = 0; i < count_children; i++)
{
int child_id = 0;
ZF_CALL(cvxTreeGetChildItem(FormName, id1, nodeId0, i, &child_id));
WriteMessage("--子节点[%d]", child_id);
//获取父节点
int parent_id = 0;
ZF_CALL(cvxTreeGetParentItem(FormName, id1, child_id, &parent_id));
WriteMessage("--子节点[%d]的父节点是[%d]", child_id, parent_id);
}
//获取节点的标志位
int flag = -1;
ZF_CALL(cvxTreeGetItemFlag(FormName, id1, nodeId0,&flag));
WriteMessage("获取节点[%d]的标志位(evxTreeItemFlag的集合) = %d", nodeId0, flag);
//设置节点的标志位
ZF_CALL(cvxTreeSetItemFlag(FormName, id1,1,&nodeId0, flag));
WriteMessage("设置节点[%d]的标志位(evxTreeItemFlag的集合) = %d", nodeId0, flag);
//设置节点是否有勾选框
ZF_CALL(cvxTreeSetItemCheckable(FormName, id1, nodeId0, TRUE));
WriteMessage("设置节点[%d]有勾选框", nodeId0);
//获取节点的勾选状态
evxTreeCheckState checkState = cvxTreeGetItemCheckState(FormName, id1, nodeId0);
WriteMessage("获取节点[%d]勾选状态 = %s", nodeId0, checkState ? "勾选了" : "没勾选");
//设置节点(包括其子节点)的勾选状态
ZF_VOID(cvxTreeSetItemCheckState(FormName, id1, nodeId0, checkState, TRUE));
WriteMessage("设置节点[%d]勾选状态 = %s", nodeId0, checkState ? "勾选了" : "没勾选");
//设置节点某一列的内容
ZF_CALL(cvxTreeSetItemTextByColumn(FormName, id1, nodeId0, 1, "007"));
//设置节点某一列的内容
ZF_CALL(cvxTreeSetItemTextByColumn(FormName, id1, nodeId0, 2, "A"));
//获取节点某一列的内容
char text_colmn[128]{};
ZF_VOID(cvxTreeGetItemTextByColumn(FormName, id1, nodeId0, 2, text_colmn, sizeof(text_colmn)));
WriteMessage("获取节点[%d]第3列的内容 = %s", nodeId0, text_colmn);
//设置节点某一列的文字颜色
svxColor color{};
ZF_CALL(cvxColorRGB(evxColor::VX_COLOR_RED, &color));
ZF_CALL(cvxTreeSetItemTextColor(FormName, id1, childNodeId0, 0, &color));
WriteMessage("设置节点[%d]第0列的文字颜色 = (R:%d,G:%d,B:%d)", nodeId0, color.r, color.g, color.b);
//设置节点的图标
ZF_CALL(cvxTreeSetItemIconNameByColumn(FormName, id1, nodeId1, 0, "ICON1704"));//ICON1704为内置图片,可参阅zw3d-command-dialog_2024\icons,也可用png图片的绝对坐标
//获取节点展开状态
int isExpand = cvxTreeItemIsExpand(FormName, id1, nodeId0);
WriteMessage("获取节点[%d]展开状态 = %s", nodeId0, (isExpand == 1) ? "已展开" : "未展开");
//设置节点展开状态
ZF_CALL(cvxTreeExpandItem(FormName, id1, nodeId0, isExpand));
WriteMessage("设置节点[%d]展开状态 = %s", nodeId0, (isExpand == 1) ? "已展开" : "未展开");
//折叠所有节点
ZF_VOID(cvxTreeCollapseAll(FormName, id1));
WriteMessage("折叠所有节点");
//展开所有节点
ZF_VOID(cvxTreeExpandAll(FormName, id1));
WriteMessage("展开所有节点");
//获取节点是否选中
int isSelected = cvxTreeIsItemSelected(FormName, id1, nodeId0);
WriteMessage("获取节点[%d]选中状态 = %s", nodeId0, (isSelected == 1) ? "已选中" : "未选中");
//获取节点数量
WriteMessage("节点的数量 = %d", cvxTreeItemsCount(FormName, id1));
//设置选择模式
ZF_CALL(cvxTreeSetSelectionMode(FormName, id1,1/*单选*/));
}
void _UI_普通对话框_ZsCcTreeView_Cancel()
{
}
void _UI_普通对话框_ZsCcTreeView_Reset()
{
}
void _UI_普通对话框_ZsCcTreeView_Apply()
{
}
void _UI_普通对话框_ZsCcTreeView_Okay()
{
}
int _UI_普通对话框_ZsCcTreeView_form_cb(int formAction, int* unusedInteger)
{
ZF_WriteThisFunctionName();
if (formAction == evxFormAction::VX_FORM_INIT)
{
WriteMessage("对话框初始化");
_UI_普通对话框_ZsCcTreeView_Init();
}
else if (formAction == evxFormAction::VX_FORM_CANCEL)
{
WriteMessage("用户点击了"取消"按钮");
_UI_普通对话框_ZsCcTreeView_Cancel();
}
else if (formAction == evxFormAction::VX_FORM_RESET)
{
WriteMessage("用户点击了"重置"按钮");
_UI_普通对话框_ZsCcTreeView_Reset();
}
else if (formAction == evxFormAction::VX_FORM_APPLY)
{
WriteMessage("用户点击了"应用"按钮");
_UI_普通对话框_ZsCcTreeView_Apply();
}
else if (formAction == evxFormAction::VX_FORM_OKAY)
{
WriteMessage("用户点击了"确定"按钮");
_UI_普通对话框_ZsCcTreeView_Okay();
}
return 0;
}
int _UI_普通对话框_ZsCcTreeView_update_cb_右键菜单(char* formName, int idField, int idItem)
{
/*
* 如果您的版本是ZW3D2024SP及之前的版本,则需要执行以下操作:
* 关闭ZW3D
* 打开文件"C:\Users\Administrator\AppData\Roaming\ZWSOFT\ZW3D\ZW3D 2024\custom\profiles\Default\4-Expert\Contexts.zcui",添加一个右键菜单
<Menu name="API示例_右键菜单PopupBar" type="ZsCc::PopupBar" showCallback="" hideCallback="" custom="false">
</Menu>
* 保存文件
*/
const char* menuName = "API示例_右键菜单PopupBar";
//判断右键菜单是否已定义
if (ZW_API_NO_ERROR == ZF_CALL(cvxPopupDefine(menuName)))
{
WriteMessage("右键菜单【%s】已定义", menuName);
}
else
{
WriteMessage("右键菜单【%s】未定义", menuName);
return 0;
}
//移除所有菜单项
//ZF_CALL(cvxPopupItemRemove(menuName, -1));//如果是删除.zcui中已存在的项则会返写入文件,如果是删除动态创建的项则不会
char action[1024];
sprintf_s(action, "~_UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调(%d)", 111);
//判断菜单项是否存在
if (1 == cvxPopupItemIsExist(menuName, action))
{
WriteMessage("右键菜单【%s】中存在菜单项【%s】", menuName, action);
}
else
{
//插入菜单项
#if VX_API_VERSION >= 2900
ZF_CALL(ZwUiPopupItemInsert(menuName, -1, "打开", action, NULL));//在菜单的最后插入一项
#else
ZF_CALL(cvxPopupItemInsert(menuName, -1, "打开", action));//在菜单的最后插入一项
#endif
}
//获取所有菜单项
int menuItemNumber = 0;
ZF_CALL(cvxPopupMenuCnt(menuName,&menuItemNumber));
WriteMessage("右键菜单【%s】中菜单项的数量 = 【%d】", menuName, menuItemNumber);
for (int i = 0; i < menuItemNumber; i++)
{
//获取菜单项的显示文本
char labelGet[1024];
ZF_CALL(cvxPopupItemLabelGet(menuName, i, labelGet, sizeof(labelGet)));
WriteMessage("===菜单项【%d】的显示文本 = 【%s】", i, labelGet);
//获取菜单项对应的命令
char actionGet[1024];
ZF_CALL(cvxPopupItemActionGet(menuName, i, actionGet, sizeof(actionGet)));
WriteMessage("===菜单项【%d】对应的命令 = 【%s】", i, actionGet);
//设置菜单项的可用性
ZF_CALL(cvxPopupItemSetEnabledByAction(menuName, actionGet,TRUE));
//设置菜单项的可见性
ZF_CALL(cvxPopupItemSetVisibleByAction(menuName, actionGet, TRUE));
//获取菜单项的可见性
int isVisible = -1;
ZF_CALL(cvxPopupItemVisibleGet(menuName,i, &isVisible));
WriteMessage("===菜单项【%d】可见性 = 【%d】",i,isVisible);
}
const char* subMenuName = "API示例_右键菜单PopupBar_子菜单";
//移除(所有)子菜单项
ZF_CALL(cvxPopupSubMenuItemRemove(menuName, subMenuName, -1));
//ZF_CALL(cvxPopupSubMenuActionsRemove(menuName, subMenuName, -1,-1));
//插入子菜单项
sprintf_s(action, "~_UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调(%d)", 666);
#if VX_API_VERSION >= 2900
ZF_CALL(ZwUiPopupSubMenuItemInsert(menuName, subMenuName, -1,"子菜单项666", action, "ICON315"));
#else
ZF_CALL(cvxPopupSubMenuItemInsert(menuName, subMenuName, -1, action, "子菜单项666", action, "ICON315"));
#endif
//插入分割符
ZF_CALL(cvxPopupSubMenuSeparatorInsert(menuName, subMenuName));
sprintf_s(action, "~_UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调(%d)", 777);
ZF_CALL(cvxPopupSubMenuItemInsert(menuName, subMenuName, -1, action, "子菜单项777", action, "ICON315"));
sprintf_s(action, "~_UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调(%d)", 888);
ZF_CALL(cvxPopupSubMenuItemInsert(menuName, subMenuName, -1, action, "子菜单项888", action, "ICON315"));
//获取子菜单项数量
int subMenuCount = 0;
ZF_CALL(cvxPopupSubMenuCnt(menuName, subMenuName, &subMenuCount));
WriteMessage("===【%s】子菜单项数量 = 【%d】", subMenuName, subMenuCount);
//设置子菜单可见性
ZF_CALL(cvxPopupSubMenuSetVisible(menuName, subMenuName, TRUE));
//更新右键菜单
ZF_CALL(cvxPopupUpdate(menuName));
//显示右键菜单
ZF_MIX(cvxPopupShow(menuName));
return 0;
}
void _UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调()
{
ZF_WriteThisFunctionName();
}
//更新勾选框的函数,点击树节点的Label(文字部分)和Space(空白部分)都需要更新,所以单独做一个函数
void _UI_普通对话框_ZsCcTreeView_update_combobox(const svxTreeCbParam& treeCbParam) {
if (!treeCbParam.itemIsDisabled && treeCbParam.item == nodeId0 && treeCbParam.column == 2) {//如果是nodeId0这行的第二列
char currentValue[32];
ZF_VOID(cvxTreeGetItemTextByColumn(FormName, id1, treeCbParam.item, treeCbParam.column, currentValue, sizeof(currentValue)));
int currentIndex = 0;
if (strcmp(currentValue, "B") == 0)
{
currentIndex = 1;
}
else if (strcmp(currentValue, "C") == 0)
{
currentIndex = 2;
}
ZF_CALL(cvxTreeEditItemByComboBox(FormName, id1, treeCbParam.item, treeCbParam.column, "A,B,C", NULL, currentIndex));//设置某一节点某一列为下拉选项
}
}
//控件的回调函数,由ZW3D自动调用
int _UI_普通对话框_ZsCcTreeView_update_cb(char* formName, int idField, int idItem)
{
//获取回调函数的数据
svxTreeCbParam treeCbParam{};
ZF_CALL(cvxTreeGetCbParam(formName, idField, idItem, &treeCbParam));
//回调触发原因
if (treeCbParam.mode == evxTreeEvent::VX_HOVER)//鼠标在控件中移动
{
return 0;
}
WriteMessage("回调触发原因 = %s",ZF_EnumToString(evxTreeEvent, treeCbParam.mode));
//ZF_WriteThisFunctionName();
switch (treeCbParam.mode)
{
case evxTreeEvent::VX_LEFT_DOWN://按下鼠标左键
break;
case evxTreeEvent::VX_LEFT_UP://松开鼠标左键
{
//选中节点
if (treeCbParam.item != -1)
{
ZF_CALL(cvxTreeUnselectAll(FormName, id1));//取消选中所有节点
ZF_CALL(cvxTreeSelectItem(FormName, id1, treeCbParam.item));//选中节点
int count = 0;
int* pSelectedNodes = NULL;
ZF_CALL(cvxTreeGetSelectedItems(FormName, id1,&count,&pSelectedNodes));
WriteMessage("选中的节点 = %d", pSelectedNodes[0]);
ZF_VOID(cvxMemFree((void**)&pSelectedNodes));
}
//鼠标点击的元素类型
evxTreeHitPos hitPos = treeCbParam.uvxu.svxhit.pos;
switch (hitPos)
{
case VXTHP_BUTTON:
break;
case VXTHP_ICON:
break;
case VXTHP_LABEL://用户点击了节点的内容
char text[1024];
ZF_VOID(cvxTreeGetItemTextByColumn(FormName, id1, treeCbParam.item, treeCbParam.column, text, sizeof(text)));
WriteMessage("用户点击的内容为:%s", text);
_UI_普通对话框_ZsCcTreeView_update_combobox(treeCbParam);//更新ComboBox
break;
case VXTHP_ITEM:
break;
case VXTHP_SPACE:
_UI_普通对话框_ZsCcTreeView_update_combobox(treeCbParam);//更新ComboBox
break;
case VXTHP_CHECKBOX://用户点击了节点前的复选框?
if (evxTreeCheckState::VX_TREE_ITEM_BLACK_CHECKED == cvxTreeGetItemCheckState(FormName, id1, treeCbParam.item))
{
ZF_VOID(cvxTreeSetItemCheckState(FormName, id1, treeCbParam.item, evxTreeCheckState::VX_TREE_ITEM_UNCHECKED, TRUE));
}
else
{
ZF_VOID(cvxTreeSetItemCheckState(FormName, id1, treeCbParam.item, evxTreeCheckState::VX_TREE_ITEM_BLACK_CHECKED, TRUE));
}
break;
case VXTHP_APD_ICON1:
break;
case VXTHP_APD_ICON2:
break;
case VXTHP_HEADER:
break;
default:
break;
}
}
break;
case evxTreeEvent::VX_RIGHT_UP://松开鼠标右键
{
_UI_普通对话框_ZsCcTreeView_update_cb_右键菜单(formName, idField, idItem);
}
break;
case evxTreeEvent::VX_DBL_LEFT://鼠标左键双击
{
//获取节点某一列的内容
char text_colmn[128]{};
ZF_VOID(cvxTreeGetItemTextByColumn(FormName, id1, idItem, treeCbParam.column, text_colmn, sizeof(text_colmn)));
ZF_CALL(cvxTreeEditItemByLineEdit(formName, idField, idItem, treeCbParam.column, text_colmn));
}
break;
default:
break;
}
return 0;
}
void UI_普通对话框_ZsCcTreeView_注册回调函数_Init()
{
ZF_CALL(cvxCmdFunc("ZsCcTreeView_form_cb", _UI_普通对话框_ZsCcTreeView_form_cb, VX_CODE_GENERAL));
ZF_CALL(cvxCmdFunc("ZsCcTreeView_update_cb", _UI_普通对话框_ZsCcTreeView_update_cb, VX_CODE_GENERAL));
ZF_CALL(cvxCmdFunc("_UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调", _UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调, VX_CODE_GENERAL));
}
void UI_普通对话框_ZsCcTreeView_注销回调函数_Exit()
{
ZF_CALL(cvxCmdFuncUnload("ZsCcTreeView_form_cb"));
ZF_CALL(cvxCmdFuncUnload("ZsCcTreeView_update_cb"));
ZF_CALL(cvxCmdFuncUnload("_UI_普通对话框_ZsCcTreeView_update_cb_右键菜单_回调"));
}
2.UI
html
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="ZsCc::Form" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>448</width>
<height>309</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<property name="functionName">
<string notr="true">ZsCcTreeView_form_cb</string>
</property>
<property name="mode">
<enum>ZsCc::Form::Normal</enum>
</property>
<property name="persistent">
<enum>ZsCc::Form::Temporary</enum>
</property>
<property name="form_pos" stdset="0">
<stringlist>
<string>base,CTR,0</string>
</stringlist>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>2</number>
</property>
<item row="0" column="0">
<widget class="ZsCc::TreeView" name="treeView">
<property name="id" stdset="0">
<number>1</number>
</property>
<property name="callback" stdset="0">
<string>ZsCcTreeView_update_cb</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ZsCc::Form</class>
<extends>QDialog</extends>
<header>nui/CommonControls/CcForm.hpp</header>
<container>1</container>
</customwidget>
<customwidget>
<class>ZsCc::TreeView</class>
<extends>QTreeView</extends>
<header>nui/CommonControls/CcTreeView.hpp</header>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>clicked(QAbstractButton*)</signal>
<receiver>Form</receiver>
<slot>onClickStandardButton(QAbstractButton*)</slot>
<hints>
<hint type="sourcelabel">
<x>223</x>
<y>67</y>
</hint>
<hint type="destinationlabel">
<x>223</x>
<y>40</y>
</hint>
</hints>
</connection>
</connections>
</ui>