作者:为梦齐舞
近段时间,有很多客户咨询iObjects C++如何在Qt Creator中进行应用,相比于Visual Studio,在Qt Creator上编译确实多了很多步骤,下面我们来看下如何在Qt Creator上配置并编写代码打开地图。
一、安装Qt Creator,本篇文章中使用的Qt Creator4.1.0版本,安装步骤就不做介绍了。
二、新建一个Qt的工程
1、新建工程,选择Qt Widgets Application,点击下一步。
2、输入工程名称,点击下一步
3、选择合适的构建套件,我这里选择添加的4.8.6套件
后面直接点击下一步,直到工程创建完成。
三、配置iObjcets C++环境
1、配置UGUNICODE编码方式,此项必须配置,否则将出现打开工作空间失败、打开数据源失败、编译出错等情况。
DEFINES += _UGUNICODE
2、配置附加包含目录
INCLUDEPATH += “.”
INCLUDEPATH += “D:/SuperMapSoftware/iObjects C++/SMO_CPP_810_14025_57626_Win/include”
INCLUDEPATH += “D:/SuperMapSoftware/iObjects C++/SMO_CPP_810_14025_57626_Win/include/private”
3、配置输出目录
DESTDIR = "D:/SuperMapSoftware/iObjects C++/SMO_CPP_810_14025_57626_Win/bin/bind
4、配置附加库目录
LIBPATH = “D:/SuperMapSoftware/iObjects C++/SMO_CPP_810_14025_57626_Win/lib/libd”
5、配置附加依赖项
LIBS +=-lSuToolkitd
-lSuElementd
-lSuOGDCd
-lSuBased
-lSuWorkspaced
-lSuSpatialIndexd
-lSuEngined
-lSuGraphicsd
-lSuMapd
-lSuChartBased
-lSuBase3Dd
-lSuGeometryd
-lSuMapEditord
-lSuStreamd
-lSuAlgorithmd
-lSuProjectiond
-lSuGeoOperationd
-lSuSymbold
-lSuDrawingd
-lSuFileParserd
-lSuRepresentationd
-lSuChartToolkitd
-lSuTopoBased
-lSuEngineOGDCd
-lSuNetToolkitd
-lSuTopoBuilderd
-lSuSpatialQueryd
-lSuEngineImagePlugind
-lSuGeneralizationd
-lSuGraphics3Dd
-lSuParticleSystemd
-lSuGridModelingd
-lSuOverlayd
-lSuDataCheckd
-lSuGeometry3Dd
-lSuCompactFiled
-lSuSceneEditord
-lSuScened
-lSuRenderd
-lSuLayer3DDatasetd
到此为止重要的配置项,就配置完成了,具体配置文档请参加后面Demo中的pro文件。
四、编写代码打开地图
1、我们新建一个类,来专门用于打开地图的操作,命名为qmapcontrol
2、让qmapcontrol继承QWidget
class QMapControl:public QWidget
3、编写代码用于打开地图。
a 、重写paintEvent方法,用于绘制图像
void QMapControl::paintEvent(QPaintEvent *event)
{
if(isNeedOnDraw)
{
isNeedOnDraw=false;
UGGraphics* pGraphics = NULL;
CreateUGGrpaphics(pGraphics);
UGRect rcInvalid(0, 0, m_width, m_height);
m_pMapEditorWnd->OnDraw(pGraphics, rcInvalid, rcInvalid, false, false);
ReleaseUGGraphics(pGraphics);
}
PaintToQPainter();
}
1)其中m_width/ m_height通过初始化qmapcontrol时进行赋值:
QMapControl::QMapControl()
{
m_width = this->width();
m_height = this->height();
m_pQimage = NULL;
isNeedOnDraw=false;
this->Init();
}
2)其中CreateUGGrpaphics为创建Grpaphics绘图对象:
void QMapControl::CreateUGGrpaphics(UGGraphics *&pGraphics)
{
pGraphics=UGGraphicsManager::NewGraphics();
pGraphics->CreateCompatibleGraphics(NULL, m_pMapEditorWnd->m_mapWnd.m_Map.IsGraphicsAlphaEnable());
m_pOldImage = pGraphics->SelectImage(m_pMapImage);
}
3)其中ReleaseUGGraphics为释放绘图对象:
void QMapControl::ReleaseUGGraphics(UGGraphics *&pGraphics)
{
pGraphics->SelectImage(m_pOldImage);
delete pGraphics;
pGraphics = NULL;
}
4)其中PaintToQPainter是将图像绘制到Qt的界面上:
void QMapControl::PaintToQPainter()
{
m_pQimage = new QImage((UGC::UGbyte*)m_pMapImage->GetColors(), m_width, m_height, QImage::Format_ARGB32);
QPainter paint;
paint.begin(this);
QColor backGound(255, 255, 255);
paint.fillRect(0, 0, m_width, m_height, backGound);
paint.drawImage(QRectF(0, 0, m_width, m_height), *m_pQimage);
paint.end();
if (m_pQimage != NULL)
{
delete m_pQimage;
m_pQimage = NULL;
}
}
b、重写resizeEvent方法,用于在窗体大小发生变化时,及时调整地图
void QMapControl::resizeEvent(QResizeEvent *event)
{
m_width = this->width();
m_height = this->height();
m_pMapEditorWnd->OnSize(NULL,UGRect(0, 0, m_width, m_height));
m_pMapImage = UGGraphicsManager::NewImage();
m_pMapImage->CreateCompatibleImage(NULL, m_width, m_height);
this->Invalidate();
}
c、封装一个打开地图和关联工作空的方法:
bool QMapControl::openMap(UGString mapName)
{
if(m_pmap->Open(mapName))
{
this->Invalidate();
return true;
}
return false;
}
void QMapControl::SetWorkspace(UGWorkspace *workspace)
{
m_pmap->SetWorkspace(workspace);
}
d、在mainwindow文件中添加空间,调用打开地图的方法即可。
void MainWindow::openWorkspace()
{
QString qStrPath = QFileDialog::getOpenFileName(this,QString::fromUtf8("打开工作空间"), "../SampleData", tr("smwu(*.smwu)"));
UGWorkspace *p_mWorkspace=new UGWorkspace();
UGWorkspaceConnection p_mWorkspaceConnection=UGWorkspaceConnection();
p_mWorkspaceConnection.m_strServer=QStringToUGString(qStrPath);
p_mWorkspaceConnection.m_nWorkspaceType=9;
if(!p_mWorkspace->Open(p_mWorkspaceConnection))
{
QMessageBox::critical(this,"ERROR",QString::fromLocal8Bit("打开工作空间失败"));
return;
}
qmapControl->SetWorkspace(p_mWorkspace);
qmapControl->openMap(p_mWorkspace->m_MapStorages.GetNameAt(0));
}
到此为止就可以顺利的打开地图,进行浏览了。
五、后续再代码中还扩展了地图缩放平移的基本操作功能,有兴趣可以参见示范代码
示范代码下载地址:链接:http://pan.baidu.com/s/1gfdUeYJ 密码:2385