程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> QT開發總結

QT開發總結

編輯:關於C語言

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了!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved