«前の日記(2012年04月29日) 最新 次の日記(2012年05月11日)» 編集

日々をアレコレ


2012年05月06日

Qtでキーベント&シリアル通信クラス

先日のQt勉強会の前後で調べたり試したりしたことをまとめておく。

まずは、キーイベントにつて。フォームというか、QMainWindowクラスのprotectedなメソッドにkeyPressEventとkeyReleaseEventがあり、それぞれがキー押下時、キー解放時に呼び出されるので、オーバーライドすればそれぞれのイベント発生時の処理を定義できる。ただ、キーを押しっぱなしの場合はkeyPressEventが繰り返し呼ばれることになるので、最初の押下にのみ対応する場合は、keyPressEventメソッドの引数であるQKeyEvent変数のQKeyEvent::isAutoRepeat()でオートリピートフラグを確認して、falseの場合のみ対応するようにすればいいようだ。また、QKeyEvent::key()で得られるキーコードは、アルファベットの場合は大文字となるようで、Aキーの押下/解放を検知する場合、'a'との比較ではなく'A'との比較で検知する必要があるようだ。当初、MacBook Air内BootCamp上のWindows7 HomeにインストールしたMinGW版Qt SDKでやったところ、keyPressEventは実行されたけど、keyReleaseEventは実行されなかった。OSX LionのQt SDKのデスクトップPCのWindows7 ProfessionalにインストールしたMinGW、VS2010版のQt SDKでもkeyReleaseEventは実行された。BootCampでの確認は再度必要かも?

あと、シリアル通信について。多分、MacでもWindowsでもLinuxでも、デバイスファイルを直接オープン/クローズ、リード/ライトすれば問題ないのだと思う。けど、せっかくC++な環境で動かすのにそれではもったいないので、シリアル通信のクラスを使いたいので、調べてみたらQextSerialPortというクラスライブラリがあるらしい。Qt @福岡 第6回勉強会 で発表してきました(wikubaの忘却日記)を参考にWindowsでのライブラリを作成したら簡単に実行できた。公式サイトから最新のβ版をダウンロードして、プロジェクトを開き、buildlibプロジェクトをビルドすればライブラリは生成される。んで、ヘッダファイルと、libファイルやdllをコピーすればすぐに使えるみたい。試していないけど受信イベントをシグナル化できるので、.NETのシリアルポートクラスと同じような形で簡単に使えるのはよさそう。

netduino plusでmicroSDカードを使う

まだ確認しなきゃいけないことが幾つかあるようだけど、忘れないうちにメモ。netduino plusにあるmicroSDカードスロットを利用するためには、ウィザードで標準的に参照されるdllだけでなくて、System.IO、および、mscorlibを参照設定に追加する必要がある。それらを追加すると、System.IO名前空間のファイルの入出力関連のクラスが利用可能になる。

例えば、microSDカードの直下にあるtest.txtを読み込む場合は次のような感じでOK。

string path = @"\SD\test.txt";    // \SDがmicroSDカードのルートパス
try
{
    if (System.IO.File.Exists(path))
    {
        System.IO.FileStream fs = new System.IO.FileStream(
            path, System.IO.FileMode.Open, System.IO.FileAccess.Read. System.IO.FileShare.None
        );
        StreamReader sr = new StreamReadr(fs);
        While (!sr.EndOfStream)
        {
            Debug.Print(sr.ReadLine();
        }
        sr.Close();
    }
    else
    {
        Debug.Print("File is not found.");
    }
}
catch (Exception e)
{
    Debug.Print("Unknown Error:" + e.Message);
}

このコードは、ファイルを1行ずつ読み込んでデバッグ出力するというもの。

同様に、StreamWriterクラスを使えばファイルの書き出しができると思ったんだけど、エラーも何も発生せずに正常終了するんだけど、microSDカードをWindowsで読み込むとファイルが存在しないので、そのあたりの調査が今後の課題。


«前の日記(2012年04月29日) 最新 次の日記(2012年05月11日)» 編集