返回介绍

QT调用控件COM接口方法说明

发布于 2023-08-09 23:10:34 字数 3684 浏览 0 评论 0 收藏 0

1. 创建一个COM组件

 // 比如创建一个MxDrawUiPrEntity
 MxDrawUiPrEntity getEntity;
 // 比如创建一个MxDrawApplication
 MxDrawApplication app;
 
 // 创建之后,就可以直接调用它的函数。
 // 先择一个对象.
 getEntity.setMessage("select entity:");
    if(getEntity.go() != 1)
        return;

2. 得到返回的COM接口对象的使用.

函数接口返回的COM接口对象,都是I开头,比如:IMxDrawPoint*

注意:这时调用I开头的COM接口对象函数,属性时,不要直接使用函数,属性访问,可能会出错(QT的原因)。

得到属性使用:property, property返回QVariant,修改属性使用setProperty

调用方法使用:querySubObject, querySubObject返回 QAxObject, QAxObject转到QVariant:pPoint->asVariant()

  IMxDrawEntity* pEnt = getEntity.Entity();
  
  // 如下调用会出错.
  QString sName = pEnt->objectName()
  // 正确调用.
  QString sName = pEnt->property("ObjectName").toString();
  
  // 同理调用函数,使用querySubObject,不要直接调用;
  // 比如.
  IMxDrawPoint* pClosestPoint = (IMxDrawPoint*)(pEnt->querySubObject("GetClosestPointTo2(QVariant,bool)",pPoint->asVariant(),1));

3.如下例子,让用户选择一个对象,然后,点取一个点,得到点到PL线的最近点,和求导数.

void MainWindow::TestSelectEntity()
{
    MxDrawUiPrEntity getEntity;
    getEntity.setMessage("select entity:");
    if(getEntity.go() != 1)
        return;
    MxDrawUiPrPoint getPoint;
    getPoint.setMessage("in pt:");
    if(getPoint.go() != 1)
        return;
    IMxDrawPoint* pPoint = getPoint.value();
    double dX = pPoint->property("x").toDouble();
    IMxDrawEntity* pEnt = getEntity.Entity();
    
    QString sName = pEnt->property("ObjectName").toString();
    if (sName == "McDbPolyline"){
        
        IMxDrawPoint* pClosestPoint = (IMxDrawPoint*)(pEnt->querySubObject("GetClosestPointTo2(QVariant,bool)",pPoint->asVariant(),1));
        double dX2 = pClosestPoint->property("x").toDouble();
        IMxDrawVector3d* pVec = (IMxDrawVector3d*)pEnt->querySubObject("GetFirstDerivEx(QVariant)",pClosestPoint->asVariant());
        if(pVec != NULL)
        {
            QString st;
            st.sprintf("vec:%f,%f,%f",
                          pVec->property("x").toDouble(),
                          pVec->property("y").toDouble(),
                          pVec->property("z").toDouble()
                         );
           qDebug() << st;
        }
    }
}

4. 控件方法调用

控件对象方法调用,可以使用dynamicCall,querySubObject调用。

dynamicCall返回的是QVariant,函数返回的是一个普通值用它调用

querySubObject返回的是QAxObject,函数返回的是一个COM 接口对象使用它调用。

COM组件对象转成QVariant转递.

// 如下 :
MxDrawMcCmColor cloro;
cloro.SetRGB(0, 0, 255);
newLayer->setProperty("Color",cloro.asVariant());
// 下面代码,创建一个图层,并设置图层的颜色
void MainWindow::on_pushButton_clicked()
{
    // 增加图层. 得到图层id.
    qlonglong id = ui->axWidget->dynamicCall("AddLayer(const QString&)", "蓝色图层").toLongLong();
    // 使用接口。得到数据接口。
    MxDrawDatabase *database = (MxDrawDatabase *)ui->axWidget->querySubObject("GetDatabase()");
    // 得到图层接口.
    MxDrawLayerTableRecord * newLayer = (MxDrawLayerTableRecord *)database->querySubObject("ObjectIdToObject(qlonglong lId)", id);
    // 修改新增加图层颜色,
    // 创建颜色组件.
    MxDrawMcCmColor cloro;
    cloro.SetRGB(0, 0, 255);
    //IMxDrawMcCmColor* pcolor = ( IMxDrawMcCmColor* )cloro.qObject();
    // qt原因,SetColor不管作用.
    //newLayer->SetColor(pcolor);//这一行没有执行成功,图层颜色没变化
    // 要使用这个方法.
    newLayer->setProperty("Color",cloro.asVariant());
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文