QT开发程序效率还是很高的,特别是用了QT creator 2.2.1。这几天用QT开发程序,似乎找到了用C++开发程序的感觉,以前用c++写程序就像是在自虐,就连string类型都得东拼西凑的找类库,MFC的文档/视也搞得我晕头转向,WTL只适合高手使用!QT对于像我这样长期以.net混饭吃的程序员,快速切换到c ++编程再合适不过了。最起码,自己的编程想法很快就能实现!而不用先A必B,先B必C,先C必D... 痛苦啊!

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

作者: zhoujie 发表于 2011-06-29 17:59 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架