Qtに関する覚え書き[各種ダイアログ]

ダイアログの種類

用意されているダイアログ

用途クラス
ファイル・フォルダ選択QFileDialog
色選択QColorDialog
フォント選択QFontDialog
インプットボックスQInputDialog
プログレスバーQProgressDialog
印刷関連QPrintDialog
メッセージボックスQMessageBox

ファイル・フォルダ選択

QFileDialogについて

用途別に関数が用意されています。
関数用途取得
getOpenFileName ローカルファイル選択(開く)QString
getOpenFileNames 複数ローカルファイル選択(開く)QStringList
getOpenFileUrl リモートファイル選択(開く)QUrl
getOpenFileUrls 複数リモートファイル選択(開く)QList<QUrl>
getSaveFileName ローカルファイル選択(保存)QString
getSaveFileUrl リモートファイル選択(保存)QUrl
getExistingDirectory ローカルフォルダ選択QString
getExistingDirectoryUrl リモートフォルダ選択QUrl

フィルターを指定すると、拡張子で絞ってファイルを表示することができます。

[書式] 見出し(拡張子1 拡張子2…)[;;見出し(拡張子1…)]

例えば:

すべて(*.*);;音声(*.wav *.wma *.mp3);;動画(*.wmv *.avi)

■オプション[enum QFileDialog::Option]
定義説明
ShowDirsOnly0x00000001 フォルダだけ表示(FileModeがDirectoryの時に有効)
DontResolveSymlinks0x00000002 シンボリックリンクを解釈しない(デフォルトは解釈する)
DontConfirmOverwrite0x00000004 既存ファイル選択時に確認画面を出さない(デフォルトは出す)
DontUseNativeDialog0x00000010 Windows標準のダイアログを使わない(デフォルトは使う)
ReadOnly0x00000020ReadOnlyを表示
HideNameFilterDetails0x00000040 ファイル名フィルターの詳細が隠されているか示す
DontUseCustomDirectoryIcons0x00000080 フォルダのアイコンは常にデフォルトを使う
※カスタムアイコンを使うと負荷が大きいので、 フォルダのアイコンは常にデフォルトにしたほうがいいようです。

シンボリックリンクはWindowsのショートカットです。 選択してもフォルダー欄に表示されません。

DontResolveSymlinksを指定すると、ショートカットを選択した時にエラーメッセージが出ます。
通常はシンボリックリンクを解釈するので、 リンク先のファイルまたはフォルダを選択したことになります。

ファイルを開く (getOpenFileName)

ファイルとフォルダの一覧を表示します。ファイルを1つ選択できます。

[書式] 親, タイトル, パス, フィルター, 選択フィルター, オプション

初期表示として、パス(場所)が"C:/Qt/Qt5.3.2"で、フィルターは2番目のテキストを表示します。
※fileNameには選択したファイル名がフルパスで入ります。 キャンセルした時はEmpty状態になります。
※selFilterには選択したフィルターが入ります。キャンセルした時は元のままになります。

引数をすべて省略するとデフォルトのダイアログが表示されます。
※タイトルは「開く」で、パスはプロジェクトのビルドディレクトリになります。
※フィルター欄は表示されません。

名前を付けて保存 (getSaveFileName)

ファイルを1つ選択できます。既存ファイルの場合は上書きの確認メッセージが出ます。

[書式] 親, タイトル, パス, フィルター, 選択フィルター, オプション

パスにカレントディレクトリを指定すると、プロジェクトのビルドディレクトリを初期表示します。
※fileNameには選択したファイル名がフルパスで入ります。 キャンセルした時はEmpty状態になります。
※selFilterには選択したフィルターが入ります。キャンセルした時は元のままになります。
※selFilterに何も指定しないので、フィルターの初期表示は最初のTIFFになります。
※既存のファイルを選択すると、上書き確認メッセージが表示されます。

引数をすべて省略するとデフォルトのダイアログが表示されます。
※タイトルは「名前を付けて保存」で、パスはプロジェクトのビルドディレクトリになります。
※フィルター欄は表示されます。既存ファイルの上書き確認メッセージも表示されます。

フォルダ選択 (getExistingDirectory)

