后面重新测试,QT5.12.0,QT5.12.7都是可行的,QT环境通过环境变量

set QT_PLUGIN_PATH=%WORK_DIR%\plugins 设置,QT官方解释:

https://doc.qt.io/qt-6/deployment-plugins.html

2. 项目类型不是NX项目,而是创建Qt Widgets Application 项目,然后配置NX相关环境配置,

(也可以建立普通的C++ 项目,然后把NX和QT相关头文件库包含进去,QT项目容易出错)

3. 关于QT dll打包,和QT exe程序打包是不一样的,

不能用windeployqt命令来收集

不能用windeployqt命令来收集

不能用windeployqt命令来收集

收集的dll和QT bin目录下的dll是不一样的!!!如果收集的dll不对,后续环境变量的设置都是无效的,必须从bin目录下拷贝dll。

Win10,VS2017,NX1899,Qt5.12.X

项目搭建设置使用:

1.使用VS2017创建项目,注意是创建Qt项目,不是NX项目。一直下一步即可

2. 项目属性配置:

(1)设置类型改成动态库dll(MFC的使用和字符集没有测试过,使用的默认值)

(2)设置 附加包含目录、附加库目录、附加依赖项

注意:有时候虽然配置成dll,但仍然生成exe文件,此时需要强制更改输出文件

3. 编码

参考链接: https://github.com/Alexpux/qt-solutions/archive/refs/heads/master.zip

(1)从GitHub项目上摘取 qmfcapp.h  qmfcapp.cpp  qwinwidget.h   qwinwidget.cpp,添加到项目

(2)打开main.cpp文件,删除main函数,添加NX 入口函数:ufusr、ufusr_ask_unload:

#include <qmfcapp.h>
#include <qwinwidget.h>
#include <QMessageBox>
#include <afx.h>
#include <afxwin.h>
#include <Windows.h>
#include <QtGui.h>
#include <uf.h>
#include <uf_ui.h>
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID  lpvReserved)
    static bool ownApplication = FALSE;
    //内部创建application实例
    if (dwReason == DLL_PROCESS_ATTACH)
        ownApplication = QMfcApp::pluginInstance(hInstance);
        //qApp 相关设置
    //退出的时候delete qApp;
    if (dwReason == DLL_PROCESS_DETACH && ownApplication)
        delete qApp;
    return TRUE;
extern "C" DllExport void  ufusr(char *param, int *retcod, int param_len)
    if (UF_initialize())
        return;
    HWND hwnd = (HWND)UF_UI_get_default_parent();
    QWinWidget* parent = new QWinWidget(hwnd);
    //这里必须是指针,否则无效
    //QtGui gui(qWinWidget);
    //gui.activateWindow();
    //gui.show();
    QtGui* gui = new QtGui(parent);
    gui->activateWindow();
    gui->show();
    UF_terminate();
extern "C" DllExport int ufusr_ask_unload()
    return (UF_UNLOAD_UG_TERMINATE);

需要注意的是:将父窗口转成这个类QWinWidget,然后作为parent 传入自定义对话框类中。

不能将自定义对话框直接继承QWinWidget

其他测试代码:

 QtGui.hpp

#pragma once
#include <QtWidgets/QMainWindow>
#include <qwinwidget.h>
#include <QWidget>
#include <QLabel>
#include <QGridLayout>
#include <QLineEdit>
#include <QCheckBox>
#include <QDialog>
#include <QPushButton>
class QtGui : public QDialog
    Q_OBJECT
public:
    QtGui(QWidget* parent);
public slots:
    void CreateBlock();
private:
    QLabel* m_lengthLabel;
    QLineEdit* m_lengthLineEdit;
    QLabel* m_widthLabel;
    QLineEdit* m_widthLineEdit;
    QLabel* m_heightLabel;
    QLineEdit* m_heightLineEdit;
    QPushButton* m_createBlock;
    QGridLayout* m_mainLayout;

QtGui.cpp

#pragma execution_character_set("utf-8")
#include "QtGui.h"
#include <uf_modl.h>
QtGui::QtGui(QWidget* parent) :QDialog(parent)
    m_lengthLabel = new QLabel(tr("长度:"));
    m_lengthLineEdit = new QLineEdit;
    m_widthLabel = new QLabel(tr("宽度:"));
    m_widthLineEdit = new QLineEdit;
    m_heightLabel = new QLabel(tr("高度:"));
    m_heightLineEdit = new QLineEdit;
    m_createBlock = new QPushButton(tr("创建块"));
    m_mainLayout = new QGridLayout(this);
    m_mainLayout->setMargin(15);
    m_mainLayout->setSpacing(10);
    m_mainLayout->addWidget(m_lengthLabel, 0, 0);
    m_mainLayout->addWidget(m_lengthLineEdit, 0, 1);
    m_mainLayout->addWidget(m_widthLabel, 1, 0);
    m_mainLayout->addWidget(m_widthLineEdit, 1, 1);
    m_mainLayout->addWidget(m_heightLabel, 2, 0);
    m_mainLayout->addWidget(m_heightLineEdit, 2, 1);
    m_mainLayout->addWidget(m_createBlock, 3, 0);
    m_mainLayout->setSizeConstraint(QLayout::SetFixedSize);
    connect(m_createBlock, &QPushButton::clicked, this, &QtGui::CreateBlock);
