Qtやってます。

適当にファイルを放り込んだり選択したりして、読み込んで、
適当にコマンドつけて、外部プログラムに処理をさせる、というものを作った。
超個人用なので載せないけど、その過程で色々知ったことをメモ。



ヘルプ・リファレンス

Qt Creatorを使ってるときに、よくわからないクラスにカーソルを合わせて、F1を押すと、
付属の英語のリファレンスが表示される。
何を継承したどういうクラスなのかも書かれており、クラスメソッドも全て説明付。英語だけど。
でもメソッド名から何をするものなのかがわかるものも多いので、
英語嫌いといって読まないよりも、ひとまず眺めてみるのがいいと思った。

UI

UIはQt Creatorでサクサク作れます。
独自のシグナルやスロットへ繋ぐ時は、クラスファイルにconnectを書くのもいいけど、
Qt Creator上でシグナルやスロットを独自に定義してやるのも良い。
後者の利点は、オブジェクト名の変更があっても修正する手間が減るのと、コードを書く行数が減ること。

Radioボタンは、Layout in a Grid(Form) をすることで、いずれかの選択ができる。
シグナルをつけてもできるけど、手間過ぎる。


ドラックアンドドロップ

ファイルやテキストなどをフィールド上にドラッグした時に、dragEnterEventが発生し、
event->acceptProposedAction();でそのイベントを許可したときだけ、
ドロップできるアイコンに切り替わったり、実際にドロップできるようになるといった仕組み。
ドロップしたときはdropEventが呼び出される。
mimeDataを読み取って内容を評価して、受け取るべきファイルなのかなどをチェックできる。
正当なものであれば、ファイルをテキストフィールドに読み取ったりなどの処理をして、
不当なものなら、すぐreturnすれば何も起きないで終わる。

QDir

ディレクトリ操作に関するあれこれが入ってる。
ディレクトリまでのパスを与えると、そこがカレントディレクトリとなるオブジェクトが返ってくる。
後はcdで移動操作したり、dirNameで現在のディレクトリ名を取得したり、
mkdirでディレクトリを作ったりrmdirで消したり、色々できます。
QDir::current();など、staticな関数も。

QFileInfo

ファイルの情報を取る時に便利。
ファイルまでの相対パス絶対パスを与えるだけでオブジェクトが出来上がる。
それがファイルなのかディレクトリなのかをチェックできる、isFile, isDirとか、
サイズを取得できる、sizeなど。


例えば、あるパスから、ファイルを含めないパスを取得したい場合とか。

QString MainWindow::getPath(const QString target){
	QFileInfo fileInfo =  QFileInfo(target);
	return fileInfo.isDir() ? target : fileInfo.dir().path();
}

getPath("/tmp/xxx.cpp"); // "/tmp"
getPath("/tmp/yyy"); // yyyがディレクトリなら、"/tmp/yyy"

QFileDialog

ディレクトリやファイルを選択する時に必要な、ダイアログのオブジェクトを作る。
選択結果は普通に文字列型で受け取れて、簡単。
読み取り専用などのオプション、開く場所についての指定(デフォルト:カレントディレクトリ)
などの指定もできる。


任意のディレクトリのパスを選ばせて、取得する

	QString dirPath = QFileDialog::getExistingDirectory(this, 
							   tr("Select Object Path..."), // 見出し
								QDir::currentPath(), // 開く場所
								QFileDialog::ShowDirsOnly // オプション
								);


上のファイル版

	QString filePath = QFileDialog::getOpenFileName(this,
										tr("Select Object File..."),
										QDir::currentPath(),
										"All Files (*.*)" // 選択タイプ
			// text (*.txt);;image (*.bmp *.jpg)とすると、.txtか.bmp .jpgで終わるファイルに限定
	// オプションは省略できる
	);

あまりQtに深い知識がなくても、オブジェクト指向とQtの基礎的な知識があれば、
マニュアル片手に色々できるのがいい。それが正しいプログラミングかどうかは別として。


僕はWindowsプログラミングをやろうとしていたけども、ある解説サイトでメインウィンドウを表示するだけでも、色々構造体を使ったりしていることや、今はおまじないとして〜といったような部分も多く、ちょっと抵抗を感じた。
なのでこういったツールキットに逃げようとしてるけども、やりたいことをすぐ形にできてる感じがしていい。
意識しなくても、Qtに準拠して書けば、クロスプラットフォームで動作できるのもいい点。