2010年11月23日 星期二

Qt中讀寫jpg和gif

在我的開發電腦中,可以執行(秀出jpg和gif),但是其他電腦不行。
雖然我知道是dll的問題,但是還是找好久。

在執行檔處,建立一個資料夾叫imageformats
然後將qt\plugins\imageformats內要用的dll複製到剛剛建立的資料夾

2010年11月10日 星期三

在Qt中列出所有serial port

由於QSettings不能利用含有反斜線的key,來找到值。
所以只好和winapi交互利用。

要注意的是QSettings得到的鍵值是斜線,可是winapi是反斜線

const QStringList WinDongle::getComPort()
{
    QStringList comports;
    QString keyPath = "HARDWARE\\DEVICEMAP\\SERIALCOMM";
    HKEY comsKey;
    LPCWSTR winKeyPath = (LPCWSTR)keyPath.constData();
    if(RegOpenKey(HKEY_LOCAL_MACHINE, winKeyPath, &comsKey) != ERROR_SUCCESS)
    {
        error = UNKNOW;
        RegCloseKey(comsKey);
        return comports;
    }

    QSettings settings(QString("HKEY_LOCAL_MACHINE\\")+keyPath, QSettings::NativeFormat);
    QStringList keys = settings.allKeys();
    foreach( const QString & key, keys )
    {
        QString newKey(key);
        newKey.replace(QString("/"), QString("\\"));
        LPCWSTR winKey = (LPCWSTR)newKey.constData();
        char *szData= new char[101];
        DWORD dwType, dwLen=100;
        if (RegQueryValueEx(comsKey, winKey,
                            NULL, &dwType, (unsigned char *)szData, &dwLen) == ERROR_SUCCESS)
        {
            comports.append( QString::fromUtf16((ushort*)szData) );
        }
        delete[] szData;
    }
    RegCloseKey(comsKey);
    return comports;
}
參考資料:在 Win32 下 Serial Port 的通訊

Qt 字串轉換

//Convert a QString To LPCTSTR
LPCTSTR QString_To_LPCTSTR(QString mQTData)
{
    return (LPCTSTR)mQTData.utf16();
}

//Convert a QString To LPCSTR
LPCSTR QString_To_LPCSTR(QString mQTData)
{
    return (LPCSTR)mQTData.utf16();
}

//Convert a QString To LPTSTR
LPTSTR QString_To_LPTSTR(QString mQTData)
{
    return (LPTSTR)mQTData.utf16();
}

//Convert a LPCTSTR To QString
QString LPCTSTR_To_QString(LPCTSTR mWinData)
{
    return QString::fromUtf16((ushort*)mWinData);
}

//Convert a LPBYTE To QString
QString LPBYTE_To_QString(LPBYTE mWinData)
{
    return QString::fromUtf16((ushort*)mWinData);
}

//Convert a Char[] To QString
QString Char_To_QString(char mWinData[])
{
    return QString::fromUtf16((ushort*)mWinData);
}

//Convert a WCHAR* to a QString
QString WCHAR_to_QString(WCHAR* mBuffer)
{
    return QString::fromWCharArray(mBuffer);
}

//Convert a TCHAR To QString
QString TChar_To_QString(TCHAR mWinData[])
{
    return QString::fromUtf16((ushort*)mWinData);
}

資料來源 VQTConver

2010年11月7日 星期日

opengl 視窗置中

其實視窗置中和openGL一點關係都沒有
問題在你的視窗是誰建立的
是用glfw? glut? or ??
至於置中,就還簡單了
視窗的左上角位置 = 0.5 X( 桌面大小 - 視窗大小 )


    // Open a window and create its OpenGL context
    if( !glfwOpenWindow( width, height, 0,0,0,0, 0,0, GLFW_WINDOW ) ) {
        fprintf( stderr, "Failed to open GLFW window\n" );

        glfwTerminate();
        exit( EXIT_FAILURE );
    }
    
    GLFWvidmode desktop;
    glfwGetDesktopMode( &desktop );
    int posX = 0.5 * ( desktop.Width - width );
    int posY = 0.5 * ( desktop.Height - height );
    glfwSetWindowPos( posX, posY );

CodeLite

每次在用Code::Block都覺得用的很不習慣
尤其最近用久了Qt Creator後
整個寫code的習慣,都被養刁了
但是我又不想用vc

終於讓我找到CodeLite了
不管是畫面,熱鍵配置都比Code::Block好太多了

2010年11月4日 星期四

Squirrel

今天灌Code::Block時發現Squirrel的選項。
wiki了一下
It is used extensively by Code::Blocks for scripting and was also used in Final Fantasy Crystal Chronicles: My Life as a King[2] It is also used in Left 4 Dead 2 for scripted events[3].
沒想到才幾年而已,就流行起來了