忍者ブログ

プログラム関連~チラシの裏~

スパム対策したりプログラム組んだり色々やってる為替とは別の面を表に出してみた。

<< | 2024/04 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | >>

マイクロアド リンク

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

QFileDialogでファイル名取得

QFileDialogを利用したサンプルを作成してみました。
WindowsAPIでいう所GetOpenFileNameとGetSaveFileNameを簡単に設定できるようにした機能です。
MFCでいうならGetOpenFIleDialogだったかな?

では、ファイルオープンのダイアログを表示する。サンプル。

●フィルタリストの作成をします。ファイルを開く時などのダイアログで
Bitmapファイルだけ表示したり、jpgだけ表示したりする時に活用できます。
-- 以下ソース--
// ファイルのフィルタリスト
QStringList fileFilterList;
fileFilterList += tr("ALL IMAGE FILE (*.bmp *.png *.jpg *.jpeg *.xpm *.xbm *.ppm)");
fileFilterList += tr("Windows Bitmap (*.bmp)");
fileFilterList += tr("PNG (*.png)");
fileFilterList += tr("JPEG (*.jpg *.jpeg)");
fileFilterList += tr("XPM (*.xpm)");
fileFilterList += tr("XBM (*.xbm)");
fileFilterList += tr("PPM (*.ppm)");
fileFilterList += tr("All Files (*.*)");
●ダイアログの作成と設定。
コンストラクタで一度に色々と設定する方法。
デフォルトでQWidget*とQFileDialog::AcceptOpenかAcceptSaveを指定して
簡単に作り出す方法の2種類があります。
しかし、実用性があるのは面倒な設定を行う方法です。
QFileDialogのコンストラクタで親Widget,ダイアログタイトル、初期ディレクトリの設定、フィルタリスト。
の設定を行うのがいいでしょう。また、フィルタは後からも設定できます。
ちなみにQStringでフィルタを作成する場合は;;で区切りを作成します。
-- 以下ソース--

