Qt入門(1)ーQt Creatorを使ってみるー
■ Qt Creator (+Qt デザイナー)を使ってGUIプログラミングの基本手順メモ
◆プロジェクトの作成◆
※プロジェクトとはプログラムに必要な設定やファイル類をまとめて管理するためのもの
①「ファイル」の「ファイル/プロジェクトの新規作成」を選択
②プロジェクト名を入力(プロジェクト名が実行ファイル名になる)
③プロジェクトを作成するフォルダを選択
→その中にプロジェクト名の子フォルダが作られ、関連ファイルが出来る
④次に進むとプロジェクトの作成が完了する
⑤左のプロジェクトペインの「ソース」「フォーム」「ヘッダ」フォルダ内に編集するファイルがある
◆手を加えるところ◆
①main.cppはとりあえずは変更なし
②MainWindow.h
1) MainWindowクラスにprivate slots:の一行を追加する。slotsは予約語
2) その下にスロット関数の宣言を記述
③MainWindow.cpp
1) MainWindowクラスのメソッドとしてスロット関数の中身を記述
④MainWindow.ui
1) 必要なWidgetを追加
2) スロット関数の登録
3) シグナル/スロットエディタでシグナルとスロットの接続
Qtデザイナーを使うとオブジェクトの準備やconnectといった部分のコードの記述は
自分でやらなくてよくなる。上の④を行なえば実行の際に全て請け負ってくれるようだ。
(※追記:②についても手順を踏めば自動で追記してくれることが後でわかった。その手順で
③についてもメソッドの外枠は作ってくれる。のでメソッドの中身を自分で記述するだけ
→後述 3-① がその手順)
■練習:テキストファイルViewerの作成
(1)ファイルメニューのオープンからファイル選択ダイアログを開き
(2)ダイアログで取得したファイルパスをウィンドウのタイトルに設定
(3)planeTextEditウィジェットにファイルの中身のテキストを表示する
というプログラムを作ってみる
1. ウィジェットの配置
「フォーム」フォルダにあるmainwindow.uiを開き、ウィジェット一覧のペインから
plain Text Editを選択。ウィンドウにドラッグ&ドロップして配置する
2. ファイルメニューを作る
①左上の「ここに入力」をダブルクリック
「File」と入力してEnter
②サブメニュー項目が下に開くので「ここに入力」のところに「Open」と入力してEnter
3. Openを選択したときのシグナルとスロットの設定
①アクションエディタにactionOpenが作成されるので、これを選んで右クリックから
「Go to slot...」を選択
②triggered()がメニューを選択したときのシグナルになるようだ。これを選択。
③「OK」を押すと、mainwindow.cppが開き、
void MainWindow::on_actionOpen_triggered()
が追加される。またmainwindow.hを開いてみると、
private slots:
void on_actionOpen_triggered();
が追記されていることが分かる。
4. ファイル選択ダイアログの設定
①ファイル選択ダイアログは<QFileDialog>をインクルードすることで利用できる。
mainwindow.cppの#include欄に<QFileDialog>を追記
②選択ファイルの取得関数としてgetOpenFilename()関数が用意されている。使い方は
QString fileName = QFileDialog::getOpenFileName( this, tr("Open File"), // ダイアログのタイトル
"", // 開くディレクトリ
tr("Text Files (*.txt);;All Files (*)") ); // フィルタ
得られてくるファイルのパスをQtの文字列型Qstring の変数fileNameとして受ける。
5. ファイルパスをウィンドウタイトルに設定
①QMainWindowクラスにはウィンドウタイトルを設定するsetWindowTitle()メソッドがある
②文字列が取得されているかの確認はQstringクラスのisEmptyメソッドでできる。
ダイアログでキャンセルボタンを押したときはファイル名は空になっている。
ファイル名の取得を確認しながらファイルパスをウィンドウタイトルに設定する
6. ファイル内容をPlane Text Widgetに取得
①C言語のFILE構造体に該当するQFileクラスを使ってファイル入出力を行なう。
QFile file(fileName)でfileNameのパスを持ったファイルを指定。(ファイルハンドルの取得?)
QFileクラスのopenメソッドでファイルを開く。開き方のいろいろはQIODevice::(ファイルモード)で指定する。
使っているのはQIODeviceで定義されている列挙型の定数ラベルのようだ。実体は0x0001(ReadOnly)、
0x0010(Text)。Qt4の前は"IO_ReadOnly"のような形式の定数ラベルが使われていたらしい。
パイプ(|)を入れるとandの意味になる。
②ファイルが開けなかったときのエラーメッセージ表示にメッセージボックスを利用する。
メッセージボックスを利用するときは<QMessageBox>をインクルードする。
mainwindow.cppの#include欄に<QMessageBox>を追記。
③テキストデータを読み出す。
入出力データがテキストの時はQTextStreamクラスでデータを取り扱った方がよいようだ。
<QTextStream>のインクルードで利用できるようになる。
mainwindow.cppの#include欄に<QTextStream>を追記。
QTextStream textData(&file)でfile内のテキストデータをtextDataに受ける。
テキストの読み出しは全部いっぺんに読み込むのではなく、一行ずつ読み込んで追加して
いくのが定跡のようだ。atEndメソッドでファイルの終端がわかるので、ファイルの最後に来るまで
一行づつ読み込んで、QString型の変数に受ける。
この文字列をplaneTextWidgetのappendPlainTextメソッドを使ってWidget内のテキストデータ
として追加していく。
最後にファイルをクローズして終了。
一応望み通りに動く。
■疑問点
QStringやQFileクラスはリファレンスを見るとそれぞれ<QString>と<QFile>のヘッダファイルを
インクルードするとなっているのに、とくにインクルードなしでも使える。
QTextStreamは<QTextStream>をインクルードしないとコンパイラエラーになった。
クラスと必要なヘッダファイルとの関係がいまいちよく分かっていない。メソッドを使おうとしたときに
補完が働かないときはインクルードが必要らしいというのが一応の目安にはなるけど。
◆プロジェクトの作成◆
※プロジェクトとはプログラムに必要な設定やファイル類をまとめて管理するためのもの
①「ファイル」の「ファイル/プロジェクトの新規作成」を選択
②プロジェクト名を入力(プロジェクト名が実行ファイル名になる)
③プロジェクトを作成するフォルダを選択
→その中にプロジェクト名の子フォルダが作られ、関連ファイルが出来る
④次に進むとプロジェクトの作成が完了する
⑤左のプロジェクトペインの「ソース」「フォーム」「ヘッダ」フォルダ内に編集するファイルがある
◆手を加えるところ◆
①main.cppはとりあえずは変更なし
②MainWindow.h
1) MainWindowクラスにprivate slots:の一行を追加する。slotsは予約語
2) その下にスロット関数の宣言を記述
③MainWindow.cpp
1) MainWindowクラスのメソッドとしてスロット関数の中身を記述
④MainWindow.ui
1) 必要なWidgetを追加
2) スロット関数の登録
3) シグナル/スロットエディタでシグナルとスロットの接続
Qtデザイナーを使うとオブジェクトの準備やconnectといった部分のコードの記述は
自分でやらなくてよくなる。上の④を行なえば実行の際に全て請け負ってくれるようだ。
(※追記:②についても手順を踏めば自動で追記してくれることが後でわかった。その手順で
③についてもメソッドの外枠は作ってくれる。のでメソッドの中身を自分で記述するだけ
→後述 3-① がその手順)
■練習:テキストファイルViewerの作成
(1)ファイルメニューのオープンからファイル選択ダイアログを開き
(2)ダイアログで取得したファイルパスをウィンドウのタイトルに設定
(3)planeTextEditウィジェットにファイルの中身のテキストを表示する
というプログラムを作ってみる
1. ウィジェットの配置
「フォーム」フォルダにあるmainwindow.uiを開き、ウィジェット一覧のペインから
plain Text Editを選択。ウィンドウにドラッグ&ドロップして配置する
2. ファイルメニューを作る
①左上の「ここに入力」をダブルクリック
「File」と入力してEnter
②サブメニュー項目が下に開くので「ここに入力」のところに「Open」と入力してEnter
3. Openを選択したときのシグナルとスロットの設定
①アクションエディタにactionOpenが作成されるので、これを選んで右クリックから
「Go to slot...」を選択
②triggered()がメニューを選択したときのシグナルになるようだ。これを選択。
③「OK」を押すと、mainwindow.cppが開き、
void MainWindow::on_actionOpen_triggered()
が追加される。またmainwindow.hを開いてみると、
private slots:
void on_actionOpen_triggered();
が追記されていることが分かる。
4. ファイル選択ダイアログの設定
①ファイル選択ダイアログは<QFileDialog>をインクルードすることで利用できる。
mainwindow.cppの#include欄に<QFileDialog>を追記
②選択ファイルの取得関数としてgetOpenFilename()関数が用意されている。使い方は
QString fileName = QFileDialog::getOpenFileName( this, tr("Open File"), // ダイアログのタイトル
"", // 開くディレクトリ
tr("Text Files (*.txt);;All Files (*)") ); // フィルタ
得られてくるファイルのパスをQtの文字列型Qstring の変数fileNameとして受ける。
5. ファイルパスをウィンドウタイトルに設定
①QMainWindowクラスにはウィンドウタイトルを設定するsetWindowTitle()メソッドがある
②文字列が取得されているかの確認はQstringクラスのisEmptyメソッドでできる。
ダイアログでキャンセルボタンを押したときはファイル名は空になっている。
ファイル名の取得を確認しながらファイルパスをウィンドウタイトルに設定する
6. ファイル内容をPlane Text Widgetに取得
①C言語のFILE構造体に該当するQFileクラスを使ってファイル入出力を行なう。
QFile file(fileName)でfileNameのパスを持ったファイルを指定。(ファイルハンドルの取得?)
QFileクラスのopenメソッドでファイルを開く。開き方のいろいろはQIODevice::(ファイルモード)で指定する。
使っているのはQIODeviceで定義されている列挙型の定数ラベルのようだ。実体は0x0001(ReadOnly)、
0x0010(Text)。Qt4の前は"IO_ReadOnly"のような形式の定数ラベルが使われていたらしい。
パイプ(|)を入れるとandの意味になる。
②ファイルが開けなかったときのエラーメッセージ表示にメッセージボックスを利用する。
メッセージボックスを利用するときは<QMessageBox>をインクルードする。
mainwindow.cppの#include欄に<QMessageBox>を追記。
③テキストデータを読み出す。
入出力データがテキストの時はQTextStreamクラスでデータを取り扱った方がよいようだ。
<QTextStream>のインクルードで利用できるようになる。
mainwindow.cppの#include欄に<QTextStream>を追記。
QTextStream textData(&file)でfile内のテキストデータをtextDataに受ける。
テキストの読み出しは全部いっぺんに読み込むのではなく、一行ずつ読み込んで追加して
いくのが定跡のようだ。atEndメソッドでファイルの終端がわかるので、ファイルの最後に来るまで
一行づつ読み込んで、QString型の変数に受ける。
この文字列をplaneTextWidgetのappendPlainTextメソッドを使ってWidget内のテキストデータ
として追加していく。
最後にファイルをクローズして終了。
一応望み通りに動く。
■疑問点
QStringやQFileクラスはリファレンスを見るとそれぞれ<QString>と<QFile>のヘッダファイルを
インクルードするとなっているのに、とくにインクルードなしでも使える。
QTextStreamは<QTextStream>をインクルードしないとコンパイラエラーになった。
クラスと必要なヘッダファイルとの関係がいまいちよく分かっていない。メソッドを使おうとしたときに
補完が働かないときはインクルードが必要らしいというのが一応の目安にはなるけど。