Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3515756
  • 博文数量: 864
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10634
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(864)

文章存档

2023年(1)

2021年(1)

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: C/C++

2010-11-12 13:10:23

1.某些插件无法载入, 初学者最可能遇到的情况是插件没有和应用程序一起打包发布, 导致Qt程序找不到插件进而影响到程序的功能(如图片格式不支持, 数据库打不开等); 另外还有一些不太容易想到的情况也会导致插件无法载入, 本文就着重讨论这方面的内容。

情况一: 插件依赖的库找不到

比如以前有人在论坛上问的, 编译oracle数据库的插件成功了, 但运行的时候总是报无法载入, 这就是因为插件链接了oracle数据库提供的共享库, 该库必须也放在搜索路径中。 在Windows下可以放在应用程序所在目录。 用dependencywalker工具可以检查程序的依赖(见前面的blog); linux下可以放在系统默认的搜索路径(如/usr/lib), 或用LD_LIBRARY_PATH环境变量来指定额外的搜索位置。 Linux下的ldd命令可以检查程序或库链接的情况。

情况二: 底层库、应用程序和插件编译环境有差别

这个错误也是初学者经常会犯的。 举个例子, windows下Qt库用mingw编译, 插件用了vs2005编译, 这样肯定是不行的。 甚至都用vs2005编译, 一个用sp1另一个用sp2也会遇到问题, 一定要保证编译环境和运行环境的一致; Linux下则更极端一些, 因为每个linux的发行版都可能使用不同的编译器和不同版本的底层库, 不兼容的可能性要大得多, 你在某个发行版上编译的东西有至少50%的可能性在其他发行版上无法正常运行, 所以各位要特别注意。  顺便提个嵌入式开发时经常有人犯的错误, 一般情况下开发板提供商会提供开发人员编译好的rootfs和toolchain, 要注意编译qt及其他应用的toolchain必须和编译rootfs内容的toolchain兼容(最好一样), 不然怎么死的都搞不清楚。

情况三: 使用vs2005编译的库要绑定manifest文件

要把Qt库的manifest文件放在应用程序目录。 Qt的插件会将manifest文件内嵌在插件中, 所以在发布插件的时候要修改一下pro去掉这个嵌入, 不然也可能会造成问题。 去掉manifest嵌入的方法是在插件的pro里加入下面的内容:

CONFIG-=embed_manifest_dll

插件载入不成功的情况比较多, 对于初学者来说想快速诊断很不容易。 Qt官方提供了一个小工具可以检测插件的载入情况并报告错误, 大家遇到问题的时候可以用这个工具试试, 比自己瞎琢磨要快多了。

下载地址:plugintester-gif.tgz

2.使用VNC作为Qt-Embedded应用的输出

要让VNC工作,需要一个server端,和一个client端。server端提供要被显示的内容,而client端通过网络接收server端 的内容将其显示出来。很明显我们的嵌入式设备上的Qt-Embedded应用输出是server,而我们的Linux主机是client

client端的工具,我们可以选择安装vnc4viewer,在ubuntu里安装命令为
$ sudo apt-get install vnc4viewer
而运行命令是
$ xvncviewer localhost:0
不过先别着急运行这个命令,如果你此时运行,你会得到”unable to connect to host: Connection refused (111)”这样的错误,因为server还没起来呢。

下面我们来看在嵌入式设备上怎么启动我们的vnc server.很简单,命令如下:
$ ./app -qws -display VNC:0
此处可能会出现错误”VNC: driver not found”,这是因为你在编译的时候没有把gfxdriver的vnc支持加进去,重新编译一下vnc的插件就行了。到你的src/plugins /gfxdrivers/vnc目录下,输入命令qmake,make install就可以了。然后重新运行
$ ./app -qws -display VNC:0
vnc server也就运行起来了,后面的这个数字0是可变的,你喜欢写哪个数字都可以,只不过在vnc client访问的时候要和这个数字保持一致。此时再去你的host端运行xvncviewer就能看到你在嵌入式端的应用界面了。