// ファイルオープン用のダイアログ作成
QFileDialog *openDlg = new QFileDialog(
        this,// 親widget 
tr("Open File"),// ダイアログタイトル QDir::currentPath());// 起動時のディレクトリ // ファイルフィルターを設定します デフォルトはリストの最初。 openDlg->setNameFilters(fileFilterList); // 保存ダイアログとオープンダイアログの設定 デフォルOPEN openDlg->setAcceptMode(QFileDialog::AcceptOpen); QStringList fileNames;// ファイル名の取得 // ファイル名を取得するとリストにつかされます。 if(openDlg->exec()){ // ファイルリストの取得。 fileNames = openDlg->selectedFiles(); } // 開いたファイル名をステータスバーに表示 ui.statusbar->showMessage(fileNames.at(0)); // ファイル名取得複数ファイルある場合は、foreach等で取得するといい。 if(fileNames.size()){ // 画像ファイルをQLabelに設定してイメージサイズを設定する。 QPixmap image(fileNames.at(0)); imageLabel->setPixmap(image); imageLabel->resize(image.size()); } delete (openDlg);//最後にダイアログを削除。

●ファイルを保存する場合
ファイルを保存する場合も同じQFileDialogを使います。
// 保存ダイアログを使用します
QFileDialog *saveDlg = new QFileDialog(
        this,//親widget
        tr("Save File"),// ダイアログタイトル
        QDir::currentPath()// 保存パス
        );
QStringList saveFilterList = fileFilterList;
saveFilterList.takeFirst();// ALL IMAGEを除去
saveFilterList.takeLast();// ALL FILEを除去
saveDlg->setNameFilters(saveFilterList);
// 自動で拡張子をファイル名に設定します デフォルト true
saveDlg->setNameFilterDetailsVisible(false);
// 保存ダイアログとして設定
saveDlg->setAcceptMode(QFileDialog::AcceptSave);
// 上書き保存時のメッセージフラグ デフォルトtrue
saveDlg->setConfirmOverwrite(true);

QStringList fileNames;
// 保存ファイル名を取得する
if(saveDlg->exec()){
    fileNames = saveDlg->selectedFiles();
}

// ファイル名取得複数ファイルある場合は、foreach等で取得するといい。
const QPixmap *savePixmap = imageLabel->pixmap();
if(fileNames.size() && (0 != savePixmap)){
    QString filter = saveDlg->selectedNameFilter();
    QString type = "BMP";
    if(tr("Windows Bitmap (*.bmp)") == filter){
        type = "BMP";
    }else if(tr("PNG (*.png)") == filter){
        type = "PNG";
    }else if(tr("JPEG (*.jpg *.jpeg)") == filter){
        type = "JPG";
    }else if(tr("XPM (*.xpm)") == filter){
        type = "XPM";
    }else if(tr("XBM (*.xbm)") == filter){
        type = "XBM";
    }else if(tr("PPM (*.ppm)") == filter){
        type = "PPM";
    }
    // Labelに設定したPixmapを保存します。
     savePixmap->save(fileNames.at(0), type.toLocal8Bit());
    // 保存するファイル名をステータスバーに表示
    ui.statusbar->showMessage(fileNames.at(0));
}

delete (saveDlg);

なんか、変なファイルツールでダウンロードを連続する人がいて警告メールもらってるので
1クッションおく形に変更させてもらいます。すんまそん!

PR

eventFilterを使ってみた

QObjectを継承したQWidget系のクラスはeventFilterでイベントを監視する事が可能。
つまり、エディットボックスやコンボボックスに来たイベントを実行する前に「監視」できる。
なるほど、これは便利。というか、仕事上じゃ必須か・・・。
たとえば、リストボックスでリストを選択したときに来るマウスイベントを取得して強制キャンセル。
使い方は色々ある。
tabキーを押したときにフォーカスを変更したりできるのかも~。
※キー入力はkeypressEventというのがあるので
なんていろいろ考えてみました。

というわけで、色々操作したときに来るイベントをeventFilter上で監視してコンソールに表示するサンプル。
エデットボックスのクラスポインタ等をinstallEventFilterして
イベントが来る前に表示するクラスにしてみました。 

--一応イベントフィルタの使い方--
QObject(監視したい対象A) -> installEventFilter( eventFilterにQEventを発行する対象B );
これで、BのクラスにeventFilterを用意するだけでAのイベントを取得する事ができます。
サンプルコードの中にある通りです。
イベントフィルタを消したいときはremoveEventFilterをインストールと同じ方法で呼び出すだけ。 

イベントフィルタの監視対象になった物はイベントが来るたびに、
eventFilterに飛ばされます。
だからQObjectクラスにあるvirtualのeventFilterの中身を作くれば監視可能。
そして戻り値でeventを実行するか判別する事ができる。
trueならフィルタしeventを発行しない。
だから、mouseイベントが来たときにtureの戻り値になるようにすれば
マウスイベントを無視する設定にもできる。

virtual bool QObject::eventFilter(QObject *obj, QEvent *event)
第一引数はイベントを受けるQObject。
第二引数は発行されるイベント。
イベント監視クラスをQObjectを継承して作って監視する。

キーイベント
色々やったがTABでフォーカスを移動した場合。
あれ?フォーカスが変わるイベントが来るわけでもない。
eventFilterに対してキーイベントがきていない件。

●マウス操作を使ったときのイベント 赤文字は4.4.0で追加されたものです。

QEvent->type() 番号 説明
MouseButtonPress 2 左右に関係なくマウスボタンを押した場合。
QMouseEventにキャスト可能。
MouseButtonRelease 3 マウスを離した場合。Pressの後にくる。
QMouseEventにキャスト可能。
MouseButtonDblClick 4 ダブルクリック時にくる。PressとReleaseにもメッセージが飛びます。
QMouseEventにキャスト可能。
MouseMove 5 マウス移動した場合。マウスボタンを押してるときのみ。
QMouseEventにキャスト可能。
Enter 10 マウスカーソルがQWidgetの矩形内に入った場合。
Leave 11 マウスカーソルがQWidgetの矩形外に出た場合。
Wheel 31 マウスの真中にあるホイールを回転させた場合。
QWheelEventにキャスト可能。
ContextMenu 82 マウスで右クリックをした場合。
ポップアップメニューを出すためにある模様。
ToolTip 110 マウスを同じ位置に置いておくと出る小さなヘルプです。
QLabel等のWidget上にマウスカーソルを乗せたままで発行。
発行後はマウスカーソルがLeave(11)するまでMouseMove(5)の変わりに発行されつづけます。QHelpEventにキャストしマウス座標取得可能。
NonClientAreaMouseMove 173 ウィンドウとして使うWidgetに来るメッセージです。
タイトルバーやウィンドウサイズを変更する場合のライン上でメッセージが来ます。ほかにメッセージが来る場所があるかもしれない。
マウス座標はクライアント領域から判定するのでマイナス値来ます。
NonClientAreaMouseButtonPress 174 ウィンドウとして使うWidgetに来るメッセージです。
NonClientAreaMouseMoveと同じ条件でメッセージが来ます。
ToolTipChange 184 ツールチップを変更した場合にくるらしいが・・・
ツールチップを表示するプログラムにしないと効果が無い。
4.4.0以降に追加された。

今のところ、QLabelにeventFilterを入れて見張った所。
多くのイベントが到着してる事がわかった。マウスの動作をまとめてみて何が起きるのかチェックしました。
といっても、みんな知ってるか。

●キー入力時に来るイベント


---サンプルコードの使い方---
mainで監視対象のQObjectを作る前に
MessageChecker Message;でオブジェクトを作成する。
↑使い方を考え直して、staticで絶対的なオブジェクトつくったので不用になった。

あとは、インストールするQObjectに対して
MessageChecker::Install(ui.inputLabe1);を呼ぶ。
これでメッセージ表記するようになります。
あと、Windows環境ではメッセージが表示されないので
*.proファイルのなかにCONFIG += consoleを追加してください。

詳しい中身はソースコード見てください。
Asisstantのヘルプみながらやるといいかもしれません。

メッセージチェッカーサンプルコード(zip)
一応、マウスイベントのみ全て見地。
関係ないイベントは番号で表示するようになってます。
たまにバージョンアップしとります。

QT 4.4 RC1が公開されてた

QTの使い方がイマイチのままだったので色々と調べてました。
気づいたらQT4.4が公開されている。4.3.4と何が変わったんだろう。
英語みるとWindowsCEに対応したらしい。
あと、マルチメディアがどうのこうの?
また、英語力の無さが打撃を与えてきます。
正直な所、英語力が全く無いと使えないツールでございます。

GUIツールキット「Qt 4.4」のリリース候補が公開 - Windows CEをサポート[マイコミジャーナル]
正直、トロールテックは日本語環境に関して努力を一切しない。
ヘルプも全部英語。
どんなにあがいても
「1億人しか居ない相手に対してサポートする必要なんてありませんねwwwwプギャーww」
という事でしょう。
それでも仕事で使わなければならない人のために調べておくか。

・動作環境
 Windows CEを追加。何故?

・XMLの強化
 DOMだと全部読み込んでからの処理。
 SAXだと1行づつ読む。
 タグ最初、アトリビュート、中身、最後。
 なんか1つづつ使うんだよね。QXmlDefaultHandlerのクラスを継承して読み取り部分つくる。
 個人で調べたから間違ってるかもしれないけど。何か簡単になったのか?
 ただ使うだけならDOMのほうが楽。
 ただし、簡単だとは思えないので簡単とは言わないw
 
・???
 Mac OS XデフォルトのWebブラウザ「Safari」のほか、Adobe AIRやGnome Epiphanyに採用されている
 オープンソースのHTMLレンダリングエンジン「WebKit」を統合、「Qt WebKit」として実装することに
 より、Safari 3との互換性を備えた。

という事らしいが、何ができるんだ?
なんか記事だけ読んでも先に進まないので実際にダウンロードしてみる。 

Download Qt 4.4 Release Candidate
117Mあるよ。ダウンロードは覚悟するんだ。
Qt 4.4 Release Candidate: Windows Source Package (MinGW users: Please download the MinGW package)
↑のがWindows用。
つづいて、LinuxやWindowsCE用と色々あります。
CEが追加されたんだからCE版やれよ!ってことですがCEもってないw

あと、一番下にQt Eclipse Integration for Windowsというのがあってエクリプス対応したファイル落とせる。
これ設定すればデバッガつかえるのか?
使い方を調べろってことですけど。
エクリプス自体をインストールしてないので何ともいえませんが。
※RC1なので正式リリースしたら無くなるかもしれない。
冒険するためだけに使うならいいとおもう。
仕事の上で新しく対応したものを利用して何かする!!という人用だけかも。


QT/Windows(OpenSource)4.3.4のセットアップ~その1~
QT/Windows(OpenSource)4.3.4のセットアップ~その2~
以前のセットアップ方法が役に立つ?
なんておもってましたが、ダウンロードできるのはZIPだけ。
たぶん、ビルドからやる事になると思います。
ダウンロードが終わらない罠。

セットアップおわったら続きかいてみます。
1.ZIPを解凍。
2.とりあえず、C:\qt\4.4RC1にコピー
 binの中身は空。なにもなかった。
3.minGWでビルド。
 C:\Qt4.4RC1\bin\qtvars.bat compile_debug
※QTのライブラリを入れた中のbinにqtvars.batを作る。
4.適当にENTERおしてyを押す。
ビルド開始。
※環境はWindows2000のSP4+MinGW
VC6.0以降は貧乏で買ってない。つまりフリーでしかできん。
たぶん2005等でやれって話なんですが、MinGWに頼るしかないなり。
※MinGWは4.3.4をセットアップするときにダウンロードします。

qtvers.batの中身だけさらしておく。
C:\qt\4.4RC1\bin\qtvars.batのなかみ
@echo off
rem
rem This file is generated
rem

echo Setting up a MinGW/Qt only environment...
echo -- QTDIR set to C:\Qt\4.4RC1
echo -- PATH set to C:\Qt\4.4RC1\bin
echo -- Adding C:\MinGW\bin to PATH
echo -- Adding %SystemRoot%\System32 to PATH
echo -- QMAKESPEC set to win32-g++

set INCLUDE=C:\MinGW\include
set LIB=C:\MinGW\lib
set QTDIR=C:\Qt\4.4RC1
set PATH=C:\Qt\4.4RC1\bin
set PATH=%PATH%;C:\MinGW\bin
set PATH=%PATH%;%SystemRoot%\System32
set QMAKESPEC=win32-g++

if not "%1"=="compile_debug" goto END
cd %QTDIR%
echo This will configure and compile qt in debug.
echo The release libraries will not be recompiled.
pause
configure -plugin-sql-sqlite -plugin-sql-odbc -qt-libpng -qt-libjpeg
cd %QTDIR%\src
qmake
mingw32-make debug
:END
---ここまで--- 
ちなみに、2時間以上ビルドしてる。
古いPCでは駄目な様子。orz....

使用して色々やってみた感想

※これは、個人的な主観なので要注意。
QT4.3.4のオープンソース版を使ってみた感想です。
2008年3月初旬から4月半までQTを学習し色々やった結果の話。
たった1ヶ月という期間での感想だから本気しないでね。
全体的に、英語力。理解力ともに高くないと使えない高難易度なのがQTだ。

 ここから、こういう人が導入したほうが楽かもしれないと、思われる項目。
90%、こんな人は導入しないほうがいいという説明だなw

●英語は使えますか?
何を見ても全てが英語です。
英語がわからない時点でQTは導入不可能。
英語が出来ないなら、荷物まとめてカエレ!
ヘルプを見てもサンプルを見ても。Hello! Hell you!
アプリケーションを作っても英語ベースなので日本語を使うのに苦労します。
環境は全て英語。日本は、ビジネスターゲットの外なんだとおもう。
※もしかしたら有料版は日本語環境あるのかもしれん。 

●C++を完全に理解している?
C++は正しく使えば使うほど、C言語とは別の言語です。
知りたい事があれば必ずQTのコードを見る事になるでしょう。実際みていろいろ探した・・・。
チーム内のC++レベルがクラス化してまとめただけのレベルならば導入は見送りましょう。
※「クラス化してまとめただけ」・・・特に深く考えずに作るアプリケーション。
中身がC言語という事で一番楽でバグが潰しやすい開発パターンです。
C++もCも同じじゃん。という人は導入しない事をお勧めします。

●使いこなすまでの苦労が多い
使いこなせばDirectXやWindowsAPIと同じ感じです。
使いこなすまでの苦労は多いです。
楽?簡単?という単語は信用しないほうがいいですな。
最初の英語がわかるという項目が完全に駄目なので苦労は30倍だ!

●使用するOSはWindowsのみである。
QTを導入せずにWindowsAPIで作ったほうが情報も集めやすく楽です。
MACやLinuxだけって場合は経験が無いので知りませんが。
Windowsのみならば、QTを使わない方針のが安全です。
QT3とQT4は別の生き物。 
※Windowsのみでやる仕事ならWindowsAPIを強く推奨しますw

●携帯電話の組み込み系?
Qtしか道が無い物だったら導入しましょう。
やった事ないのでしらんけど。
Qtopiaってのがそれにあたるらしい。俺の翻訳あてにならんけどw

●ゲームが作りたい!
完全にお勧めしません。
QWidgetやQObjectを1つ作るごとに窓1つとして扱う。
いずれ単純なサンプルゲームを作って説明して説明したいですが。
全体的に動作が重たいです。WindowsならQTライブラリ>>WindowsAPI と順に使っていくので
当然ながら不可が大きいです。新しいPCなら問題ありませんが・・・。
※OpenGLを簡単に扱えるという話だが、映像を加工するソフトを作るだけなら問題ないかも。
マクロソフトの開発環境と比べるとデバッガなどが無いので
コンソール出力しなきゃいけない。そしてその方法も探す手間が多い。

●会社の方針でQTを使う
なら、導入するしかないじゃないか。
バージョンが変わるごとに仕様が変わるみたい。
DirectXにたとえるなら5と7が別物みたいなかんじですねぇw
いや8からか・・・

●デバッグするにはどうしたらいいの?
Windowsでは、qmake -project で*.proファイルを作成した後に
CONFIG += consoleを追加する。
そしてmakeすると・・・。オープンソース版だとdebugビルドできないの?
ただ、コンソールから情報だせるのでそれで我慢する。

乱数クラスを利用したトランプのベースクラス(サンプル)

サンプルコードとして単純で便利かなって思ってつくりました。
C++だけどJAVAに直せば携帯電話でも使えると思います。
Linux携帯とかじゃなくて、Iアプリみたいなやつ。
その前に乱数もJAVAに直さないと使えない。
携帯電話で使うJAVAだと名称を短くするツールで圧縮しないと駄目なんだからね!

●概要
メルセンヌ・ツイスタの乱数クラスを継承したトランプのベースクラス。
乱数を使ったシャッフルのテストプログラム。

●学べること
・派生と継承。
・継承時のコンストラクタと代入演算子の使い方。 
・カードゲームを作る簡単な基礎。
・privateで派生する意味って?

世間的な言葉を使う階層はこんな感じ。
■スーパークラス(一番上のクラス)private : cMTRand
└トランプ基本クラス cPlayingCards

派生クラスの説明として、コンストラクタとデストラクタがくる順番。
●開始
1.乱数コンストラクタ スーパー
2.トランプコンストラクタ 継承

●終了
1.トランプデストラクタ 継承
2.乱数デストラクタ スーパー

●コピーコンストラクタの場合
コンストラクタの初期化リストにいれてるので
1.乱数のコピーコンストラクタ
2.トランプのコピーコンストラクタ

の順番でくるよ。まぁ知ってるか。

●メンバの説明(クラスの使い方)
・コンストラクタ
引数なし。値のみ初期化。
引数有り。
引数:
乱数の種
カードの種類指定、ハート、ダイヤ、スペード、クラブの4種類なら4つ。
1種類の最大枚数、通常なら1~10、JQKの13種なので13。
ジョーカーの枚数 ジョーカーを使うなら枚数指定。

・CreateCard カード配列の作成。
publicなので何度でも出来ます。
人によってはprivateにしてアクセスさせないつくりにします。
カードの種類指定、ハート、ダイヤ、スペード、クラブの4種類なら4つ。
1種類の最大枚数、通常なら1~10、JQKの13種なので13。
ジョーカーの枚数 ジョーカーを使うなら枚数指定。

・Shuffle シャッフル
引数
乱数を初期化して使うなら乱数の種値を設定。
0の場合は、現在のまま使う。
戻り値int
成功 1 失敗0

●値取得
・ unsigned int GetCard();
カードを1枚引く。カード参照位置が加算される。

・unsigned int GetCard(unsigned int uiPos);
位置指定でカードを取得する。配列範囲内で指定する。
使用済みカードでも取得できる。

・unsigned int GetKind(unsigned int uiCard); 
カードの種類を取得する。0~3までをハート~クラブまでに指定した場合。

・unsigned int GetCardNum(unsigned int uiCard);
カードの番号取得1~13までの値。

・unsigned int GetCardMax();
デッキ内のカード枚数。通常とランプなら13*4

・unsigned int GetKindMax()
カードの種類取得
ハートからクラブまであるので4。

unsigned int GetCardPos()
使用したカードの枚数。
現在カード配列のどこを見ているか?
ジョーカーなしなら0~52の間。

トランプソースコード:ダウンロード(zip)
※メルセンヌ・ツイスタのクラスもダウンロードして同じ階層に入れてビルドしてください。
メルセンヌ・ツイスタ擬似乱数サンプル

Q_OBJECTって何だ?

QTを使い始めていろいろ学習した。
やたらとマクロがあるのでマクロの正体を探らないと何もできん。
というわけで、Q_OBJECTのマクロから追いかけてみた。
マクロのマクロのマクロは、同じヘッダの中にあります。

C:\QT\4.3.4\SRC\corelib\kernel\qobjectdefs.h
--ファイルここから--

/* tmake ignore Q_OBJECT */
#define Q_OBJECT \
public: \
    Q_OBJECT_CHECK \
    static const QMetaObject staticMetaObject; \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    QT_TR_FUNCTIONS \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
private:
/* tmake ignore Q_OBJECT */
--ファイルここまで--

こんなマクロがあったのかよ!びっくりダヨ!
Q_OBJECT_CHECKとQT_TR_FUNCTIONSも追いかけなきゃいけなくなったじゃないか。
なんてこったい。
謎が謎をよびマクロがマクロを呼び。
よりいっそう謎が深まった・・・。
いやまぁ。MFCでも面倒なコードは自動で作成してくれているので
その自動部分と思えば楽なのかもしれんが・・・。
--Q_OBJECT_CHECKここから--

/* tmake ignore Q_OBJECT */
#define Q_OBJECT_CHECK \
    template  inline void qt_check_for_QOBJECT_macro(const T &_q_argument) const \
    { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); Q_UNUSED(i); }
