Qt 编程继续为大家讲解,还是接着文章 Qt 编程点滴 初学者必看 (3) ,继续介绍,说编程那些细节。由于本话题是一节一节为大家介绍的,所以更多内容请看末尾编辑推荐。
编译win32 中的 dll工程配置方法(以skypebackend为例):
因为工程中的代码全是标准C++的代码,所以编译方式跟Qt有点不一样,
Project-properties...-Project settings页中的"This is a custom Makefile"前面的方框不要勾选
Project-properties...-Build targets 右边中的"Type"设置为"Console application"(skypebackend为控制台程序)
Project-build options-Linker settings页,设置Link libraries内容为:(win32库文件)
复制
..\..\..\..\MinGW\lib\librpcdce4.a ..\..\..\..\MinGW\lib\librpcns4.a ..\..\..\..\MinGW\lib\librpcrt4.a
1.
2.
3.
按回车定位到下一焦点:
复制
connect(lineEdit1, SIGNAL(returnPressed()), lineEdit2, SLOT(setFocus()));
1.
项目翻译DEMO:
复制
#include #include #include int main( int argc, char **argv ) { QApplication app( argc, argv ); QTranslator translator( 0 );//Creates a QTranslator object without a parent translator.load( "ttl_zh-cn", "." );//Try to load a file called ttl_zh-cn.qm app.installTranslator( &translator );//Add the translations from ttl_zh-cn.qm to the pool of translations QPushButton hello( QPushButton::tr( "Hello world!" ), 0 ); app.setMainWidget( &hello ); hello.show(); return app.exec(); }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
1.使用qmake -project生成.pro文件;
2.在.pro文件中加上如下语句:
复制
TRANSLATIONS = ttl_zh-cn.ts
1.
3.运行如下命令:
复制
lupdate ttl.pro
1.
生成ttl_zh-cn.ts文件;(PS:.ts的名字来自“翻译源”(translation source))
4.运行如下命令:
复制
linguist ttl_zh-cn.ts
1.
这时候会弹出一个图形界面工具:
(1)单击左边窗口的QPushButton
(2)双击中间窗口的helloworld!这时会弹出一个对话框,在Translation下输入:你好世界!
(3)单击工具栏的Done and Next按钮(这个时候QPushButton的前面会变成绿色的对号)显示翻译完成
(4)然后File->Release,这个是生成.qm文件(.qm来自“QT消息”Qt message),保存到当前目录下,也可以使用命令release ttl_zh-cn.ts来生成.qm文件的。
(5)点击linguist“X”退出窗口,这个时候会提示保存ttl_zh-cn.ts文件,单击save,完成操作。
这一步的目的是把“你好世界!”来替代ttl_zh-cn.ts中的“unfinished”,这个只要了解就可以了,有兴趣的可以去看看Qt参考文档。
5.运行如下命令:
复制
qmake ttl.pro
1.
6.运行如下命令:
复制
make
1.
7.运行如下命令:
复制
./ttl
1.
这个时候你会发现按钮是显示的是:“你好世界!” 而不是“helloworld!”
PS:lupdate和lrelease命令都可以带参数-verbose,这样会显示一些提示信息。这个 参数是可选的。
通过上面的步骤可以完成正常的翻译,但对象QLineEdit的右键菜单显示的还是英文,解决方法:把Qt\translations目录下的qt_zh_CN.ts里面的内容全部拷到自己项目ts文件的后面就可以了(也就是把两个ts文件合并)
4字节空间存INT类型:
复制
#define USERGROUP_WIDTH 5; char buff[5]; int groupid = atoi(groupId.trimmed().toAscii().data()); //得到GroupID的int值 char* gid = (char*)(&groupid); //将groupid转化为char*类型 memcpy(buff, gid, USERGROUP_WIDTH-1); char p[4]; memset(buff, 0, USERGROUP_WIDTH); memcpy(buff, p, USERGROUP_WIDTH-1); int gid = *((int*)(&buff));
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
错误信息:redefinition class...
请核对
复制
#ifndef IGPSINTERACTION_H_INCLUDED #define IGPSINTERACTION_H_INCLUDED
1.
2.
上面两行中的名称是否一样(出现过第两行中最后一个"D"没掉, 找了N久才查出问题,汗~~~)
另一原因是变量定义不可放在.h文件中,如下
复制
struct mystruct{ ... };
1.
2.
3.
是一个变量 (不可放在.h文件中实现)
复制
typedef struct MyStruct{ .... }mystruct;
1.
2.
3.
其中 MyStruct是一种类型,而mystruct是一个变量标准用法
在.h文件中
复制
typedef struct MyStruct{ .... };
1.
2.
3.
在.cpp中定义变量
复制
struct MyStruct mystruct; std::string 转QString: std::string groupName = \\\'abcdef\\\'; const char *groupNamegroupNameCh = groupName.c_str(); QString tmpStr = QObject::tr(groupNameCh);
1.
2.
3.
4.
5.
窗体在执行destory()时,qapp对象就已经退出啦;
gsoap项目中的错误:multiple definition of `namespaces\\\'
解决方法:用gsoap中的工具生成的 nsmap文件(#include "UMPCServer.nsmap")引用不能写在.h中,应该要写在.cpp文件中;
复制
a.cpp: #include "UMPCServer.nsmap"
1.
2.
上面的写法是正确的,不能写在a.h文件中,否则就会报错
删除TreeWidget结点:
复制
void MainWindow::clearTreeWidget() { while ( treeWidget->topLevelItemCount() > 0 ) { QTreeWidgetItem *parentItem = treeWidget->takeTopLevelItem(0); QList list = parentItem->takeChildren (); for (int j = 0; j < list.size(); j++) { QTreeWidgetItem *childItem = list.at(j); delete &nodeItemData(childItem); delete childItem; } delete &nodeItemData(parentItem); delete parentItem; } }
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
复制
IGPSNestData* resolveRecord(const QSqlRecord &record,const DataType &dateType ) error: expected `,\\\' or `...\\\' before \\\'&\\\' token 解决方法 #include
1.
2.
3.
复制
GpsSideBar::IGPSNestData* GpsSideBar::resolveRecord(const QSqlRecord &record,const GpsSideBar::DataType &dateType ); { } error: declaration of `GpsSideBar::IGPSNestData* GpsSideBar::resolveRecord(const QSqlRecord&, const GpsSideBar::DataType&)\\\' outside of class is not definition 解决方法:去掉函数头最后的";" GpsSideBar::IGPSNestData* GpsSideBar::resolveRecord(const QSqlRecord &record,const GpsSideBar::DataType &dateType ) { }
1.
2.
3.
4.
5.
6.
7.
8.
9.
小结:本文主要介绍了在Qt 窗体的使用,通过Qt 编程点滴介绍,也给自己提高了编程过程中需要注意的细节问题,由于本话题是一节一节为大家展现的,所以更多内容,请看编辑推荐。