void QtGui::CreateBlock()
    std::string length = m_lengthLineEdit->text().toStdString();
    std::string width = m_widthLineEdit->text().toStdString();
    std::string height = m_heightLineEdit->text().toStdString();
    double corner[3] = { 0.0 };
    char* size[3] = { const_cast<char*>(length.c_str()),
                              const_cast<char*>(width.c_str()),
                              const_cast<char*>(height.c_str())
    tag_t blockFeat = NULL_TAG;
    UF_MODL_create_block(UF_FEATURE_SIGN::UF_NULLSIGN, NULL_TAG, corner, size, &blockFeat);
    UF_MODL_update();

 (3)示例:创建一个块 

4. 收集依赖的dll

开发时配置QT环境到PATH中,启动VS编译运行都是OK的

@echo off
set WORK_DIR=D:\MyProject\Qt\Qt_NX\QtClassLibrary1
set "UGII_BASE_DIR=C:\Program Files\Siemens\NX1899"
set VS2017_EXE="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\devenv.exe"
set QTDIR=C:\Qt\Qt5.12.7\5.12.7\msvc2017_64
set PATH=%UGII_ROOT_DIR%;%UGII_UGRAF_DIR%;%PATH%;%QTDIR%\bin;
set UGII_DISPLAY_DEBUG=1
%VS2017_EXE%  %WORK_DIR%\QtClassLibrary1.sln

但按照之前的用windeployqt命令来收集好dll之后会报错,只要运行NX界面上的属性、信息功能或者调用API UF_UI_write_listing_window() 功就会崩溃......

尝试过set QT_QPA_PLATFORM_PLUGIN_PATH到 dll所在文件夹也不行,各种报错:

最后从把所有bin文件夹下的内容拷贝到dll所在目录,然后NX中调用这个dll,再把拷贝的文件全部删除,看哪些dll被占用,发现:

然后只保留这三个dll文件,就可以了 !!!

(编译的dll是Release版本,如果是Debug,依赖的三个dll要加d)

5. 部署到其他电脑使用

本来以为收集3个dll就结束了,然后把软件包拷贝到其他电脑上使用,结果报错:

百度搜了下:可以参考链接:

https://blog.csdn.net/qq_43903004/article/details/113878306

https://blog.csdn.net/qq_51606180/article/details/120384845

set QT_PLUGIN_PATH=%WORK_DIR%\plugins 或
set QT_QPA_PLATFORM_PLUGIN_PATH=%WORK_DIR%\plugins\platforms

运行成功,还是得通过报错信息上找原因。

是的,你没看错,是在浏览器中嵌入窗口,其实你想一想可能没必要,确实也是,在本地窗口中中嵌入浏览器是再正常不过的了,但是如果你有一个需求,需要使用到本地窗口,例如一些绘制操作,这边博客的大神使用的是PPAPI+skia实现简单的涂鸦功能 (https://blog.csdn.net/foruok/article/details/50547737),PPAPI具体我也不是很了解,应该是谷歌...
测试环境:Win10,x64, VS2017,NX1907 实现原理: NX调用MFC程序,实现进度条显示 使用方法: 下载后解压,设置 .bat环境变量,启动bat,然后将NXTest设为启动项目 说明:不支持多进程多线程
当UOS系统中的Qt Creator调用其他程序时出现崩溃并退出的问题可能有多种原因。下面我将列举一些常见的原因和解决方法,希望能帮助你解决这个问题。 1. 程序兼容性问题:有可能调用的程序与Qt Creator的版本不兼容,或者程序本身存在bug导致崩溃。解决方法可以尝试更新Qt Creator版本,或者联系程序的开发者寻求解决方案。 2. 内存不足:当调用其他程序时,占用的内存可能超出了系统的可用内存,导致系统崩溃。解决方法是检查系统内存使用情况,可以关闭其他占用大量内存的程序,或者增加系统的内存容量。 3. 文件路径错误或缺失:调用其他程序时,如果程序的路径错误或者相关的文件缺失,会导致系统崩溃退出。解决方法是检查调用程序的路径是否正确,并确保必要的文件存在。 4. 权限问题:如果调用程序需要特定的权限,而Qt Creator没有获取这些权限,就会导致崩溃退出。解决方法是确保Qt Creator具有调用程序所需的权限,可以尝试以管理员身份运行Qt Creator。 5. 资源冲突:在调用其他程序时,可能会出现资源冲突的情况,比如同时操作同一个文件或者设备。解决方法是避免资源冲突,可以在调用程序前先确认资源是否被其他程序占用。 如果以上方法都无法解决问题,建议向Qt Creator的开发者寻求帮助,他们可能更有能力解决这个问题。同时,确保系统和Qt Creator是最新版本也是一种好的尝试。希望这些解决方法对你有所帮助。