QT下使用MapX控件的问题以及Activex技术

  近期使用MapX控件做了一个GIS项目,因为是在QT中使用,所以用dumpcpp生成了QT下可用的代码,做了一些修改之后,代码在QT中正常运行。

  后来客户提出新的需要,要求显示地图经纬度,但是因为地图上图元移动使用的单位是公里,所以之前把地图的NumericCoord的单位设置为了miUnitKilometer,而Mapx并不支持两种坐标系统同时使用。

  初期的思路如下:

  1.监听鼠标移动事件,获取到屏幕坐标XY

  2.将屏幕坐标XY转换为地图坐标,单位为公里

  3.将公里转换为经纬度

  问题主要出现在第二步,调用MapX的ConvertCoord时,提示Type MisMatch,函数原型为

  void ConvertCoord(double& ScreenX, double& ScreenY, double& MapX, double& MapY, int Direction);

  参数给的也是正确的,使用DynamicCall之后仍然出现同样的错误。无奈之下,参照QT的源码,直接使用queryInterface获取IDispatch接口,用IDispatch的Invoke接口调用,仍然提示Type Mismatch错误。

  后来查看了下VC的Mapx的cpp文件,发现里面代码如下:

  

void CMapX::ConvertCoord(float* ScreenX, float* ScreenY, double* MapX, double* MapY, short Direction)
{
	static BYTE parms[] =
		VTS_PR4 VTS_PR4 VTS_PR8 VTS_PR8 VTS_I2;
	InvokeHelper(0x22, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
		ScreenX, ScreenY, MapX, MapY, Direction);
}
   使用的是InvokeHelper函数,再查一下,发现COleDispatchDriver有InvokeHelper成员,引入了MFC库后,COleDiapatcherDriver绑定IDispatch接口,调用InvokeHelper后,调用成功,终于解决了activex控件在QT中的最麻烦的问题,我看stackoverflow上也有很多类似的问题,大多是采用dynamicCall+QVariantList的调用方式,但是那种方式并没有解决我的问题。

   QT实现的Activex兼容技术还是有缺陷的,适当的时候还是需要引入原生的COM来进行activex控件方法的调用,不能超出了QT平台之外,就束手无策了。

   最后贴上代码:

   

IDispatch* map_itf = NULL;
map_ctrl_->queryInterface(IID_IDispatch,(void**)&map_itf);

if(map_itf)
{
    COleDispatchDriver driver(map_itf,FALSE);

    static BYTE parms[] =
        VTS_PR4 VTS_PR4 VTS_PR8 VTS_PR8 VTS_I2;

    driver.InvokeHelper(0x22, DISPATCH_METHOD, VT_EMPTY, NULL, parms,
        &screen_x, &screen_y, &map_x, &map_y, miScreenToMap);
}

QT是一个跨平台的C++图形用户界面应用程序开发框架,非常适合用于开发GUI界面应用程序。而MapX则是QT中的一个地图控件,它提供了丰富的地图相关功能,包括地图的显示、标记、测量、搜索等。 想要学习和使用QT中的MapX教程,可以按照以下步骤进行: 1. 首先,确保你已经安装了QT开发环境。可以从官方网站上下载并安装QT的最新版本。 2. 在QT的官方网站上,可以找到MapX的官方文档和教程。根据你的需求和兴趣,选择适合你的教程进行学习。 3. 在MapX教程中,你可以学习如何在QT使用MapX控件,并了解其基本的属性和方法。例如,你可以学习如何在界面上显示地图,如何添加标记点,如何获取地图上的点击事件等等。 4. 在学习过程中,可以通过实践和编写简单的示例代码来巩固所学的知识。通过编写小项目,可以更好地理解和应用MapX的功能。 5. 在教程中,还可以学习到MapX的高级功能,如地图的缩放、平移,地图的搜索和定位,地图的路径规划等等。 6. 在学习过程中,如果遇到问题或者需要进一步的帮助,可以参考MapX的官方文档、官方论坛或者通过网络搜索来获取解答。 总结来说,学习和使用QT中的MapX教程需要具备一定的C++语言基础和QT开发环境的安装配置。通过系统地学习和实践,可以掌握MapX的基本使用方法,并能够根据需求开发出功能丰富的地图应用程序。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值