ZW3D二次开发_使用QT表单

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

点击按钮可以看到槽函数被触发。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值