Posts Tagged ‘example’

利用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”禁止掉,只保留”使用网络定位“,则很快能够获得数据。

Read More...

Tags: , ,
Posted on July 28th, 2010 in Qt技术, s60 | No Comments ».

计算和绘制QPlainTextEdit的行号

在Qt的example里有个例子叫做codeeditor:
http://doc.qt.nokia.com/4.6/widgets-codeeditor.html

该例子演示QPlainTextEdit类的用法, 其中有个有用的功能是在编辑器的左边margin的位置显示行号。 查看它的代码就会发现, 它用的时候遍历QTextBlock的方法确定行号, 这样就带来一个问题, 也就是实际上显示的所谓“行号”其实是段落号。 这在大多数情况下没什么问题, 但遇到某些bt用户非要狂按“Shift+Enter”问题就来了。
在Qt的文档中可以找到对“Shift+Enter”和“Enter”行为的准确定义:

InsertParagraphSeparator
Enter
Enter
Enter
Enter
(none)

InsertLineSeparator
Shift+Enter
Meta+Enter
Shift+Enter
Shift+Enter
(none)

所以按下“Shift+Enter”和按下“Enter”结果是不同的。 这种不同从外表看不出来, 但和codeeditor中实现显示行号的代码结合一下, 就明白无误了。
解决的方法比较曲折(当然可能有更好的方法等着大家去探索), 除了要遍历每个block, 还要用QTextBlock的方法去遍历每个QTextLine。 另外一个让人头疼的地方是还要计算出每行的y坐标, 好在合适的地方画上这个行号。 多说无益, 代码说话:

QTextBlock block = document()->begin();
int top = 0;
QTextCursor cursor(block);
cursor.setPosition(0);//move to the beginning of the document
qWarning() << document()->lineCount() << document()->blockCount();
int linenum = 0;
while(linenum < document()->lineCount())
{
for( int i = 0 ; i < block.lineCount(); i ++)
[...]

Read More...

Tags: , , ,
Posted on July 6th, 2010 in C++, Qt技术 | 4 Comments ».

formExtractor: 在QtWebkit的javascript访问QObject的例子

现在写这个题目晚了点, QtWebkit一度是个比较火的话题(当然目前仍然很火), 这个formExtractor应该是在4.5的时候就存在于Qt的例子里了(QTDIR/examples/webkit/formextractor), 只是仔细看过这个例子的人估计还比较少。 这里简单分析一下这个例子, 算是给做webkit开发的人提供个扫盲性质的指导。
闲话少说, 先来看一个formExtractor的截图。

相关文件包括:
formextractor.pro
formextractor.ui
formextractor.h
formextractor.cpp
main.cpp
mainwindow.h
form.html
formextractor.qrc
整个程序的基本界面是用Designer设计的formextractor.ui文件,  左边白色背景的部分放了个QWebView, webview里显示的内容是一个html页面, 里面放了一个form;右边是普通的QWidget, 里面放了若干QLabel、QLineEdit等控件。 formextractor.cpp/.h是ui文件对应的窗体类, 用的是单继承的方式。 (关于如何在Qt程序中使用ui文件, 参考以前的blog文章:Qt4中ui文件的使用方法)

Read More...

Tags: , , , ,
Posted on April 26th, 2010 in C++, Qt技术 | 2 Comments ».

在Qt Symbian中如何修改手机的软键(softkey)

在做手机应用的时候经常会要碰到修改手机屏幕上软键显示的问题,比如想把”退出”改为”返回”,”取消”等,同时也改变选中该软键时的行为,不是标准的退出应用。
Nokia论坛上有一篇文章Change_SoftKey_labels_of_widget_in_Qt 介绍了在Symbian Qt中如何处理这个问题,不过该文介绍的方法只适合Qt-4.6以前的版本,因为Qt-4.6以后的版本没有了文章所说的QWidget::setSoftKeys(), 改由另外的机制来实现。
Qt-4.6以后的版本使用QAction::setSoftKeyRole(SoftKeyRole softKeyRole),SoftKeyRole可用的值有Action::NoSoftKey,QAction::PositiveSoftKey,QAction::NegativeSoftKey,QAction::SelectSoftKey分别代表没有映射,左键,右键和中键。软件上的文字则有QAction中的文本来确定。软键的内容变化由当前获得焦点的Widget的QAction来确定,当然需要该QAction要执行setSoftKeyRole才能关联到软键上:)
下面是一段不长的代码,演示了如何修改手机软键
#include
class Widget:public QWidget{
public:
Widget(QWidget *parent);
};
int main(int argc,char *argv[]){
QApplication app(argc,argv);
QMainWindow mw;
Widget *w=new Widget(&mw);
mw.setCentralWidget(w);
mw.showMaximized();
return app.exec();
}
Widget::Widget(QWidget *parent):QWidget(parent){
QVBoxLayout *layout=new QVBoxLayout(this);
QPushButton *helloqt=new QPushButton(“Hello Qt”,this);
QAction *actI=new QAction(QObject::tr(“Qt”),this);
actI->setSoftKeyRole(QAction::PositiveSoftKey);
helloqt->addAction(actI);
QPushButton *hellomaemo=new QPushButton(“Hello Maemo”,this);
QAction *actII=new QAction(QObject::tr(“Maemo”),this);
actII->setSoftKeyRole(QAction::SelectSoftKey);
hellomaemo->addAction(actII);
QPushButton *hellos60=new QPushButton(“Hello S60″,this);
QAction *actIII=new QAction(QObject::tr(“S60″),this);
actIII->setSoftKeyRole(QAction::NegativeSoftKey);
hellos60->addAction(actIII);
layout->addWidget(helloqt);
layout->addWidget(hellomaemo);
layout->addWidget(hellos60);
layout->addStretch();
}
根据当前选了不同按钮,可以看到软键上显示的信息在变化,大家去试的时候可能会发现SelectSoftKey没起作用,应该是系统没有使能MSKEnabled()的原因。

