QT调用STK12(STKX模块)

参考自两位博主文章:

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

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

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

  1. QT项目

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

  1. 环境依赖注入

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

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

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

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

  1. 编程

创建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_OBJECT
public:
    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 Object
    HRESULT 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;
}
  1. UI

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

  1. 打开注册表

查找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的顺序

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

尝试在pro文件中添加

CONFIG += c++11 qaxcontainer

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

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

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

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: STK Commu是一种常用的通信软件开发工具包(SDK),它具有丰富的功能和灵活的二次开发能力,可以用于各种通信领域的应用。在STK Commu的二次开发过程中,我们可以根据具体的需求进行定制开发,以实现特定的通信功能。 首先,我们可以利用STK Commu的API接口来实现与其他通信设备的连接和数据交互。例如,我们可以通过SDK提供的接口实现与传感器、终端设备或其他软件的通信,从而获得实时数据或进行远程控制。 其次,STK Commu还具备网络通信功能,可以支持TCP/IP、UDP等常见的通信协议。我们可以利用这些协议进行网络通信的二次开发,实现数据的传输和通信的稳定性。 此外,STK Commu还提供了丰富的数据处理和管理功能。我们可以使用SDK提供的数据处理接口,对接收到的数据进行解析、处理和存储。同时,STK Commu还支持多种数据格式,如JSON、XML等,使得数据的交互更加灵活多样。 在STK Commu的二次开发中,我们还可以根据需求进行界面定制和用户交互设计。通过SDK提供的界面开发工具,我们可以自定义通信软件的界面风格和布局,使其更加符合用户的需求和习惯。 总之,STK Commu作为一款通信软件开发工具包,具备强大的功能和灵活的二次开发能力,可以满足各种通信应用的需求。通过STK Commu的二次开发,我们可以实现与其他通信设备的连接和数据交互、网络通信功能、数据处理和管理以及界面定制等功能,从而开发出更加强大和定制化的通信软件。 ### 回答2: STK COMMU是一款功能强大的通信工具,具备二次开发的潜力。二次开发是指在原有软件基础上进行定制和扩展,以满足用户的特定需求。 对于STK COMMU的二次开发来说,首先需要了解其提供的功能和接口。通过查阅官方文档或联系软件开发商,可以获取相关资源和技术支持。 在二次开发过程中,我们可以通过编写插件或使用软件开发工具包(SDK)来实现定制化的功能。例如,插件可以增加新的通信协议、改进用户界面、增加数据分析功能等。 此外,我们还可以利用STK COMMU提供的API(应用程序接口)进行开发。API是一组预定义的函数和协议,可以帮助我们与软件进行交互。通过API,我们可以实现与其他软件的集成、数据传输、自动化控制等功能。 对于开发人员来说,具备一定的编程知识和技能是必要的。常见的编程语言如Python、Java、C++等都可以与STK COMMU进行集成。通过编写代码,我们可以进行高度的定制和扩展,以满足特定的需求和业务流程。 总之,STK COMMU的二次开发为用户提供了很多定制化的可能性。通过插件、SDK、API等手段,我们可以为用户量身定制通信工具,扩展其功能和性能,满足其特定的需求。这不仅提高了软件的灵活性和适用性,也促进了更广泛的应用和创新。 ### 回答3: stk commu二次开发是指在原有的stk commu软件基础上进行修改和扩展的开发工作。stk commu是一款用于通信协议仿真和分析的软件,通过对通信协议的建模和仿真,可以帮助用户测试和优化通信系统的性能。 在进行stk commu二次开发时,我们可以根据用户的需求来进行功能定制和改进,以满足特定的应用场景。可能的二次开发方向包括但不限于: 1. 新增通信协议支持:根据需要,可以扩展stk commu的协议库,使其支持更多的通信协议,如蓝牙、WiFi、LTE等。 2. 用户界面定制:可以根据用户的习惯和需求,进行界面的定制和优化,使其更符合用户的使用习惯和工作流程。 3. 数据分析功能增强:可以增加一些数据分析功能,如数据可视化、统计分析等,方便用户获取对通信系统性能的更全面和准确的认识。 4. 集成其他工具和平台:可以将stk commu与其他常用的工具和平台进行集成,如MATLAB、Python等,以便更方便地进行数据分析和算法验证等工作。 5. 性能优化和bug修复:可以对stk commu进行性能优化和bug修复,以提升软件的稳定性和可靠性。 在进行stk commu二次开发时,需要了解stk commu的内部架构和功能模块,并根据用户需求进行相应的开发工作。同时,要充分考虑软件的可扩展性和兼容性,确保二次开发的成果能够与原有的stk commu软件相互兼容和无缝集成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值