--Q_OBJECT_CHECKここまで--



--QT_TR_FUNCTIONSここから--

#ifndef QT_NO_TRANSLATION
# ifndef QT_NO_TEXTCODEC
// full set of tr functions
// ### Qt 5: merge overloads
#  define QT_TR_FUNCTIONS \
    static inline QString tr(const char *s, const char *c = 0) \
        { return staticMetaObject.tr(s, c); } \
    static inline QString trUtf8(const char *s, const char *c = 0) \
        { return staticMetaObject.trUtf8(s, c); } \
    static inline QString tr(const char *s, const char *c, int n) \
        { return staticMetaObject.tr(s, c, n); } \
    static inline QString trUtf8(const char *s, const char *c, int n) \
        { return staticMetaObject.trUtf8(s, c, n); }
# else
// no QTextCodec, no utf8
// ### Qt 5: merge overloads
#  define QT_TR_FUNCTIONS \
    static inline QString tr(const char *s, const char *c = 0) \
        { return staticMetaObject.tr(s, c); } \
    static inline QString tr(const char *s, const char *c, int n) \
        { return staticMetaObject.tr(s, c, n); }
# endif
#else
// inherit the ones from QObject
# define QT_TR_FUNCTIONS
#endif
--QT_TR_FUNCTIONSここまで--

