トップ 一覧 ソース 検索 ヘルプ RSS ログイン

▽こころキット

Qtでプリコンパイルヘッダーを使うメモ

Qtでプリコンパイルヘッダーを使う手順のメモ。いつの間に、こんな便利な機能がついたのか・・・

1.プリコンパイルに使うヘッダーファイルを用意する

こんな感じで。

0|#ifndef STABLE_H
1|#define STABLE_H
2|
3|#include <QApplication>
4|#include <QtGui>
5|
6|#endif  //  STABLE_H

どうせ、プリコンパイルしちゃうんだから、もっと派手にいろいろ読み込んでも良いかも。

2.プロジェクトファイルを修正

PRECOMPILED_HEADER = stable.h
HEADERS += stable.h

プリコンパイルに使うヘッダーファイルを指定。ヘッダーファイル一覧の方にも追加。

3.あとは、普通にコンパイル

他のソースファイルには手を加える必要なし。便利便利。


プリコンパイルヘッダーの内容は自動的に読み込まれるから・・・ #includeがどこにもないソースファイルなんてのが簡単にできちゃう。

1|int         main( int argc,char* argv[] )
2|{
3|    QApplication    app( argc,argv );
4|
5|    QLabel      label( "test" );
6|    label.show();
7|
8|    return  app.exec();
9|}

上で例に挙げたプリコンパイルヘッダーを使ってると、このソースで普通にコンパイルできちゃう。知らない人が見たら意味がわからないなw

こう言うのは、あまりやり過ぎると気持ち悪いソースファイルになっちゃうので、節度を持って使うべきでしょう。たぶん。

参考になったのはこちら。


