Jump to Navigation

Qt4

Qt4,Gtk+编程

在桌面应用程序中使用嵌入式关系数据

桌面应用程序,与网络应该程序一样,也需要记录用户的当前使用状态,

在用户下次使用时,可以使用这些状态数据还原到用户上次的状态。

对于像一些日程表工具,桌面笔记,联系人卡片,都需要记录关系型数据。

在数据量小的时候,随便使用的一种格式的数据文件,甚至文本文件都可以,

但如果用户的数据量大了,还是使用正式的数据库更有伸缩性,扩展性。

但是正式的关系数据库,即使最小最快的sqlite,在真正使用的时候,都会有一些额外的开销,

表现在程序响应慢等问题,却是为了扩展性,损失性能的一鲜活的应用场景。

虽然说,对于特定的应用,可以实现特定的针对此应用的数据库也许多效率更高,

很多时候必要性不那么大,一般也就不是最优选择。

自己做过几个小应用使用嵌入式sqlite数据库,但几次都没有找到一种好的维护方法,

导致在更新到读写数据库/创建新数据库的时候,响应慢,不浅显流畅,所以不需要仔细做些研究,

在使用方式,数据库优化方面找到方法。

Taxonomy upgrade extras:

使用C++0x与boost编写的异步信号回调计时器类

这个类的接口与QTimer类似,能对现有代码改动极小的情况下取代QTimer

这个类使用linux上的timer_*系统调用实现,只能用于linux平台,但使用boost:signals2实现了类似Qt的信号回调机制。

编写这个类本意是学习一下boost的信号机制,没想到测试效果非常好,达到完成替代QTimer类的功能,在此列出,

Category:

原来qt的qmake已经能使用pkgconfig功能了

还没确定从哪版本开始支持的,我现在用的qt 4.7.1是已经支持了的,好像是在4.7.0版本加入的这个功能。

使用方法,

CONFIG += link_pkgconfig # enable the PKGCONFIG feature
PKGCONFIG += glib-2.0 # link against glib-2.0

另外,还可检没某个包是否存在,

packagesExist(glib-2.0) {
DEFINES += HAS_GLIB
PKGCONFIG += glib-2.0
}

// and in the code:
#ifdef HAS_GLIB
// use glib here
#endif

这样使用pkgconfig的功能,已经非常简便了
还有一点疑问,这个在非linux系统上,如mac, win上是什么表现呢。

nullfxp原生64位windows 7支持的问题

现在64位硬件非常普遍,操作系统对64位硬件的支持也不断改进。现在的64位windows7已经运行的相当稳定,兼容性也不错。这种情况下,64位系统是现在的趋势,所以考虑nullfxp原生支持64位操作系统,而不是32位应用程序运行在64位操作系统上。

现在的情况是,编译的32位nullfxp既能运行于32位操作系统,又可运行于64位系统,并且运行状态良好,没有什么差别。但是,编译的64位nullfxp却无法在64位系统上正常运行,程序崩溃比较频繁,所有功能几乎无法使用。
在linux系统,32位和64位系统上都运行良好。

为了能让64位编译的nullfxp正常运行于64位操作系统中,需要对现有的代码做些修改,目前出问题的地方还没有找到,这个移植的工作量还未知,需要进一步深入的测试,找到问题所在才能确定,甚至有可能重写整个程序。现在代码量粗略统计已经超过3万行,重写的工作量相当大。

专门为windows 64位版本的nullfxp创建新的分支,在这再找一问题出在什么地方。

A1, 今天在测试中发现,即使Qt自带的一些示例,使用64位编译,运行时也会出现崩溃的问题。这么说qt 在64位windows上运行也有些问题,现在在windows 64位上使用64位qt还不成熟。

Taxonomy upgrade extras:

nullfxp 新功能:文件管理器导航栏

最近有时间,为nullfxp添加了许多新功能,界面上的上主要改变是,添加一个与文件管理器类似的管理功能,如地址栏,前进,后退,向上导航按钮。
另一个是目录视图模式设置功能,可以修改目录视图的大小,适应不同环境应用。

技术总结,为显示不同视图模式,使用Qt中的MVC架构,不同视图模式下共享model数据,共享QSelectionModel相关知识。

nullfxp最新界面抓图,

Taxonomy upgrade extras:

在Qt4中使用QPersistentModelIndex传递QModelIndex

在Qt4的model/view架构中,用的非常多的是QModelIndex,但这个类是动态的,可以说不可以传递的,因为随着view的变化,相同结点的QModelIndex也可能不同,非常容易失效,甚至造成读写数据错误的问题。
Qt4中还提供一个QPersistentModelIndex类,说明中这个类可以存储作为结点记录,并且不会因为model的变化而变化,应该也可以当作参数传递。
测试其中nullfxp中试用是否可以。

假如在一个View中的点击事件,点击之后异步更新当前点击的结点,
那么就需要在更新返回的时候正确查找到这个结点。
如果把这个结点的普通QModelIndex传递给异步更新处理器,则返回的时候程序行为 无法预料,
因为model中其他数据可能发生变化,而这个QModelIndex已经失效了,找不到原来的结点,或者找到的结点根本就不是原来结点。

这时候借助QPersistentModelIndex实现该功能,把当前的QModelIndex转换为QPersistentModelIndex:
QPersistentModelINdex *persisIndex = new QPersistentModelIndex(index);

Taxonomy upgrade extras:

nullfxp 中一个顽固的bug

自从本机上的Qt升级到 4.7.9999,这个bug显示出来,具体表现为,连接到ssh主机后列目录时挂掉,gdb的backtrace显示与QSortFilterProxyModel有关,出现mapToSource时异常。

调试了几天也没有找到问题关键,应该是原来的基础代码写的太乱了,如果再找不到考虑重新写下基础的RemoteDirModel这个类。

系统上装的非release版本软件太多,是不是这些问题也不得而知
gcc 4.5.0
qt-4.7.0-beta
glibc-2.11.1

AA:
几经调试,终于发现,还是原来的代码基础问题,没有严格按照Qt 4 的view/model架构修改model数据,导致数据更新后,打破有序执行序列,导致程序崩溃。
现在重写了代码,严格按照要求修改model中的数据,没有问题了。
改动比较大,nullfxp程序功能还没有完全恢复原有功能。

Taxonomy upgrade extras:

页面

订阅 RSS - Qt4


Main menu 2

by Dr. Radut