Read More...

Tags: , , ,
Posted on March 25th, 2010 in Qt技术, s60 | 2 Comments ».

如何发布基于Maemo5的Qt程序(打包.deb格式)

鉴于Qt良好的跨平台特性,想要将Qt程序编译移植到Maemo平台上,一般都不会遇到太大问题。
关于怎么安装Maemo开发环境请参考CuteQt网站Maemo相关文章,如果你是Linux用户则有更简单的方法,到Nokia论坛去下载最新版的SDK安装程序,是PythonQt界面的,一口气点确认和下一步就可以。
本文关心的主题是怎么将Qt写的应用程序打包成Maemo的deb格式,方便其他人下载和安装。因为Qt的编译系统是利用自有的qmake,和传统GNU automake的方式不太一样,所以有些细节的地方需要注意。下面我们就以Qt的例子应用wiggly为例,一步步来看如何制作Qt的.deb包。(本文操作环境:Maemo5 SDK的ScratchBox环境中)。
1.先建一个空白的编译目录
目录名要求是包名加版本的格式,那么我么建立一个wiggly-3.23的格式(3.23是google离开拆拿到日子,嗯呐)。
2.利用dh_make建立基本的控制文件
进入wiggly-3.23执行以下命令:
DEBFULLNAME=”Cute Qt” dh_make –createorig –single -e cuteqt@cuteqt.com -c gpl
如果你的系统里没有dh_make,需要将”dh-make”的软件包装上,以上命令DEBFULLNAME用于指定发布者的名字,–single是指编译的是当个应用,-e后面加发布者的电子邮件地址,-c后面指的是软件的发布模式,这里指的是GPL. 执行以上命令后可以看到在当前目录下多出来一个debian目录,debian目录下有一些debian工具打包时要用到的文件,暂时跳过。
3.将含源代码的wiggly目录加入编译目录
此时,我们的目录机构应该是主目录下有两个子目录,分别为wiggly-3.23/debian和wiggly-3.23/wiggly,前者包含编译控制文件,后者包含源代码。
4.在wiggly-3.23增加一个top.pro文件
文件内容为
QMAKEVERSION = $$[QMAKE_VERSION]
ISQT4 = $$find(QMAKEVERSION, ^[2-9])
isEmpty( ISQT4 ) {
error(“Use the qmake include with Qt4.4 or greater, on Debian that is
qmake-qt4″);
}
TEMPLATE = subdirs
SUBDIRS = wiggly
前面部分通过qmake版本测得Qt是否为qt4以上版本,后面部分指定子目录,这也是在创建你自己的工程时,根据你的代码目录需要改动的地方。

Read More...

Tags: , , ,
Posted on March 24th, 2010 in Linux技术, Qt技术 | No Comments ».

Qt的多线程之一 — 后台创建缩略图的例子(附例子)

关于多线程可讲的东西实在太多了,从多线程本身的概念,到Qt的多线程相关的类, 再到多线程编程相关的内容,方方面面, 不是一两篇贴子能讲明白的。 笔者准备尽我所能写一些通俗易懂的文章, 介绍一下和Qt多线程相关的内容, 争取写上几篇凑成一个系列(但不保证会写几篇,按照笔者的懒惰程度,也许第二篇永远不会面世也不一定…)。 本来开篇的帖子应该八一八多线程概念性的东西,不过为了应景,先来一个使用Qt多线程创建缩略图的小例子。
起因是在qtcn上看到有人说创建缩略图的API执行很慢,并且阻塞了gui的正常运转,需要改成多线程来实现, 但他不清楚如何实现,希望能有个例子。 这位同学的问题揭示了Qt里最需要用到多线程的一个用例,那就是防止一切阻塞GUI线程的操作。 Qt GUI编程有个最基本但很多人不熟悉的原则是所有的操作都不能是阻塞的, 同时所有的操作都不能占用很多CPU, 这个原则是针对GUI线程来说的, 但后者对子线程也同样适用(这一点我们后边继续八)。