フォルダの一覧を表示します。フォルダを1つ選択できます。

[書式] 親, タイトル, パス, オプション

オプションにShowDirsOnlyを指定してフォルダだけ表示します。
※dirNameには選択したフォルダ名がフルパスで入ります。 キャンセルした時はEmpty状態になります。

次のメッセージに対応するため、オプションにHideNameFilterDetailsを指定しています。

selectNameFilter: Invalid parameter 'Directories' not found in 'All Files (*)'.

オプションにDontUseNativeDialogを指定すると、右側のダイアログになります。

引数をすべて省略するとデフォルトのダイアログが表示されます。
※タイトルは「フォルダーの選択」で、パスはプロジェクトのビルドディレクトリになります。

色選択

QColorDialogについて

RGBを10進または16進で入力できる色選択ダイアログです。

getColor関数はQt標準の色選択ダイアログを表示します。

[書式] 色, 親, タイトル, オプション

初期表示は青で透明度も指定します。
※colorには選択した色の情報が入ります。キャンセルした時はValidがfalseになります。
※色は#AARRGGBB形式の他に#RRGGBB形式やQt定義色(Qt::redなど)でも指定できます。
※透明度(AA)を省略するとアルファチャンネルの初期値は255になります。
※ShowAlphaChannelを指定しないと、AAに初期値を指定しても戻り値は固定でff(255)になります。

■オプション定義[enum QColorDialog::ColorDialogOption]
定義説明
ShowAlphaChannel0x00000001 アルファチャンネル(透明度)を表示する
NoButtons0x00000002 OKとキャンセルのボタンを表示しない(ライブダイアログで役立つ)
DontUseNativeDialog0x00000004 Windows標準ではなくQt標準の色選択を使う
※DontUseNativeDialogを指定しなくてもQt標準の色選択になっています。 Windows標準より便利です。

オプションをNoButtonsにすると、下側のボタン部分がなくなります。