ああっここでtrが宣言されてるのか。
文字列の変換ってコレでやってたのね。
ここまで追いかけるのに随分時間かかったなぁ。
また、emitも同じようにマクロだったmocでmoc_*.cppを出力するために必要な物みたい
emitを入れると送信を作成する模様。うーむ。ソースでありながらQt専用部分になるなぁ。
アルゴリズムは完全別クラスにしてQT以外にも対応できるようにしたほうがよさそう。

※追記 trというのは翻訳するために必要なようです。

基本的に翻訳ファイルという物を添付して配る物。
または、リソースに挿入して使うものみたいです。
まだやり方を知りませんがやってみます。
俺の翻訳はファンキーだから間違ってることが多い。

QT/WIndowsでCalculator Form Exampleを実行する。

※真似してやってみたけど失敗した!という例です。
何が悪かったのかわからんので誰か説明をっ・・・・


Calculator Form Exampleを実行する。
このサンプルはQT Assitant(MSDNみたいなの)からCalculator Form Exampleで検索をかけると出てきます。
※さらに、QTなんか触ったことの無い人間が作ってます。
間違ってる場所とか色々あると思うので指摘入れてください。切実・・・。

※このサンプルは2つのエディットボックスにスピンコントロールがついた物の値を加算して結果を出すものです。
まず、QTデザイナーを完璧に使いこなす必要があるという翻訳が入っていたが・・・

