Qt 編程點滴 初學者必看 (4)
Qt 編程繼續(xù)為大家講解,還是接著文章 Qt 編程點滴 初學者必看 (3) ,繼續(xù)介紹,說編程那些細節(jié)。由于本話題是一節(jié)一節(jié)為大家介紹的,所以更多內(nèi)容請看末尾編輯推薦。
編譯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內(nèi)容為:(win32庫文件)
- ..\..\..\..\MinGW\lib\librpcdce4.a
- ..\..\..\..\MinGW\lib\librpcns4.a
- ..\..\..\..\MinGW\lib\librpcrt4.a
按回車定位到下一焦點:
- connect(lineEdit1, SIGNAL(returnPressed()), lineEdit2, SLOT(setFocus()));
項目翻譯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.使用qmake -project生成.pro文件;
2.在.pro文件中加上如下語句:
- TRANSLATIONS = ttl_zh-cn.ts
3.運行如下命令:
- lupdate ttl.pro
生成ttl_zh-cn.ts文件;(PS:.ts的名字來自“翻譯源”(translation source))
4.運行如下命令:
- linguist ttl_zh-cn.ts
這時候會彈出一個圖形界面工具:
(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
6.運行如下命令:
- make
7.運行如下命令:
- ./ttl
這個時候你會發(fā)現(xiàn)按鈕是顯示的是:“你好世界!” 而不是“helloworld!”
PS:lupdate和lrelease命令都可以帶參數(shù)-verbose,這樣會顯示一些提示信息。這個 參數(shù)是可選的。
通過上面的步驟可以完成正常的翻譯,但對象QLineEdit的右鍵菜單顯示的還是英文,解決方法:把Qt\translations目錄下的qt_zh_CN.ts里面的內(nèi)容全部拷到自己項目ts文件的后面就可以了(也就是把兩個ts文件合并)
4字節(jié)空間存INT類型:
- #define USERGROUP_WIDTH 5;
- char buff[5];
- int groupid = atoi(groupId.trimmed().toAscii().data()); //得到GroupID的int值
- char* gid = (char*)(&groupid); //將groupid轉(zhuǎn)化為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));
錯誤信息:redefinition class...
請核對
- #ifndef IGPSINTERACTION_H_INCLUDED
- #define IGPSINTERACTION_H_INCLUDED
上面兩行中的名稱是否一樣(出現(xiàn)過第兩行中最后一個"D"沒掉, 找了N久才查出問題,汗~~~)
另一原因是變量定義不可放在.h文件中,如下
- struct mystruct{
- ...
- };
是一個變量 (不可放在.h文件中實現(xiàn))
- typedef struct MyStruct{
- ....
- }mystruct;
其中 MyStruct是一種類型,而mystruct是一個變量標準用法
在.h文件中
- typedef struct MyStruct{
- ....
- };
在.cpp中定義變量
- struct MyStruct mystruct;
- std::string 轉(zhuǎn)QString:
- std::string groupName = \\\'abcdef\\\';
- const char *groupNamegroupNameCh = groupName.c_str();
- QString tmpStr = QObject::tr(groupNameCh);
窗體在執(zhí)行destory()時,qapp對象就已經(jīng)退出啦;
gsoap項目中的錯誤:multiple definition of `namespaces\\\'
解決方法:用gsoap中的工具生成的 nsmap文件(#include "UMPCServer.nsmap")引用不能寫在.h中,應該要寫在.cpp文件中;
- a.cpp:
- #include "UMPCServer.nsmap"
上面的寫法是正確的,不能寫在a.h文件中,否則就會報錯
刪除TreeWidget結(jié)點:
- 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;
- }
- }
- IGPSNestData* resolveRecord(const QSqlRecord &record,const DataType &dateType )
- error: expected `,\\\' or `...\\\' before \\\'&\\\' token
- 解決方法 #include
- 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 解決方法:去掉函數(shù)頭最后的";"
- GpsSideBar::IGPSNestData* GpsSideBar::resolveRecord(const QSqlRecord &record,const GpsSideBar::DataType &dateType )
- {
- }
小結(jié):本文主要介紹了在Qt 窗體的使用,通過Qt 編程點滴介紹,也給自己提高了編程過程中需要注意的細節(jié)問題,由于本話題是一節(jié)一節(jié)為大家展現(xiàn)的,所以更多內(nèi)容,請看編輯推薦。