1.搜索按钮可以做成填了内容才启用,这样用户体验会好一点。
2.用tr实现国际化,我们用中文作为例子。
3.真正地实现文本查找。
针对上面的需求我们相应地给出解决方案:
1.1 可以在初始化的时候先把搜索按钮禁用,用setEnabled(false)来实现。
1.2 当用户在搜索框输入了内容的时候,搜索按钮自动启用,可以用信号槽connect一下实现(信号槽这里不赘述,此系列文章全都是讲实用,就像李小龙说的:一位老师从来就不是真理的施舍者,而是带领你让你自己去领悟真理。)
在init方法里searchButton实例化之后加一行:
searchButton->setEnabled(false);
connect(searchLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableSearchButton(const QString &)));
在dialog.cpp定义开启搜索按钮的方法:
searchButton->setEnabled(!text.isEmpty());//判断是当文本不为空的时候启用
}
此时我们点击运行,搜索按钮是灰色的,这代表他不可用,我们输入内容,他变色了(额,别想歪了),好,功能1搞定。下面进入功能2:
2.1 打开dialog.pro下面加一行:TRANSLATIONS+=china.ts ,这个ts文件就是等下我们要去写中文的。
2.2 打开qt的命令行工具(一般在开始菜单里面可找到),进入项目目录,执行lupdate。下面是我本机的命令,请大家按照自己的环境改一下:
cd Qt/dialog
lupdate dialog.pro
执行完之后他生成了一个china.ts, 并且会告诉你有多少个新词是没有翻译过的。你可以用记事本打开这个ts文件看一下,哦,原来是xml。
可以看到会有这种语句:<translation type="unfinished"></translation>,乍一看,这应该就是要填写中文的地方吧。我们先试试看行不行:
<translation type="unfinished">搜索</translation>
保存,运行。没用,那该怎么整?呵呵,Qt给我们提供了一个工具,Qt Linguist,听说用他来打开ts文件再修改会简单点呢!
我们在开始菜单找到这个工具运行,把刚才的ts文件直接拖进去。弹出一个窗口,自行调节一下选项,一般默认就好了。
mylist = [2,2,2,22,2,2,3,3,3]
myset = set(mylist)
for item in myset:
print mylist.count(item),"of",item,"in list"
作者:zyl910
以前我曾为了让VC++等编译器支持C99的整数类型,编写了同名的stdint.h、inttypes.h来智能处理(http://www.cnblogs.com/zyl910/archive/2012/08/08/c99int.html)。现在将其升级到v1.01版。
一、改动说明
1.1 包含目录问题
在1.00版,我编写的头文件与系统头文件同名,利用“#include "XXX"”与“#include <XXX>”的区别,使其智能使用系统头文件。
这样做的优点是基本不需改动代码(只需将“#include <stdint.h>”改为“#include "stdint.h"”),而且易读性好,一看就知道是C99整数类型。
后来使用时发现该方案存在包含目录问题——我的stdint.h、inttypes.h不能放在项目include目录中。
这是因为“#include <XXX>”时会优先检查项目include目录,而后才是系统include目录。
如果将我的stdint.h、inttypes.h放在项目include目录中,会导致循环引用,无法定位到系统头文件。
所以,只能将我的stdint.h、inttypes.h放在项目src目录。
当项目较大时,会建立多级子目录来存放源码。这时只有将stdint.h、inttypes.h复制到各个子目录中,管理起来不方便。
于是我决定将我的stdint.h、inttypes.h分辨改名为auto_stdint.h、auto_inttypes.h,这样就可以放在项目include目录中了。缺点是使用时麻烦一点,要包含auto_stdint.h、auto_inttypes.h。
既然文件改名了,宏也要改名——
__AUTO_STDINT_H_INCLUDED(原_STDINT_H_ALL_)。
__AUTO_STDINT_H_USESYS(原_STDINT_H_SYS_)。
__AUTO_INTTYPES_H_INCLUDED(原_INTTYPES_H_ALL_)。
__AUTO_INTTYPES_H_USESYS(原_INTTYPES_H_SYS_)。
1.2 编译器兼容性
测试了 Visual C++ 2008。发现它果然不支持stdint.h与inttypes.h。
测试了 Visual C++ 2012。发现它支持stdint.h,仍不支持inttypes.h。
二、全部代码
文件清单——
auto_inttypes.h
auto_stdint.h
c99int.c
c99int.dsp
c99int.dsw
c99int_2003.sln
c99int_2003.vcproj
c99int_2005.sln
c99int_2005.vcproj
c99int_2008.sln
c99int_2008.vcproj
c99int_2010.sln
c99int_2010.vcxproj
c99int_2010.vcxproj.filters
c99int_2010.vcxproj.user
c99int_2012.sln
c99int_2012.vcxproj
c99int_2012.vcxproj.filters
c99int_bcb.bpf
c99int_bcb.bpr
c99int_bcb.res
makefile
2.1 auto_stdint.h
全部代码——
/*
auto_stdint.h: 兼容C99标准的stdint.h
Author: zyl910
Blog: http://www.cnblogs.com/zyl910
URL: http://www.cnblogs.com/zyl910/archive/2013/01/10/c99int_v101.html
Version: V1.01
Updata: 2013-01-10
测试过的编译器--
VC: 6, 2003, 2005, 2008, 2010, 2012.
BCB: 6.
GCC(Linux): 4.7.0(Fedora 17).
GCC(Mac): llvm-gcc-4.2(Mac OS X Lion 10.7.4, Xcode 4.4.1).
GCC(MinGW): 4.6.2(MinGW(20120426)), 4.7.1(TDM-GCC(MinGW-w64)).
Update
~~~~~~
[2013-01-01] V1.01
* 检查了对VC2008、VC2012的兼容性. 确认VC2008不支持stdint.h.
* 为了避免包含目录问题,更名auto_stdint.h(原stdint.h).
* 更改宏名:__AUTO_STDINT_H_INCLUDED(原_STDINT_H_ALL_),__AUTO_STDINT_H_USESYS(原_STDINT_H_SYS_).
[2012-08-08] V1.0
* V1.0发布.
* 参考了 msinttypes-r26. http://code.google.com/p/msinttypes/
* 修正了 VC6编译C++程序时wchar.h会报错 问题.
*/
////////////////////////////////////////////////////////////
#ifndef __AUTO_STDINT_H_INCLUDED
#define __AUTO_STDINT_H_INCLUDED
// __AUTO_STDINT_H_USESYS: 编译器是否提供了<stdint.h>
#undef __AUTO_STDINT_H_USESYS
#if defined(__GNUC__) // GCC.
#define __AUTO_STDINT_H_USESYS
#elif defined(_MSC_VER) // MSVC. VC6至VC2008均没有, 从VC2010才支持的.
#if _MSC_VER >=1600 // VC2010
#define __AUTO_STDINT_H_USESYS
#endif // #if _MSC_VER >=1600 // VC2010
#elif defined(__BORLANDC__) // BCB. BCB6是支持的.
#if __BORLANDC__ >=0x0560 // BCB6
#define __AUTO_STDINT_H_USESYS
#endif // #if __BORLANDC__ >=0x0560 // BCB6
#else
#define _INTTYPES_H_SYS_ // 假设其他编译器支持C99.
#endif // __AUTO_STDINT_H_USESYS
#ifdef __AUTO_STDINT_H_USESYS
// 使用编译器提供的<stdint.h>
#include <stdint.h>
#else
// 采用自定义的stdint.h. 参考了 msinttypes: http://code.google.com/p/msinttypes/
#ifndef _MSC_STDINT_H_ // [
#define _MSC_STDINT_H_
#include <limits.h>
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
// compiling for ARM we should wrap <wchar.h> include with 'extern "C++" {}'
// or compiler give many errors like this:
// error C2733: second C linkage of overloaded function 'wmemchr' not allowed
//#ifdef __cplusplus
//extern "C" {
//#endif
//# include <wchar.h>
//#ifdef __cplusplus
//}
//#endif
// <zyl910>: 在VC6下测试时, 发现上面的方法会报告很多C2733错误. 还是直接include算了.
#include <wchar.h>
// Define _W64 macros to mark types changing their size, like intptr_t.
#ifndef _W64
# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
# define _W64 __w64
# else
# define _W64
# endif
#endif
// 7.18.1 Integer types
// 7.18.1.1 Exact-width integer types
// Visual Studio 6 and E