このサンプルで学べること。
Widget(ヴイジット)
 Widgetとは、デスクトップ上で特定の機能を実行するための簡易的なアプリケーションの総称である。
・QT Designerの使い方?

まず、QT-Assitantのサンプルを見ながら作ろう。
今回の手順
1.QT Designerを立ち上げる。

2.フォーム選択画面でWidgetを選択する。
 プルダウンメニューのファイル(F)以下にある新しいフォーム(N)を選択する。
 フォーム選択画面がでるのでWidgetを選択して作成ボタンを押す。

3.サンプルと同じリソースを配置する。その1
Spin Boxの配置
ウィンドウの設定とかは後で調べます。
デフォルトの状態なら画面の左にウィジェットボックスというのがついてます。
VCでいう所のリソースコントロール選択みたいなものです。
※消しちゃった人は、プルダウンメニューにツール(T)に表示設定があるのでヴィジェットボックスを選択するといい。
ウィジェットボックスのリストにあるInput Widgetsを見てみよう。
そこにSpin Boxというのがありますね。
マウスでスピンボックスをForm窓にドラッグする。
これで配置完了。

4.サンプルと同じリソースを配置する。その2
Labelの配置。
サンプルにはスピンコントロールの上にInputの文字がありますな。
※VC6.0でいうスタティックテキストです。
これは、Display Widgetsという所にLabelというのがあります。
このラベルをForm窓にドラッグ。
いんぷっと1、+、いんぷっと2、=、OutPutと全部で5個のQLabelが必要ですので5回ドラッグする。
※日本語でラベルを作成すると後でひどい目に会います。
翻訳して日本語ラベルを作るのが基本らしいので・・・
絶対に日本語を使用しないこと~~。死亡するぞ。


文字の変更は、オブジェクトインスペクタという窓でQTのクラス(リソース)を選択する。
※または、Form画面でリソースを選択する。
そうすると、プロパティエディタ窓が更新されます。
※ここでサイズやら、座標やら色々変更できます。
QLabelという項目を見つけ出して、textを選択する。
+がついて項目が色々ありますが無視してtextだけ更新する。
日本語OKなので画面にあわせて文字入力する。

5.サンプルと同じリソースを配置する。その3
最後にOutPut用の文字を配置する。
ウィジェットボックスにContainers(コンタネイルズ?)というのがあるので
WidgetをForm画面にドラッグする。
はい、コレで終了。
リソースの配置は終了です。

