1.概述
ZW3D除了可以使用自带的模板表单和非模板表单,还可以使用QT表单。
2.ZW3D使用QT表单的优缺点
优点:QT表单的扩展性更强,控件更加丰富。
缺点:QT表单无法停靠在ZW3D侧边栏,且无法使用ZW3D自带的模板表单控件(选择控件等)。
3.ZW3D使用QT表单环境搭建
1)确定QT版本,可查看ZW3D根目录下的Qt5Core.dll文件
2)创建工程,文件->新建->Qt->Qt Widgets Application,名字叫Z3QTForm
3)修改项目配置
①Debug->Release x64(非常关键,否则无法加载dll)
②常规->配置类型 改为动态库dll
③调试->命令 改为$(ZW3D_DIR)zw3d.exe
④ c/c++->常规->附加包含目录 添加$(ZW3D_DIR)api(视情况,ZW3D2023以后为api/inc)
⑤连接器->常规->附加库目录 添加$(ZW3D_DIR)
⑥连接器->输入->附加依赖项 添加zw3d.lib
4)表单类成员函数声明
①编写Z3QtForm.h
为Z3QtForm添加一个QPushButton并定义一个槽函数
#ifndef Z3QTFORM_H
#define Z3QTFORM_H
#include "ui_Z3QTForm.h"
#include <QtWidgets/QDialog>
#include <QPushbutton>
class Z3QTForm : public QDialog
{
Q_OBJECT
public:
Z3QTForm(QWidget *parent = nullptr);
~Z3QTForm();
QPushButton * _button;
private:
Ui::Z3QTFormClass ui;
private slots:
void OnButtonClicked();
};
#endif
②编写Z3QtForm.cpp
#include "Z3QTForm.h"
#include "VxApi.h"
Z3QTForm::Z3QTForm(QWidget *parent): QDialog(parent)
{
_button = new QPushButton(this);
_button->setGeometry(20, 100, 75, 23);
_button->setText("QButton");
QObject::connect(_button, SIGNAL(clicked()), this, SLOT(OnButtonClicked()));
}
Z3QTForm::~Z3QTForm(){}
void Z3QTForm::OnButtonClicked() {
cvxMsgDisp((char*)"Button Clicked!");
}
③编写main.h
添加一个头文件“main.h”到当前工程,用来定义一些插件相关的函数,这里我们定义出入口函数与其它辅助函数。记得导出Init/Exit函数。
#ifndef MAIN_H
#define MAIN_H
#include "Z3QTForm.h"
Z3QTForm * g_form;
extern "C" __declspec(dllexport) int Z3QTFormInit();
extern "C" __declspec(dllexport) int Z3QTFormExit();
void ShowForm();
QWidget* GetZW3DWindow();
int Zw3dAppClose(void * param);
#endif
④ 编写main.cpp
#include <QtWidgets/QApplication>
#include "main.h"
#include "VxApi.h"
QWidget* GetZW3DWindow()
{
QWidgetList widgets = qApp->topLevelWidgets();
for (QWidget* widget : widgets)
{
if (widget->windowTitle().contains(u8"中望3D") ||
widget->windowTitle().contains("ZW3D"))
{
cvxMsgDisp((char*)"Found!");
return widget;
}
}
return nullptr;
}
int Z3QTFormInit() {
int res = cvxCmdFunc("ShowForm", ShowForm, VX_CODE_GENERAL);
svxAppActionParam action_param = { 0 };
action_param.pfn = Zw3dAppClose;
cvxAppAction(evxAppAction::VX_APP_PRECLOSE, &action_param);
return res;
}
int Z3QTFormExit() {
return cvxCmdFuncUnload("ShowForm");
}
void ShowForm() {
QWidget* zw3d = nullptr;
zw3d = GetZW3DWindow();
if (g_form == nullptr)
{
g_form = new Z3QTForm(zw3d);
}
g_form->setAttribute(Qt::WA_DeleteOnClose, true);
g_form->show();
g_form->activateWindow();
}
5)清理表单
为了确保我们创建的表单一定会被清理,可以注册一个zw3d的应用程序关闭事件的回调函数,并在此清理Qt表单,这里会用到我们之前定义的Zw3dAppClose函数,如图所示。
int Zw3dAppClose(void * param) {
if (g_form) {
g_form->close();
delete g_form;
g_form = nullptr;
}
return 0;
}
6)编译&调出表单
①编译插件,打开zw3d,调出表单(执行~ShowForm)
②点击按钮可以看到槽函数被触发。