QT调用STK12(STKX模块)

发布时间:2025-12-09 16:54:54 浏览次数:5

参考自两位博主文章:

(9条消息) Qt+STK项目配置_zxl_1996的博客-CSDN博客_qt stk

(9条消息) QT5-STK二次开发实例_未完城的博客-CSDN博客_qt stk

本章后面会介绍我出现的和大家可能会出现的各种出错

  • QT项目

  • 创建一个QT项目,需要带ui文件。

  • 环境依赖注入

  • 我安装的是stk12版本的,我看其他博主,9,11,13都有成功的,(有13吗??)。文件在该STK目录下:

    C:\Program Files\AGI\STK12\CodeSamples\CodeSamples\CommonFiles\CppIncludes

    这里我的CodeSamples文件是一个压缩包,我解压了,可能会重复一层。

    很多。我直接就把这个文件夹拷贝到了项目文件目录中。

  • 编程

  • 创建STK类

    stk.h

    #include "CppIncludes/AgStkUtil.tlh"using namespace STKUtil;//引用相应命名空间#include "CppIncludes/AgVGT.tlh"#include "CppIncludes/AgSTKGraphics.tlh"#include "CppIncludes/AgStkObjects.tlh"using namespace STKObjects;#include "CppIncludes/STKX.tlh"using namespace STKXLib;

    顺序不能错!!!

    stk.cpp

    #include "stk.h"#include "CppIncludes/AgStkUtil.tli"#include "CppIncludes/AgSTKGraphics.tli"#include "CppIncludes/AgStkObjects.tli"#include "CppIncludes/STKX.tli"

    顺序不能错!!!

    顺序不能错!!! 顺序错了会出现一大堆错误。

    创建QSTKEarth类

    qstkearth.h

    #ifndef QSTKEARTH_H#define QSTKEARTH_H#include "STK.h"#include <QWidget>#include <ActiveQt/QAxWidget>#include <QMutexLocker>#include <QDebug>class QSTKEarth : public QWidget{Q_OBJECTpublic:static QSTKEarth &getInstance(){if(instance==NULL){QMutexLocker locker(&mutex);if(NULL==instance)instance=new QSTKEarth;}return *instance;}bool enableControl;~QSTKEarth();private:static QMutex mutex;static QAtomicPointer<QSTKEarth> instance;QSTKEarth(const QSTKEarth &);QSTKEarth(QWidget *parent = 0);IAgStkObjectRootPtr m_pRoot;IAgSTKXApplicationPtr m_app;public:void PauseSTK();void StartSTK();void FasterSTK();void SlowerSTK();void ResetSTK();void NewScenario();void LoadScenario();void UnloadStkScence();};#endif // QSTKEARTH_H

    qstkearth.cpp

    #include "QSTKEarth.h"#include <QMessageBox>#include <QDebug>#include <QVBoxLayout>#include <QFileDialog>QMutex QSTKEarth::mutex;QAtomicPointer<QSTKEarth> QSTKEarth::instance=0;QSTKEarth::QSTKEarth(QWidget *parent) : QWidget(parent){::CoInitialize(NULL);// Create a new instance of Automation Object Model Root ObjectHRESULT ha=m_app.CreateInstance(__uuidof(AgSTKXApplication));if(FAILED(ha)){QMessageBox::warning(this,QString::fromLocal8Bit("SYSTEM:"),QString::fromLocal8Bit("FAILED"));}HRESULT hr = m_pRoot.CreateInstance(__uuidof(AgStkObjectRoot));if(FAILED(hr)){QMessageBox::warning(this,QString::fromLocal8Bit("SYSTEM:"),QString::fromLocal8Bit("FAILED"));}enableControl=false;}QSTKEarth::~QSTKEarth(){m_pRoot.Release();m_app.Release();//::CoUninitialize();}void QSTKEarth::NewScenario(){Q_ASSERT(m_app!=NULL);STKXLib::IAgSTKXApplicationPtr pSTKXapp(m_app);pSTKXapp->ExecuteCommand("Unload / *");pSTKXapp->ExecuteCommand("New / Scenario ScenOne");enableControl=true;}void QSTKEarth::LoadScenario()//加载场景{Q_ASSERT(m_pRoot!=NULL);m_pRoot->CloseScenario();m_pRoot->LoadScenario(_bstr_t("..\\data\\Scenario1.sc"));enableControl=true;}void QSTKEarth::PauseSTK(){if(enableControl){Q_ASSERT(m_app != NULL);STKXLib::IAgSTKXApplicationPtr pSTKXapp(m_app);pSTKXapp->ExecuteCommand("Animate * Pause");// pSTKXapp->Pause();//也可以直接调用类成员函数}}void QSTKEarth::FasterSTK(){if(enableControl){Q_ASSERT(m_app != NULL);STKXLib::IAgSTKXApplicationPtr pSTKXapp(m_app);pSTKXapp->ExecuteCommand("Animate * Faster");}}void QSTKEarth::SlowerSTK(){if(enableControl){Q_ASSERT(m_app != NULL);STKXLib::IAgSTKXApplicationPtr pSTKXapp(m_app);pSTKXapp->ExecuteCommand("Animate * Slower");}}void QSTKEarth::ResetSTK(){if(enableControl){Q_ASSERT(m_pRoot != NULL);STKObjects::IAgAnimationPtr pAnimation( m_pRoot );pAnimation->Rewind();}}void QSTKEarth::UnloadStkScence()//卸载场景{Q_ASSERT(m_app!=NULL);STKXLib::IAgSTKXApplicationPtr pSTKXapp(m_app);pSTKXapp->ExecuteCommand("UnloadMulti / */Satellite/*");pSTKXapp->ExecuteCommand("UnloadMulti / */Missile/*");pSTKXapp->ExecuteCommand("Unload / *");enableControl=false;}
  • UI

  • 拖入此组件,然后双击。图我不贴了,如果像上面第一位博主一样的话,恭喜你成功了,如果和第二位博主一样,我这里详细介绍一下。

  • 打开注册表

  • 查找AGI Globe Control 12,我这里搜索的是12,按自己版本号。

    复制自己这个名字STKX12.VOControl, 版本11可能搜索到的很长的名字,一样复制下来即可。

    普通文本编辑器打开ui

    下面第一个是3d的,第二个是2d map,我这里没有做2d的控件,以防下次使用,先放这里。

    <property name="control" stdset = "0"><string>STKX12.VOControl</string></property> <property name="control" stdset = "0"><string>STKX12.2DControl</string></property>

    多了3行代码手动输进去。string标签自己的名字。

    5 按钮事件

    #include "mainwindow.h"#include "ui_mainwindow.h"#include "qstkearth.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ui->setupUi(this);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_pushButton_clicked(){QSTKEarth *m_stkEarth = &QSTKEarth::getInstance();m_stkEarth->NewScenario();}

    ok,到这里就结束了。到这里如果可以运行出stkEngine,然后点击按钮就可以出现stk 3d模块了。

    1.如果你出现了一大堆错误请查看include的顺序

  • 如果你是LNG2019 不可解析的外部符号

  • 尝试在pro文件中添加

    CONFIG += c++11 qaxcontainer

  • 还有错误请在构建中清除项目-重新qmake-再次构建就没有错误了。

  • 3.拖动更改QAxWidget控件都会让ui文件改变,如果你发现运行之后找不到控件,请再次看一下ui文件的文本模式,加上3行代码。

  • 最后就欣赏连接的喜悦!!!有问题评论讨论,博主也正在学习欢迎讨论后续知识。

  • 需要做网站?需要网络推广?欢迎咨询客户经理 13272073477