配置し終わるとこんな感じの画面になります。
sampl001.jpg
図その1 QT Desgner(Ver4.3.4オープンソース版)の画面 
赤い文字と丸は使用リソースと変更する個所です。
※ここでは日本語文字を使っていますが、Windows環境だとS-JISの文字コードじゃん。
日本語文字がちゃんと出てこない。なけるwwww
あと、デザイナーで日本語を入れると無理やりUTF-8のコードに変換されます。
「&」から始まる数値の文字列意味不明・・・。
必ず英語で画面用の名称をWindowTitle等。
日本語の翻訳ファイルをつくるのが正式?正しい方式しってたら教えて。


6.クラス名の設定を行う。
ObjectNameという項目がクラス名になったりメンバ名になります。
適当に決めるとひどい目に会う。全部適当にやったらひどいファイルができました。
何かわかりやすいルールを決めるべき。
まず、FormになるQWidgetとかQDialogは大文字からはじめるとか。
その下に貼り付けられるオブジェクトはm_からはじめるとか。
※ObjectNameがuic出力ソースの変数名クラス名になる事を知る。
コレはQTのルールみたいなので守ること。

※この手順で失敗してました。
on_inputSpinBox2_valueChanged
スロットとして用意した関数名の決め方にルールがあった。
on_+ウィジェット名+_+シグナル名+(対応した引数)
つまり、自分でspinBox2という名前をつけた場合。
on_spinBox2_valueChangedという名前のスロットを用意する必要があった。

7.ファイルとして保存する。
とりあえず、プロジェクトフォルダと同じ名前で保存する。
calculatorform.uiで保存。
なにやらファイル名も重要みたい。

8.ビルドして実行!
uiファイルを作った。
cppファイルを追加。削除。
こんなときは、必ず
qmake -project
qmake
make ※VC環境で商用版ならnmakeらしい

ビルドしてる順序をみると

※mocというコマンドでmoc_***.cppで関数ポインタでボタンの反応する設定を作るみたい。
MFCでいうBEGIN_MESSAGE_MAPとEND_MESSAGE_MAPの間にある。
ON_WM_PAINT()
ON_BN_CLICKED(IDB_UNKOMORETA, OnUnkoMoreta)
みたいな物を作ってるみたい。何をしたらどの関数が呼ばれるのか設定する奴。
関数テーブルとか駆使したソースがつくられる。
プロジェクトフォルダ内のソースを全部見てconnect関数の中身からシグナルとスロットの接続関係を自動生成する。
だから、ソースが完成してないとエラーが出る。色々試して1日以上かかった。
※次にuicコマンドでui_***.cppができる。Windowsでいう.RCファイルだとおもって
ボタンのサイズ、名前、色々な設定されるよ!

これはQTの決まりごとなので、そういう風に考えるしかない。

debugかreleaseフォルダの中にソースができる。

9.サンプル起動で終了。
※失敗してるのでビルドエラーだったりボタンに反応がなかったり・・・
うえっうえっ。原因がわからねえぇよぉぉ。
英語を必死翻訳・・・なけるっ・・・


失敗したサンプルコードでよければどうぞ。
※ビルドして実行は可能です。*.proとuiファイル入ってます。
ダウンロード(zip)
とりあえず、コード内で何をやっているのかコメントを追加してある。
MFCにたとえて・・・main.cppから順に追いかけてください。
役に立つかはわからんが、実際はQt4の書籍を購入しないと意味不明さ。
個別の処理はQ****のクラスを派生させて作ることがわかったよ。

メルセンヌ・ツイスタ(擬似乱数)のクラスサンプル

●ここのサンプルで学べること。 
・クラスの基本事項 足りないことがありますが・・・
・デフォルトコンストラクタとコピーコンストラクタの使い方
・operator=の代入演算子ってなに?
・explicitの使い方。引数1つのコンストラクタとかにつかうんだよw
・メルセンヌツイスタ擬似乱数発生の使い方
Mersenne Twister Home Page ここが本家のURLです。
・#if等のコンパイルスイッチ
・VC6.0のサフィックスとか・・・

●ビルド環境
VC6.0 SP6 
QT4.3.4のMinGW付属のGCC
VC側では実行しまくってテストしましたがQT側ではテストしていません。
ビルドの確認のみです。

●概要
cMTRandは、メルセンヌツイスタを利用した擬似乱数発生クラスです。
乱数テーブルを作成しXORを利用して乱数を生成します。
operator=による代入とコピーコンストラクタを実装しているので
関数で値渡し BOOL BonyuKure(cMTRand cSrc){};等を実行する事ができます。

●メンバの説明
・cMTRand();
デフォルトコンストラクタ 内部変数の初期化のみ。

・cMTRand(int uiSeed);
なぜか、uiでunsignedのしるしついてる・・・
種を使ってデフォルトの乱数テーブルを作成します。

・cMTRand(const cMTRand &cSrc);
コピーコンストラクタ。
cMTRand A;
cMTRand B = A;
とかやったり、BOOL BonyuKure(cMTRand cSrc){};を作って
BonyuKure(A);をやれば呼ばれます。

・virtual ~cMTRand();
デストラクタ
バーチャルなので派生させてもくるはず。
class Hage : public cMTRandとかやったら
ハゲコンストラクタの前によばれ
ハゲデストラクタの後に乱数(cMTRand)のデストラクタが呼ばれる。
メモリ削除します。

・Initialize()
初期化。全部0にする。つまり、メモリを確保した後に呼べば
消せないメモリがつくれます。
privateにすべきもの。

・void Substitution(const cMTRand &cSrc)
引数の乱数クラスをコピーする