引数をすべて省略するとデフォルトのダイアログが表示されます。
※タイトルは「Select Color」です。 初期表示は白(#ffffff)でアルファチャンネルの欄はありません。

フォント選択

QFontDialogについて

フォントを選択できるダイアログです。

getFont関数はQt標準のフォント選択ダイアログを表示します。

[書式1] 結果, 初期フォント, 親, タイトル, オプション
[書式2] 結果, 親

初期フォントを18pxのCourierにして、等幅フォントを表示します。
※fontには選択したフォントの情報が入ります。キャンセルするとokはfalseになります。
※Escキーを押すとウインドウを閉じることができます。これはキャンセルに相当します。

■オプション定義[enum QFontDialog::FontDialogOption]
定義説明
NoButtons0x00000001 OKとキャンセルのボタンを表示しない(ライブダイアログで役立つ)
DontUseNativeDialog0x00000002 Windows標準ではなくQt標準のフォント選択を使う
ScalableFonts0x00000004 スケーラブルフォントを表示
NonScalableFonts0x00000008 スケーラブルフォント以外を表示
MonospacedFonts0x00000010 等幅フォントを表示
ProportionalFonts0x00000020 可変幅フォントを表示
※現在はDontUseNativeDialogを指定しなくてもQt標準のフォント選択になっています。
※スケーラブルフォントは拡大縮小しても精度の変わらないフォントです。

オプションにNoButtonsを指定するとボタンが表示されなくなります。
理由は分かりませんが、ウインドウ右上の閉じるボタンが使えなくなっています。

第1引数は必須です。他をすべて省略するとデフォルトのダイアログが表示されます。
※タイトルは「Select Font」です。
※使えるフォントをアルファベット順に並べて、その先頭が選択された状態になります。

インプットボックス

QInputDialogについて

インプットボックスには入力データの種類別に関数が用意されています。
関数対象取得
getDouble浮動小数点数double
getInt整数int
getItemアイテムQString
getMultiLineText複数行テキストQString
getTextテキストQString

各関数の第1引数から第3引数は必須で、すべての関数で共通です。
その後に関数ごとの引数が続き、最後に結果を入れる変数を指定します。

[書式] 親, タイトル, 表示文字列, ・・・, 結果

※引数にウインドウフラグと入力ヒントがありますが、ここでは省略しています。
※必須の引数だけでもダイアログを表示できますが、結果を確認したほうが安全です。

浮動小数点数の入力 (getDouble)

getDouble関数は浮動小数点数のインプットボックスを表示します。

[書式] 親, タイトル, 表示文字列, 初期値, 最小値, 最大値, 小数部の桁数, 結果

例として、初期値37.56で、-10000から10000の範囲の浮動小数点数を入力します。
※初期値の小数部は2桁ですが4桁の37.5600が表示されます。
※キャンセルするとokはfalseになります。
※dDataには入力した浮動小数点数が入ります。キャンセルすると初期値の37.56になります。
※スピンボタンは整数部を増減します。

整数の入力 (getInt)

getInt関数は整数のインプットボックスを表示します。

[書式]親, タイトル, 表示文字列, 初期値, 最小値, 最大値, 増減値, 結果

例として、初期値25で、0から100の範囲の整数を入力します。
※キャンセルするとokはfalseになります。
※iDataには入力した整数が入ります。キャンセルすると初期値の25になります。
※スピンボタンを1回押すごとに、増減値の1ずつ増減します。

アイテムの入力 (getItem)

getItem関数はコンボボックス形式の選択/編集インプットボックスを表示します。

[書式]親, タイトル, 表示文字列, リスト, 初期位置, 編集, 結果

例として、初期値"Spring"(位置=0)で 編集可能なコンボボックスのダイアログを表示します。
※キャンセルするとokはfalseになります。
※itemには選択または入力したテキストが入ります。 キャンセルすると初期値の"Spring"になります。

複数行テキストの入力 (getMultiLineText)

getMultiLineText関数は複数行のプレーンテキストのインプットボックスを表示します。

[書式]親, タイトル, 表示文字列, テキスト, 結果

例として、初期値が"東京都\n新宿区百人町"で 複数行テキストのダイアログを表示します。
※キャンセルするとokはfalseになります。
※textには入力した文字列が改行コードも含めて入ります。 キャンセルすると空("")になります。

テキストの入力 (getText)

getText関数はテキストのインプットボックスを表示します。

[書式]親, タイトル, 表示文字列, エコーモード, テキスト, 結果

例として、初期値をホーム名(QDir::home().dirName())にして テキストのダイアログを表示します。
※キャンセルするとokはfalseになります。
※textには入力した文字列が入ります。キャンセルすると空("")になります。

■エコーモード定義[enum QLineEdit::EchoMode]
定義説明
Normal0入力文字をそのまま表示(デフォルト)
NoEcho1何も表示しない
Password2入力文字の代わりにパスワード文字を表示
PasswordEchoOnEdit3編集中だけ入力文字を表示

プログレスバー

QProgressDialogについて

時間のかかる処理の経過を割合で表示します。
モードレスダイアログは多分使わないと思うので、モーダルしかテストしていません。

最後の引数はウインドウフラグですが、指定しないので省略しています。

[書式1] 親
[書式2] 表示文字列, キャンセルボタン文字列, 最小値, 最大値, 親

タイトルが「処理中」のモーダルダイアログを表示して、500ミリ秒ごとに10%(20)ずつ増加させます。
※ループの中でprocessEventsを呼んでOSに制御を渡します (ExcludeUserInputEvents:ユーザーの入力を無視)
※wasCanceledで調べて、キャンセルされた場合はループから抜け出します。
※時間のかかる処理を思い付かなかったので、取りあえず時間稼ぎのSleepを入れました。
※スリープ中の500ミリ秒は何も受け付けなくなるので、 マウスやキーに対する反応が鈍くなります。
※最後にプログレスバーに200をセットして100%にしています。

引数をすべて省略するとデフォルトのダイアログが表示されます。
※表示文字列なしで、キャンセルボタンは「Cancel」、最小値=0、最大値=100になります。

印刷ダイアログ

印刷について

印刷に関してはいろいろな支援クラスがあり、使用する場合は次の指定が必要です。

#include <QtPrintSupport>

また、プロジェクトファイル(.pro)にモジュールの追加が必要です。

QT += core gui printsupport

■印刷関連クラス
クラス説明
QAbstractPrintDialog印刷ダイアログのベース
QPageSetupDialogページ設定
QPrintDialog印刷ダイアログ
QPrintEngine印刷サブシステムとのインターフェース定義
QPrintPreviewDialog印刷出力レイアウトのプレビューダイアログ
QPrintPreviewWidget印刷プレビューウィジェット
QPrinterプリンターに出力する描画デバイス
QPrinterInfo既存プリンターの情報
※印刷ダイアログを使う場合は描画デバイスが必要です。

ページ設定などは印刷ダイアログに組み込まれています。

テキスト印刷

文字の印刷はQTextDocumentを使うと簡単です。
※QTextEditなどはQTextDocumentを取得できるので、テキストをセットする手間が省けます。

画像印刷

画像の縦横比を崩さずに、できるだけ大きなサイズでimage.jpgを印刷します。
※印刷領域の幅と高さから、縦横比を崩さずに画像が収まるサイズを求めます。
※求めたサイズで印刷領域の幅と高さを変更しておきます。
※描画領域を画像サイズにしてから画像を描けば、 自動的にサイズ調整と印刷領域への転送が行われます。
※setViewportで印刷領域のサイズを変更しておかないと縦横比が崩れます。
※setWindowで描画領域のサイズを変更しておかないと小さな絵になります。

ウィジェット印刷

縦横比を崩さずに幅200pxでwidgetを印刷します。
※grabでwidgetのpixmapを取得します。widgetの子要素も含まれます。
※pixmapの幅を200pxにして描画します。高さは幅に合わせて伸縮します。

印刷プレビュー

用紙にA4縦を指定して印刷プレビューを表示します。 実際の描画はredrawPreview関数で行います。
※用紙のサイズと向きはプレビュー画面で設定できるので省略可能です。
※プレビュー画面のサイズを指定しないと、とても小さな表示になります。
※設定変更による描画要求シグナルには、redrawPreview関数を接続します。
※execでプレビュー画面が表示されます。画面を閉じるまで制御が戻りません。

描画関数はヘッダーのスロットで宣言します。

例として、メインウインドウのハードコピーを印刷プレビューに表示します。
※pixmapの取得以外は画像印刷と同じです。

用紙全体がプレビュー画面に収まるように縮小表示されます。
ページ設定画面を開いて用紙の向きを変えると伸縮率が変化します。


メッセージボックス

QMessageBoxについて

メッセージを表示します。概要説明ウインドウとしても使えます。

■アイコン定義[enum QMessageBox::Icon]
定義 説明標準Pixmap
NoIcon0アイコンなし
Information1情報SP_MessageBoxInformation
Warning2警告SP_MessageBoxWarning
Critical3重大な問題SP_MessageBoxCritical
Question4質問SP_MessageBoxQuestion

単純なメッセージ表示

シンプルにメッセージを表示する方法です。

[書式] 親, タイトル, 表示文字列, ボタン, デフォルト

状況に応じて次の4種類を使い分けます。
※buttonには、QMessageBox::Yesか、QMessageBox::Noのどちらかが入ります。

questionはボタンを指定しなくてもYesとNoが表示されます。
question以外はアイコンが違うだけです。

確認メッセージ表示

複数のボタンを表示して選択されたボタンを返します。
書式1は最初の3つの引数が必須です。書式2は必要な情報を後で指定します。

[書式1] アイコン, タイトル, 表示文字列, ボタン, 親
[書式2] 親

※引数の最後にウインドウフラグがありますが、ここでは省略しています。
※引数なしでもダイアログの表示はできますが、多分使い道がないと思います。

書式1の形式で確認メッセージを表示します。
※execでメッセージボックスを表示します。ダイアログを閉じるまで制御が戻りません。
※buttonには3つのボタンのどれかが入ります。

書式2の形式で確認メッセージを表示します。
※戻る(Cancel)がデフォルトボタンになります。
※ボタンの文字に賛成/反対/戻るを指定していますが、書式1でも同様に指定できます。
※setInformativeTextは、Windowsでは使い道がなさそうなので触れません。

ボタンについて

いろいろなボタンが用意されています。
■ボタン定義[enum QMessageBox::StandardButton]
定義 説明役割
Ok0x00000400了解AcceptRole
Open0x00002000開くAcceptRole
Save0x00000800保存AcceptRole
Cancel0x00400000キャンセルRejectRole
Close0x00200000閉じるRejectRole
Discard0x00800000破棄または保存しない DestructiveRole
Apply0x02000000現在の変更を適用する ApplyRole
Reset0x04000000リセットResetRole
RestoreDefaults0x08000000デフォルトに戻す ResetRole
Help0x01000000ヘルプHelpRole
SaveAll0x00001000全部保存AcceptRole
Yes0x00004000はいYesRole
YesToAll0x00008000全部はいYesRole
No0x00010000いいえNoRole
NoToAll0x00020000全部いいえNoRole
Abort0x00040000異常終了RejectRole
Retry0x00080000再試行AcceptRole
Ignore0x00100000無視AcceptRole
NoButton0x00000000ボタンなし無効

全部のボタンを表示してみます。

ボタンは指定した順番で並ぶわけではないようです。

役割ごとにまとまっているように見えます。

1. ResetRole (Reset, RestoreDefaults)
2. YesRole (Yes, YesToAll)
3. AcceptRole (OK, Save, SaveAll, Open, Retry, Ignore)
4. DestructiveRole (Discard)
5. NoRole (No, NoToAll)
6. RejectRole (Abort, Close, Cancel)
7. ApplyRole (Apply)
8. HelpRole (Help)

■役割定義[enum QMessageBox::ButtonRole]
定義説明
InvalidRole-1無効
AcceptRole0受諾(OK)
RejectRole1拒否(Canel)
DestructiveRole2変更を破棄して閉じる
ActionRole3ダイアログ内の要素を変更
HelpRole4ヘルプ要求
YesRole5"はい"的なボタン
NoRole6"いいえ"的なボタン
ResetRole7ダイアログ内の項目をデフォルトに戻す
ApplyRole8変更を適用

Cancelボタンを抜いたら、なぜか右上の×(閉じる)ボタンが使えなくなりました。


※標準ボタンには意味があって、それに応じた使い方をする必要があるようです。
※選択肢が複数ある時、標準ボタンに選択項目を適当に割り振るのは間違った使い方のようです。

プッシュボタン追加

メッセージボックスに任意のプッシュボタンを追加します。
※任意のプッシュボタンでも、役割とセットで指定する必要があります。

概要ダイアログ

Qtについての概要を表示します。
※ライセンスなどの情報らしいですが、すべて英語なので・・・。

現在のアプリケーションの説明を表示します。
※aboutではアイコンを指定しても強制的に現在のアプリケーションのアイコンが表示されます。

現在のアプリケーションの説明に任意のアイコンを表示します。
※アイコン以外はaboutと同じ表示になります。

カスタムダイアログ

QDialogについて

自由にレイアウトできるダイアログウインドウです。

メール送信用のダイアログを表示します。
※これは表示テスト用なので、見た目と結果の取得しか対応していません。
※Okボタンを選択するとacceptedシグナルが発行されます。
※Cancelボタンを選択するとrejectedシグナルが発行されます。
※それぞれのスロット関数は用意されているので、 何もしなくても1または0の結果を返します。
※サイズグリップは表示されませんが、ウインドウのサイズは自由に変更できます。

6つの選択ボタンを表示する例です。
※ボタン全体の外側・行間・列間の余白を指定します。
※各ボタンにはプロパティを設定してボタン番号を入れます。buttonNoは任意の名前です。
※グリッドの余白がうまく設定できなかったので、3行目に空白行を入れて調整しています。
※すべてのボタンのクリックイベントはexitDialog関数で処理します。
※最小サイズと最大サイズを同じ値にしてダイアログのサイズを固定しています。
※サイズグリップをオフにしてもサイズ変更不可にはなりません。
※右上の×(閉じる)ボタンを押した時、buttonは0になります。

ヘッダーにスロット関数の宣言を入れます。

シグナルの送信元を調べて、ダイアログであれば閉じます。
※送信元のウインドウがQDialogでなければ何もしません。
※buttonNoプロパティの値を取り出して結果にセットします。
※doneを実行すると、ダイアログを閉じてexecの戻り値に引数を渡します。

2016年12月