也就是说,你只要构建了一个查询字符串,传入这个方法,就能实现查询了。很简单吧。arcgis二次开发上一次的属性表格功能的实现中,我讲到把QGis的属性表格直接引入我们的工程中使用的方法。为它添加这个属性表查询的功能,就直接复制代码,改一下就可以了,没有比这更容易的了。
单独说一下这个东西,因为如果直接使用QGis的这个窗口,还需要一点配置才能运行。
首先,在QGis源码中找到 “qgpressionbuilder.ui”这个文件,在 “src/ui”目录下。将这个文件复制到我们的工程中,并加载进解决方案。右键编译一下,然后加入实现以下代码展示的slot函数,并绑定到相应的触发按钮上。
void qgis_devattrtableDialog::filterExpressionBuilder()
{
// Show expression builder
QgsExpressionBuilderDialog dlg( mLayer, mFilterQuery->text(), this );
dlg.setWindowTitle( tr( "Expression based filter" ) );
QgsDistanceArea myDa;
myDa.setSourceCrs( mLayer->crs().srsid() );
myDa.setEllipsoidalMode( qgis_dev::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
//myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );
dlg.setGeomCalculator( myDa );
if ( dlg.exec() == QDialog::Accepted )
{
setFilterExpression( dlg.expressionText() );
}
}
这样看起来就好了,但是运行会报错,说“找不到QSci/qscintilla.h” 这个文件。实际上,这是我们的Qt的一个插件,Qt默认是不会安装的。关于这个插件的作用,大家自己搜索一下。
来手动安装这个插件,只需要从 这里 下载,解压后,打开 Qt 的 Command Prompt

输入以下命令,定位到文件目录
然后分别运行
qmake qscintilla.pro
nmake
nmake install
其中 nmake 是在VS2010中,目录是”C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\“,可以将其加入PATH环境变量。
安装好了以后,会发现Qt的安装目录下面就有了 QSci 的文件夹。
最后再来运行代码就不会有错误了。
本文里面的代码都是尽可能直接使用QGis的源代码来实现功能,但是在业务系统里面,我们应该将功能进行相应的改造。比如一般的用户都不会希望查询的时候跳出一个输入表达式的对话框,会让用户觉得需要写代码,而他不会写也不想写,所以需要用各种条件输入的方式来让用户选择,最后在后台处理时在自己生成查询表达式就好了。
其实看我博客的朋友应该会发现,我写的功能都不是很难实现。对很来说难的地方可能就是看QGis源代码,并进行分析。这个没什么捷径,需要多思考,多想想这些代码下面隐藏的关系,当然,耐心是必需的。如果你都没看过源代码,QGis的二次开发就变得异常难了,因为它没有像Arcgis二次开发那么多的教程。当然这也是我正在做的事情,我希望尽我的努力,趁着我的兴趣,多创造一些入门的基础文档。
有人问我为什么要用QGis做二次开发,Arcgis不是方便很多么,功能也都很完备,教程也丰富,做起来多快啊?这个问题我也不知道怎么回答,现在国内GIS行业使用QGis软件的人都少,更别说二次开发了。
但我刚开始接触QGis的时候,就被它的简洁、优雅、方便打动了,这是Arcgis二次开发之后,突然发现原来可以这么优雅,不用那么庞大的十几个G的库文件。开发的时候只需要简单配置一下,源代码详尽,我可以自由的定制功能。但是说实话,现在还有很多关键技术没有解决,很多技术还不够熟悉,不够成熟,我对行业内部的很多业务流程也不熟悉,这是我没法现在用QGis自己开发什么有创新性的软件的原因。
我不知道我还能坚持学QGis多久,如果工作的琐事太多可能会占据很多时间,而我目前做QGis确实没有给我带来任何看得见的工作上的帮助。但这是我目前的兴趣,我只想趁着兴趣多做一会,免得以后没机会了。
与所有QGis开发者共勉!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-26597-3.html
甚至一天半的