・ void InitSeed(unsigned int uiSeed,  int iTblSize ); 
乱数の種と乱数テーブルのサイズを指定して乱数作成。
srand();と同じ物だとおもってください。

・InitArray
  int iTblSize = DEFAULT_TABLESIZE,    // 擬似乱数の配列サイズ
  unsigned int *pKeyTbl = NULL,     // 乱数生成のキーテーブル
  unsigned int iKeyLength = 4      // キーテーブルの長さ
);
乱数の種を配列にして複雑なものを作りたいとき用。
InitSeedの強化版。多分、ゲームとして複雑にしたい場合はこっち。
今のゲーム機はCPU早いから複雑でもいいよね。

・取得関連
MT_UINT64  GetInt64();       // int(64bit)型で乱数を取得するが32bitでは無能。
unsigned int GetInt32();       // int(32bit)型で乱数を取得する
unsigned short GetInt16();       // short(16bit)型で乱数を取得する
float   GetFloat();       // float(32bit)型で乱数を取得する
double   GetDouble();      // dobule(64bit)型で乱数を取得する
それぞれの方に合わせた乱数取得。
初期化をしなくても取得時に初期化されていないことを判別してますので
生成時にいきなり使ってもOKですよ。

あと、MT_UINT64って何?
typedefした64BITの変数名にしてます。
コンパイラによっては、long longが使えて64BITだったり。
プレステ2みたいにlongで64Bitだったり色々あるじゃない。
VC6.0のように_int64で64Bit対応場合もある。
とりあえず、クラスのヘッダで#ifとかで条件コンパイルしてます。
VC6.0とそれ以外でわけてある。
PS2で使いたければその部分書き換えてください。
たぶんPSPでもいけるはず。

詳細はソースコードをダウンロードして実際に見てください。
cMTRand.hに入ってます。
仕事を終えた後に作ってるので間違ってたりする個所があるはずです。
できれば、コメントに指摘を入れてくれるとありがたいです。

サンプルコード
cmtrand.zipダウンロード(zip)

QT(キュート)/Windowsで環境を作成してサンプル実行

QT/Windowsでビルド作戦。 
※QT4.3.4のオープンソースを使用してます。

すでにマイクロソフトのビルド環境がインストールされてる方はMinGWを入れても駄目?
qmakeをするとVCのインクルド、ライブラリのパスが設定されてエラーが出る。 
そこで、環境変数を書き換えたりPSDKをインストールしたり色々やったが駄目でした。

1.環境変数を書き換える。 駄目
2.PSDKをインストール。  駄目
3.C:\qt\4.3.4\bin\qtvars.batにMinGWのパスを追加する。成功!

1.環境変数を書き換える
変数 値
QTDIR C:\Qt\4.3.4
QMAKESPEC win32-msvc

QTDIRとQMAKESPECを追加。
QTがビルドするときに使う種類の設定みたいなものらしい。
色々なサイトみて真似してみたwwww
結果、何も変わらずダメポ。

2.PSDKを入れる作戦。
PlatformSDKをいれればインダーヨ!グリーンダヨ!
という情報をゲット。

VC6.0用の最後のPSDKはココでダウンロード
全部のCABをダウンロードしてバッチと実行ファイルをダウンロード。
適当なフォルダすべて入れる。
そして、MS-DOSコマンドプロンプトからcdでフォルダ移動する。
psdk-full c:\psdk
のコマンドでCABを1つのフォルダに解凍される。
psdkフォルダのsetupを実行するとHTMLが起動するので
画面左のWindows SDKをクリック 
そうすると、画面右にInstall this SDK!というのがでるのでクリック。
あとは、Installするだけで終わる。
VC6.0で使うときはIncludeとLIBの設定をしないと駄目なので自分で設定して。

さぁ、できたぜえええ。かかってこいや!ハゲ!ヴォケ!
ハゲ!ヴォケ!ハゲ!ヴォケ!ハゲ!
そしてqmake -project qmake make
のコマンドをがんがんいれていく。
また、駄目だった。

3.C:\qt\4.3.4\bin\qtvars.batにMinGWのパスを追加する。
※セットアップフォルダが違うとファイルパス違います。
C:\qt\4.3.4\bin\qtvars.batを書き換える作戦。
PATHがMinGWになればいいのですよ。

VC6.0をインストールした状態の環境変数 
---VC6.0の環境変数達---

MSDevDir
C:\Program Files\Microsoft Visual Studio\Common\MSDev98

INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\atl\include;C:\Program Files\Microsoft Visual Studio\VC98\mfc\include;C:\Program Files\Microsoft Visual Studio\VC98\include

LIB 
C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program Files\Microsoft Visual Studio\VC98\lib
---ここまで---
ここを書き換えてしまうとVC6.0が使えない。
つまり、書き換える作戦は不可能。
チッ。。。。
というわけでC:\qt\4.3.4\bin\qtvars.batファイルに以下2つを追加してみた。

set INCLUDE=C:\MinGW\include
set LIB=C:\MinGW\lib


C:\qt\4.3.4\bin\qtvars.batファイルの中身

@echo off
rem
rem This file is generated
rem

echo Setting up a MinGW/Qt only environment...
echo -- QTDIR set to C:\Qt\4.3.4
echo -- PATH set to C:\Qt\4.3.4\bin
echo -- Adding C:\MinGW\bin to PATH
echo -- Adding %SystemRoot%\System32 to PATH
echo -- QMAKESPEC set to win32-g++

set QTDIR=C:\Qt\4.3.4
set PATH=C:\Qt\4.3.4\bin
set PATH=%PATH%;C:\MinGW\bin
set PATH=%PATH%;%SystemRoot%\System32
set QMAKESPEC=win32-g++
set INCLUDE=C:\MinGW\include
set LIB=C:\MinGW\lib