Read More...

Tags: , , , ,
Posted on July 7th, 2009 in Qt技术 | 7 Comments ».

在Qt里使用一个图片文件存储多个icon图标(附源码)

因为icon图像一般都很小,大部分16×16的或者32×32的,在存储成文件的时候反而文件头占的空间比图像的内容要多,所以一般都会选择将多个图标合成到一个文件里,然后在应用里读取对应的图标。下面是一个由多个16×16的图标组合出来的图片

要在Qt中读取相应的图标,有一个很简单的函数可以实现该功能
QPixmap QPixmap::copy ( int x, int y, int width, int height ) const
只要设置好坐标和大小就能很方便的取得子图像,比如copy(0,0,16,16)可以取得上面的左边第一个图标,copy(16,0,16,16)取得第二个图标。我写了一个简单的程序去演示这个功能,用不同的图标设置不同按钮的背景

Read More...

Tags: , , ,
Posted on June 21st, 2009 in Qt技术 | 1 Comment ».

使用Qt作窗口截屏(含源码)

截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件。介绍的好像有点多余:(,那我们就直接切入正题。
QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上的窗体存成一个QPixmap格式的图片,很容易再将QPixmap存成文件。函数使用很简单,两行代码就可以。
QPixmap pixmap = QPixmap::grabWidget(this);//this是调用该函数的QWidget *指针
pixmap.save(“widget.png”,”png”);
这两个函数的区别,我个人理解是grabWindow可以抓取窗口管理器的内容,如果不是应用的顶层窗口,那么grabWidget和grabWindow没什么区别。下面是我的两个截图,一个带窗口管理器的,一个不带。

Read More...

Tags: , , , ,
Posted on June 13th, 2009 in Linux技术, Qt技术 | 7 Comments ».

实现双击可编辑的Label的例子(附例子)

有人问怎么样label双击之后出现编辑框, 编辑过后再退回显示状态(http://www.qtcn.org/bbs/read.php?tid=18860), 这个也比较好实现。
笔者的第一个例子使用QLabel和QLineEdit的组合实现此功能, 显示状态下用QLabel显示字符串, 双击Label转入编辑状态, 此时显示QLineEdit, 编辑结束后退回Label显示新内容。
这个例子有几个小技术点:
1、 控件切换
2、 获得Label鼠标双击事件
3、 获得LineEdit编辑结束的事件

Read More...

Tags: , , , ,
Posted on June 1st, 2009 in Qt技术 | 4 Comments ».

动态显示图片的小例子(附例子)

看到qtcn上有人在问怎么能动态的变换显示的图片(http://www.qtcn.org/bbs/read.php?tid=18835), 其实这是很容易实现的。 基本的是使用QTimer系列的类来控制时间, 另外从Qt4开始所有的绘制工作应该都放在窗体子类的paintEvent函数里调用, 所以一般情况下你需要把想定制绘图的类派生一下, 重写paintEvent虚函数, 把drawPixmap之类的函数放在这里调用。 笔者的例子一方面是有点取巧, 另一方面也为了和问的问题一致, 没有去派生子类, 而是用了个QLabel来显示图片, 各位看官在看代码的时候要注意了。
下面就简单的介绍一下程序的实现, 非常简单, 三言两语就清楚了。
程序的主窗体采用了QFrame, 其实随便一个类都可以, 比如QWidget也一样。
在主窗体中放了一个layout用来控制内部控件的布局, Label控件和Pushbutton都放在此布局中。 为了显示图片方便, 给Label设置了一个固定大小。
构造函数就是创建布局、子控件和定时器, 并连接信号和槽函数。
主类里定义了两个槽函数, 一个用来响应定时器并变换图片, 另一个用来响应用户点击按钮并启动或停止定时器。
代码看看附件就好了, 有任何不清楚可在本站bbs留言。
例子的打包格式是tar.gz, 由于blog上载的限制, 后缀名被篡改了, 大家下载之后自己改回去一下。 另外因为windows下的qt默认会给debug和release版本创建不同的目录存放binary, 所以代码里用的相对路径在windows下可能会找不到图片, 大家拿回去改改mainwin.cpp, 或者把图片放在程序启动的目录里。 如从debug目录运行,就要把图片放在debug目录中,或者若以debug\ani.exe这样运行的话,图片就要放在debug上级目录。 这样应该就可以显示图片了。 Windows就是这么麻烦!
例子程序下载: picanimation.tar.gz

Read More...

Tags: , ,
Posted on June 1st, 2009 in Qt技术 | 4 Comments ».