总结:总共分两步
1) 在嵌入式端运行 ./app -qws -display VNC:0
注意点:gfxdriver的vnc支持一定要有
2) 在Linux主机端运行 xvncviewer localhost:0
注意点:因为我这是在一台机器上测试,如果通过网络localhost应该换成嵌入式设备的IP. 后面的数字两边应该保持一致

3.利用QtMobility中的Location API获得位置信息

因为QtMobility是独立于Qt的一个模块,如果想在代码中使用QtMobility则需在.pro文件中加入下面的代码

CONFIG += mobility
MOBILITY = location bearer

第一行将QtMobility进行了使能。
第二句则将定位功能和网络连接管理(某些定位方法需要网络支持)加入编译。

除此之外,如果是Symbian系统还需为工程增加相应的几个签名能力,在.pro中加入下面内容
symbian {
TARGET.CAPABILITY += NetworkServices Location ReadUserData
}

要取得位置信息,则需要有一个位置信息提供源QGeoPositionInfoSource,该信息源可以通过下面函数获得
QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this);
每当位置信息发生变化时,QGeoPositionInfoSource都会发送一个位置更新的信号 SIGNAL(positionUpdated(QGeoPositionInfo)),QGeoPositionInfo中包含了经纬度和精确度等一些 信息,我们只需将该信号关联到我们的slot函数中,对数据做进一步处理即可。
connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),this, SLOT(positionUpdated(QGeoPositionInfo)));

这里是我的一个非常简单源码geoinfo,将获得的坐标信息显示在标签上,在N97上测试成功。

要保证测试成功,需要在N97上做的一点设置。
1. 如果在室外的话,不用做改动,一会就能获得数据。
2. 如果在室内做测试,需要在另外一个叫”定位“的应用中,将定位方法中的”A-GPS”和”GPS”禁止掉,只保留”使用网络定位“,则很快能够获得数据。

4.QPlainTextEdit获得当前光标行的行号

QTextCursor tc = edit->textCursor();//当前行的光标
QTextLayout* lo = tc.block().layout();
//get the relative position in the block
int pos = tc.position() – tc.block().position();//当前光标在本block内的相对位置
int line = lo->lineForTextPosition(pos).lineNumber() + tc.block().firstLineNumber();//用block的text layout计算光标在本block的行号, 需要传入光标相对于block的位置
qWarning() << line;

5.Qt使用ActiveX控件

Qt使用ActiveX控件的方法这里不再介绍,具体请参考:

http://blog.csdn.net/tingsking18/archive/2010/03/22/5403038.aspx

问题1:

通过Qt调用ActiveX控件,一般是把IDispatch*或者是IKnown* 封装成QAxObject,然后再调用 querySubObject或者dynamicCall方法。但是当调用dynamicCall方法的时候需要传入一个 IDispatch*或者是IKnown*的时候我们该怎么办呢?可以调用QAxObject的asVariant()方法, 将这个COM对象装换为QVariant。例如:

SetSourceData函数的原型是:

void SetSourceData(^ Source, Object^ PlotBy);

我们要这样调用: QAxObject * range = worksheet->querySubObject("Range(\"A1:H1\")"); activeChart->dynamicCall("SetSourceData(QAxObject*,int)",range->asVariant(),1); 问题2: 除了使用QAxObject方法来调用ActiveX还有什么其他的办法么?QAxObject使用起来太麻烦了。        如果不想这样做还可以QAxWidget还为我们提供了QueryInterface方法,和用VC调用基本差不多了。 例如: IWebBrowser2 *webBrowser = 0; activeX->queryInterface(IID_IWebBrowser2, (void *)&webBrowser); if (webBrowser) {      webBrowser->Navigate2(pvarURL);      webBrowser->Release(); }

阅读(2591) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

A_number__12011-05-31 10:23:44

学习!