(2009/11/17 メモ,Qt

qmakeでQtのコンパイル方法を調べるメモ

Qtは基本的に、staticビルドでもsharedビルドでも同じことができるようになっている。けど、たま〜に、この違いが問題になることがある。具体的に言うと、Qtのプラグインとして実装されている機能を使う場合。

とりあえず、qmakeの時点でどちらのビルドかを調べることができれば、後はどうにでもなるんだけど・・・ これを調べることは可能なんだろうか?

  わからなかった(;つд`)

とりあえず、Windowsの場合は可能。CONFIGに“static”か“shared”が定義されるので、これをチェックすることで場合分けができる。ただ、MacとUnixの場合は・・・ あきらめるか(´・ω・`)

(´-`).。о〇(何か、簡単な方法がありそうな気がするんだけどなぁ・・・)


参考にしたのはこのあたり。

実験に使ったソースコードはこちら:testQMake-02src.zip


(2009/11/17 メモ,Qt

skScriptExec

skScriptExecは指定されたスクリプトを実行するプログラムです。

ss002.png

 Install

ダウンロードしたファイルを適当なフォルダに展開して、中に入ってるskScriptExecを実行してください。

 Download

for Windows XP / Windows Vista / Windows 7 ( 32bit & 64 bit )

Download: skScriptExec-06win.zip

for Mac OS X v10.6

Download: skScriptExec-06mac.zip

Source Code

Download: skScriptExec-06src.zip

※コンパイルにはQt4.5.3の環境が必要です

 Etc

thanks

以下のサイトのアイコンを使わせてもらってます。

Ubuntu版のスクリーンショット

ss001a.png

※Ubuntu版はソースコードからコンパイルしてください

Mac版のスクリーンショット

sc.png

更新履歴

2009/11/16 ver 1.0[06]
公開

何かに使えるだろうと思って・・・ QProcessの実験もかねて作ってみたら、意外と使い道が無くてびっくり(´・ω・`)

まぁ、こんなものでもいつか役に立つ日が来るに違いない。いや、こないかな(´・ω・`)


(2009/11/16 Qt,Freeware

skRegexpTest

skRegexpTestは正規表現のテストをするプログラムです。

ss002.png

 Install

ダウンロードしたファイルを適当なフォルダに展開して、中に入ってるskRegexpTestを実行してください。

 Download

for Windows XP / Windows Vista / Windows 7 ( 32bit & 64 bit )

Download: skRegexpTest-05win.zip

for Mac OS X v10.6

Download: skRegexpTest-05mac.zip

Source Code

Download: skRegexpTest-05src.zip

※コンパイルにはQt4.5.3の環境が必要です

 Etc

thanks

以下のサイトのアイコンを使わせてもらってます。

Ubuntu版のスクリーンショット

ss001a.png

※Ubuntu版はソースコードからコンパイルしてください

Mac版のスクリーンショット

ss01a.png

更新履歴

2009/11/16 ver 1.0[05]
公開

(2009/11/16 Qt,Freeware

Qtのforeachメモ

いわゆるPerlやRubyやC#でよく使われるforeachがQtでは再現されている。この内部ではどんなことをやってるのか? ちょっと気になったので調べてみた。

Visual Studio 2008で調査・・・ gcc版は簡単そうだな(´∀`;)

1.ループを管理するオブジェクトを作成

qglobal.h
2070|template <typename T>
2071|class QForeachContainer : public QForeachContainerBase {
2072|public:
2073|    inline QForeachContainer(const T& t): c(t), brk(0), i(c.begin()), e(c.end()){};
2074|    const T c;
2075|    mutable int brk;
2076|    mutable typename T::const_iterator i, e;
2077|    inline bool condition() const { return (!brk++ && i != e); }
2078|};

必要になるコンテナをコピーしてるけど、暗黙の共有が行われてるから問題ないんだろう。たぶん。

2.オブジェクトを参照で受け取る

const QForeachContainerBase &_container_ = qForeachContainerNew(container)

この時点でcontainerの型(=型T)が判明してないので、親クラスへの参照としてオブジェクトを受け取る。containerの型を調べる方法が用意されてれば、この後の処理がずっと楽になるはずなのに・・・

3.型Tを無理矢理認識させる

2080|template <typename T> inline T *qForeachPointer(const T &) { return 0; }

参照を受けてポインタを返すだけの関数。しかも、返してるのはNULLポインタ。つまり、型Tをコンパイラに知らせるためだけに使われる関数っぽい。

4.型Tを他の関数に渡す

true ? 0 : qForeachPointer(container)

こんな形の三項演算子がいくつも出てくるけど・・・ これも、考え方は2と同じだな。

5.型Tを使ってポインタを変換

3と4のテクニックを使って無理矢理変換。

qForeachContainer(&_container_, true ? 0 : qForeachPointer(container))

変換に使ってる関数はこんな感じ。

2085|template <typename T>
2086|inline const QForeachContainer<T> *qForeachContainer(const QForeachContainerBase *base, const T *)
2087|{ return static_cast<const QForeachContainer<T> *>(base); }

親クラスへのポインタを型Tのポインタに変換。これでようやく、ループを管理するオブジェクトがまともに使えるように・・・ 面倒だなぁ。

6.2重のループで本文を回す

ここまでの解釈を使ってforeachのマクロを単純化するとこんな感じか?

1|QStringList args    = app.arguments();
2|
3|for( QFCon con = QFCon( args ); con.condition(); ++con.i ) {
4|    for( QString str = *con.i; con.brk; con.brk-- ) {
5|        ループの本文;
6|    }
7|}

QFConがループを管理するオブジェクト。1で出てきたQForeachContainerに相当する。内側のループは確実に1周で抜ける・・・ 何か、深い意味があるんだろう。たぶん。

condition()の中でbrkも判定に使ってるけど・・・ これは要らないような気が。気のせいかな。

ちなみに、手元の環境では3と4をすっ飛ばしてもコンパイルが通ったが・・・

qForeachContainer(&_container_, &container)->condition();

こんな感じで。これだと無理な環境があるんだろう。たぶん。というか、どうせコンテナクラスしかforeachで使えないんだから、コンテナ側にforeachのネタを仕込んでおくべきか?

参考になったのはこのあたり。


できるだけまじめにC++を使いながら、それでも速度は犠牲にしたくないという涙ぐましい努力が垣間見える結果に。ちょっとしたループの展開なら、これを使ってあげるべきなのかな。

(´-`).。о〇(そもそも、速度を気にするようなプログラムなんて、最近書いてないしな・・・)


(2009/11/15 メモ,Qt

skBitrateCalc

skBitrateCalcは時間・ビットレート・サイズを適当に変換するプログラムです。

ss003.png

  • 『250MByteのファイルを128KBit/secでダウンロードしたら何分かかる?』
  • 『1枚のDVDに90分の動画を入れるときのビットレートは?』
  • 『160KBit/secで74分の音声データのサイズは?』

こんな計算が簡単にできます。たぶん。

 Install

ダウンロードしたファイルを適当なフォルダに展開して、中に入ってるskBitrateCalcを実行してください。

 Download

for Windows XP / Windows Vista / Windows 7 ( 32bit & 64 bit )

Download: skBitrateCalc-11win.zip

for Mac OS X v10.6

Download: skBitrateCalc-11mac.zip

Source Code

Download: skBitrateCalc-11src.zip

※コンパイルにはQt4.5.3の環境が必要です

 Etc

thanks

以下のサイトのアイコンを使わせてもらってます。

Ubuntu版のスクリーンショット

ss001a.png

※Ubuntu版はソースコードからコンパイルしてください

Mac版のスクリーンショット

ss0a.png

更新履歴

2009/11/15 ver 1.0[11]
公開

(2009/11/15 Qt,Freeware

skUnitCalc

 About

skUnitCalcは日時・距離・容量の単位を適当に変換するプログラムです。

ss002.png

  • 『20000000000ミリ秒は何時間?』
  • 『150000000Byteって何MByte?』

こんな計算が簡単にできます。

 Install

ダウンロードしたファイルを適当なフォルダに展開して、中に入ってるskUnitCalcを実行してください。

 Download

for Windows XP / Windows Vista / Windows 7 ( 32bit & 64 bit )

Download: skUnitCalc-28win.zip

for Mac OS X v10.6

Download: skUnitCalc-28mac.zip

Source Code

Download: skUnitCalc-28src.zip

※コンパイルにはQt4.5.3の環境が必要です

 Etc

thanks

以下のサイトのアイコンを使わせてもらってます。

Ubuntu版のスクリーンショット

ss001a.png

※Ubuntu版はソースコードからコンパイルしてください

Mac版のスクリーンショット

sc003a.png

更新履歴

2009/11/14 ver 1.0[26]
公開
2009/11/15 ver 1.0[28]
iniファイルがカレントディレクトリにできてしまう問題を修正。

(2009/11/15 Qt,Freeware

Qtでプログラムにアイコンをつけるメモ

 Windows編

1.アイコンファイルを作成

.ico形式のファイルを作成。

icon.ico

Paint.NETで作るのが一番楽?

2.アイコンファイルを読み込むリソースファイルを作成

内容はこんな感じ。

1|IDI_ICON1       ICON        DISCARDABLE "res/icon.ico"

同じやり方でバージョン情報も入れることが可能?

3..proでリソースファイルを読み込む

1|win32 {
2|    RC_FILE = main.rc
3|}

これでOK。

 Mac編

1.アイコンファイルを作成

Macでは.icns形式のアイコンファイル。

『Icon Composer』で作るのが一番楽?

2..proでアイコンファイルを指定

1|mac {
2|    ICON = res/icon.icns
3|}

これでOK。


Linuxでの対応は省略。・・・アイコンの設定ぐらい簡単にできないの?

参考になるサイトはこちら。


(2009/11/14 メモ,Qt

QtのSelectionModeのメモ

QTableWidgetでSelectionModeを指定するときのメモ。

QAbstractItemView::NoSelection
何も選択できない。
QAbstractItemView::SingleSelection
セル1つだけが選択可能。
QAbstractItemView::MultiSelection
クリックやドラッグで選択。自由すぎる。
QAbstractItemView::ExtendedSelection
いわゆるExcelみたいなタイプ。Ctrl+クリックで飛び地の選択も可能。
QAbstractItemView::ContiguousSelection
いわゆるExcelみたいなタイプ。飛び地の選択は不可能。

(´-`).。о〇(日本中で、どれだけの人間がこの情報を必要としてるのやら・・・)


(2009/11/13 メモ,Qt

Qtのイベント処理メモ

イベント処理メモというより、イベント処理乗っ取り方法メモ?

1.イベントハンドラで処理する

resizeEvent()やcloseEvent()でよく使われてるやり方。親クラスの仮想関数を再定義することでイベントを独自に処理する。

2.QObject::event()を再定義する

イベントハンドラに送られる直前で独自の処理を行う方法。複数のイベントをまとめて乗っ取るときに便利? 1で処理できない場合はこれで。

3.オブジェクトにイベントフィルタを指定

QObject::installEventFilter()でイベントフィルタを指定することで、他のオブジェクトからイベントを乗っ取ってしまう方法。

monitor->installEventFilter( filter );

これで、monitorへのイベントが先にfilterで処理される・・・ はず。いちいち継承して処理を変えるのが面倒なときに便利? ただし、オブジェクトを破棄するときは注意が必要。

4.QCoreApplicationにイベントフィルタを指定

qApp->setEventFilter()でイベントフィルタを指定。すべてのオブジェクトへのメッセージを事前に処理できるはず。

5.QCoreApplication::notify()を再定義

QApplicationを継承したクラスを作って、notify()を再定義。これでだめなら、Qtにくる前で処理するしかないw


(2009/11/12 メモ,Qt

[ 1 2 3 4 5 6 ]