QT開發程序效率還是很高的,特別是用了QT creator 2.2.1。這幾天用QT開發程序,似乎找到了用C++開發程序的感覺,以前用c++寫程序就像是在自虐,就連string、time等基本類型都得東拼西湊的找類庫,MFC的文檔/視也搞得我暈頭轉向,關鍵是用著別扭,可能是WinForms用習慣了,再說好像也過時了,開發工具支持也不咋地!(VC的粉絲不要罵我),學了一段時間WTL,感覺只適合高手使用,純粹浪費感情!QT對於像我這樣長期以.net混飯吃的程序員,快速切換到c ++編程再合適不過了。最起碼,自己的編程想法很快就能實現!而不用先A必B,B必C,C必D... 痛苦啊!也可能是我沒找到MFC和WTL還有VC的應用場景?
反正,還是QT符合我的想法:像使用C#一樣使用C++,為我快速編個小程序提供了良好的基礎設施。當然了C#和C++的很多概念是不同的,現在把這幾天的編程經驗總結一下:
1. QProcess類:有一點與.net的Process很不同,那就是:QProcess不能取得當前進程,也就是沒有GetCurrentProcess方法。造成的直接結果就是如果你想Kill掉自己,只能通過winAPI。我想可能QT是為了跨平台的考慮。
#include <windows.h>
void killMe(){
DWORD dwProcessID = ::GetCurrentProcessId(); //獲取當前進程ID號
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID); //根據進程ID返回對象句柄
::TerminateProcess(hProcess,0); //根據對象句柄結束進程
CloseHandle(hProcess);
}
2. Signal 和 Slot:相當於C#中的事件和事件處理程序,使用connet連接信號和槽。
connect(setAction,SIGNAL(triggered()),this,SLOT(Settings()));
QT文檔中的事件Event,通過再子類中重寫來自定義行為。此事件非彼事件,例如重寫窗體的close事件:
void MainWindow::closeEvent(QCloseEvent *)
{
iProcess::killMe();
}
3. 一定要嘗試一下QScriptEngine類:嵌入JavaScript腳本是如此的簡單。嵌入腳本的好處當然是提高程序的靈活性,還有一個好處是提高開發效率:C++的編譯速度明顯不如C#快,嵌入個腳本就不一樣了,腳本不用編譯啊!
QScriptEngine* engine=new QScriptEngine;
QString basePath=QCoreApplication::applicationDirPath();
QFile file(basePath+"\test.js");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QMessageBox::information(this,"","open failed");
return;
}
QByteArray bytes= file.readAll();
QString scripts(bytes);
engine->evaluate(scripts);
if(engine->hasUncaughtException())
{
QMessageBox::information(this,"error",engine->uncaughtException().toString());
}
file.close();
只要修改test.js就可以很容易的改變我的程序邏輯。如果腳本要與主程序交互:
QScriptValue mainWin = engine->newQObject(this);
engine->globalObject().setProperty("host", mainWin);
test.js中就可以直接訪問host了。
4. 程序中要在注冊表中存些設置信息,就直接用QSettings類。
5. QThread類:不能Sleep,只好又用API。以下代碼不是很准確的延遲,但並不堵塞界面線程執行。
#include <windows.h>
void sleep(int svalue)
{
QTime dieTime = QTime::currentTime().addSecs(svalue);
while( QTime::currentTime() < dieTime )
{
::Sleep(100);
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
}
特此總結,因為編完這個小程序可能又要很久不用QT了!