if not "%1"=="compile_debug" goto END
cd %QTDIR%
echo This will configure and compile qt in debug.
echo The release libraries will not be recompiled.
pause
configure -plugin-sql-sqlite -plugin-sql-odbc -qt-libpng -qt-libjpeg
cd %QTDIR%\src
qmake
mingw32-make debug
:END

---ここまで---
そしたら、再度・・・
※メニューのBATからQTのqmake実行してね。

qmake -project
qmake 
make
MakeFile.debugとかみるとLIBの部分が書き換わっています。
なんか、エラーが変わったッ!
あのMSのファイルを見てない気がするけど。
エラーが止まらないwww何もかもすっ飛ばしてダイアログつくってみたんだけどwww

※hello Worldのサンプルに変更して試したらmakeに成功。
hello.exeを直接実行するとmingwm10.dllが無いだとか。
QT関連のDLLが無いだろ。ハゲというメッセージがくるのでコマンドラインから起動してみて。
hello worldのサンプルは実行できるお。

hello\main.cpp

 #include 
 #include 
 #include 

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

     QTranslator translator;
     translator.load("hellotr_la");
     app.installTranslator(&translator);

     QPushButton hello(QPushButton::tr("Hello world!"));
     hello.resize(100, 30);

     hello.show();
     return app.exec();
} 
---main.cppここまで---

適当にスペースの無いフォルダ自分の場合(C:\work\hello)を作成してmain.cppを入れる。
メニューからQt 4.3.4 Command Promptを実行する。
そして、 qmake -project 以下略。
最後にreleaseフォルダの中に実行ファイルができてるのでそのまま、
cd releaseしてhelloと入力すると箱でるよ。
サンプル実行するまでに3日かかったよ。
どこが導入しやすいんだか。
サンプルはあるんだが、知らない人向けのドキュメントが圧倒的に存在してない。
ココみても理解しにくいので、わかりやすい書き方とか。

知りたいとか質問とかあったらコメントに書いてくれるとありがたい。

●色々やった感想
あなたがもし、C++かC言語でWindows上のみで動作するアプリケーションを作りたいならばおとなしくVCの無料版を使うべきである。
どうしてもQT環境で作りたいというなら話は別ですが・・・。
触った感覚は、

VC6.0>>エクリプス3.1>>超えられない壁>>QT4.3.4

全部のツールを3日ぐらい触った感想です。
VCに関しては学生のころから使ってますが、当時、触り始めて窓を出すまでに1日でおわった。
Bitmap表示までは3日ぐらいだったなぁ。
エクリプスも同じぐらい面倒なパス設定があったけどなwwww

VCの無料版に関してはコチラ

[失敗例]Qt(キュート)でウィンドウを作る。その1

※いきなりダイアログアプリから入って失敗したのでサンプル起動する!
 ここは、後でリベンジして更新します。
 ビルドとかの環境すら出来ないのに複雑なのを入れると成功しませんなぁ。


1.前回インストールしたQT4.3.4のメニューからDesignerを選択する。

2.新しいフォームのダイアログが表示されるのでダイアログ左側にあるリストからMain Windowを選択。
そして、作成(R)ボタンを押す。

起動時にこのダイアログを表示の設定をしてない人は、
メニューのファイル(F)の新しいフォーム(N)...
または、CTRL+Nキーを押して起動して実行してみてください。

3.メインウィンドウが出来上がる。
MainWindowができました?
画面の左側にはウィジットボックスってのが出てます。
VCでいうリソースエディタみたいな感じです。
右側にはなにやら設定するものが色々・・・。

4.ウィンドウを保存。
QTのセットアップフォルダにtestを作成。
testform1.uiを保存。

5.コマンドプロンプトを起動してソースを作成する。
MFCでウィンドウを作る感覚ですね。
メニューからQt 4.3.4 Command Promptを選択する。
コマンドプロンプトで
cd test
と入力してENTER

先ほど作ったtestform1.uiファイルに対して
コマンドラインから

uic -o testform1.h testform1.ui
と入力する。
ヘルプを見ると
User Interface Compiler (uic)という物らしい。
uic [options] UIファイル
※ -oのオプションは書き出しオプションでtestform1.hを出力する。
出力元ファイルはUIファイル。

なんか、それっぽいヘッダを出力することが出来た。
次はビルド方法を探すか。
というか、ヘッダーは出力してくれるけどMFCみたいにCPPを出すにはどうしたらいいんだ?


uic testform1.ui -i testform1.h -o testform1.cpp
これで出力してCPPもできるはずなんだが・・・
Windows版では -iのオプションがみあたらない。
うえええん。作れない。orz...

追記。
コマンドプロンプトから
①qmake -project
②qmake
でプロジェクトが作れる様子。 
①でフォルダ名称と同じプロジェクトを生成。
②でmakeファイルを作る。
さらにmain.cppとダイアログのソース、ウィンドウのソースは自分で作る模様。

ためしにmakeしてみたら大量のエラーが出て涙が止まらなかった。
おいおい。VC6.0のincludeファイル見てるんだが・・・
これはMinGWの問題なのかな。
ウィンドウを出すまでにVCをはじめたころと同じぐらいの苦労しそうですwww

QT/WINDOWSでビルドが出来ない人用
使用するQTのバージョンは4.3.4です。

ブログ内検索
最新コメント
[06/24 Kazelcmo]
[06/24 Kazelxyk]
[04/23 Presencia]
最新トラックバック
ブログ関連リンク

カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
カウンター
FX NEWS

-外国為替-

AdminControlMenu: AdminMenu | NewEntry | EditComment | EditTrackback

忍者ブログ [PR]