📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == <br><br> == モーダルダイアログ == <syntaxhighlight lang="c++"> void MainWindow::OnBtnClicked() { ModalDialog ModalDlg; ModalDlg.setModa…」
 
編集の要約なし
1行目: 1行目:
== 概要 ==
== 概要 ==


<br><br>
== ダイアログの種類 ==
下表に、Qtにおいて、標準で存在するダイアログの種類を示す。<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | 用途
! style="background-color:#00ffff;" | クラス名
|-
| ファイル・ディレクトリ選択 || QFileDialog
|-
| 色選択 || QFontDialog
|-
| インプットボックス || QInputDialog
|-
| プログレスバー || QProgressDialog
|-
| 印刷関連 || QPrintDialog
|-
| メッセージボックス || QMessageBox
|}
</center>
<br><br>
== ファイル・ディレクトリ選択ダイアログ ==
==== QFileDialogクラス ====
下表に、用途別に<code>QFileDialog</code>のメソッドを示す。<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | メソッド
! style="background-color:#00ffff;" | 用途
! style="background-color:#00ffff;" | 戻り値
|-
| getOpenFileName || ローカルファイル選択(開く) || QString
|-
| getOpenFileNames || 複数ローカルファイル選択(開く) || QStringList
|-
| getOpenFileUrl || リモートファイル選択(開く) || QUrl
|-
| getOpenFileUrls || 複数リモートファイル選択(開く) || QList<QUrl>
|-
| getSaveFileName || ローカルファイル選択(保存) || QString
|-
| getSaveFileUrl || リモートファイル選択(保存) || QUrl
|-
| getExistingDirectory || ローカルフォルダ選択 || QString
|-
| getExistingDirectoryUrl || リモートフォルダ選択 || QUrl
|}
</center>
<br>
フィルタを指定すると、拡張子で絞ってファイルを表示することができる。<br>
# 書式フォーマット
[書式];;見出し(拡張子1 拡張子2 ...) [;;見出し(拡張子1 ...)]
# 例
すべて(*.*);;音声(*.wav *.wma *.mp3);;動画(*.wmv *.avi)
<br>
下表に、<code>QFileDialog</code>クラスのオプションを示す。(enum QFileDialog::Option)<br>
<center>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | 定義
! style="background-color:#00ffff;" | 値
! style="background-color:#00ffff;" | 説明
|-
| ShowDirsOnly || 0x00000001 || フォルダのみ表示する。<br>(<code>FileMode</code>が<code>Directory</code>の時に有効)
|-
| DontResolveSymlinks || 0x00000002 || シンボリックリンクを解釈しない。<br>(指定しない場合、解釈する)
|-
| DontConfirmOverwrite || 0x00000004 || 既存ファイル選択時に確認画面を表示しない。<br>(指定しない場合、表示する)
|-
| DontUseNativeDialog || 0x00000010 || OS標準のダイアログを使用しない。<br>(指定しない場合、使用する)
|-
| ReadOnly || 0x00000020 || ReadOnlyを表示する。
|-
| HideNameFilterDetails || 0x00000040 || ファイル名フィルタの詳細が隠されているか示す。
|-
| DontUseCustomDirectoryIcons || 0x00000080 || ディレクトリのアイコンは常に標準のものを使用する。<br><u>ただし、カスタムアイコンを使用すると負荷が大きいため、<br>ディレクトリのアイコンは常に標準のものを使用した方がよい。</u>
|}
</center>
<br>
<u>※注意</u><br>
<u>シンボリックリンク(ショートカット)を選択しても、ディレクトリ欄には表示されない。</u><br>
<br>
<u>また、DontResolveSymlinksを指定すると、シンボリックリンク(ショートカット)を選択した場合、エラーメッセージを出力する。</u><br>
<u>指定しない場合、シンボリックリンク(ショートカット)を解釈するため、リンク先のファイルまたはディレクトリを選択したことになる。</u><br>
<br>
==== ファイル選択ダイアログ ====
===== ファイルを開く(getOpenFileNameメソッド) =====
ファイルとディレクトリの一覧を表示する。<br>
getOpenFileNameメソッドは、ファイルを1つ選択できる。<br>
# 書式フォーマット
[書式] 親, タイトル, パス, フィルター, 選択フィルタ, オプション
<br>
以下の例では、初期表示のパスを/home/<ユーザ名>、フィルタを2番目のフィルタ(*.txt)として表示する。<br>
<code>getOpenFileName</code>メソッドの戻り値には、選択したファイル名がフルパスで代入される。(キャンセルした場合、空文字が代入される)<br>
変数<code>SelFilter</code>には、初期に選択するフィルターが入る。(キャンセルした場合、元のままになる)<br>
<syntaxhighlight lang="c++">
QString SelFilter = tr("テキスト(*.txt)");
QString FileName = QFileDialog::getOpenFileName(this, tr("ファイルを開く"), "~/", tr("すべて(*.*);;テキスト(*.txt);;ソース(*.h *.cpp)"),
                                                &SelFilter, QFileDialog::DontUseCustomDirectoryIcons);
if(FileName.isEmpty())
{  // キャンセル
    // キャンセル処理を記述
}
</syntaxhighlight>
<br>
また、引数を全て省略する場合、標準のダイアログが表示される。<br>
標準のダイアログとは、タイトルは"開く"、初期表示のパスは"実行ファイルが存在するディレクトリ"となる。<br>
また、フィルタ欄は表示されない。<br>
<syntaxhighlight lang="c++">
QString fileName = QFileDialog::getOpenFileName();
</syntaxhighlight>
<br>
===== 名前を付けて保存(getSaveFileNameメソッド) =====
<code>getSaveFileName</code>メソッドを使用して、ファイルを1つ保存することができる。<br>
既に同じ名前のファイルが存在する場合、上書きの確認メッセージが表示される。<br>
[書式] getSaveFileName(親ウインドウのポインタ, ダイアログのタイトル, 初期表示のパス, フィルタ, 選択フィルタ, オプション)
<br>
パスに<code>.(カレントディレクトリ)</code>を指定する時、実行ファイルが存在するディレクトリを表示する。<br>
<code>getSaveFileName</code>メソッドの戻り値は、選択したファイル名のフルパスである。(キャンセルした場合、空文字となる)<br>
選択フィルタ(下例では、変数SelFilter)には、選択したフィルタが代入される。(キャンセルした場合、元のままとなる)<br>
選択フィルタ(下例では、変数SelFilter)を指定しない場合、フィルタの初期表示はフィルタの1つ目の要素(下例では、*.tif *.tiff)となる。<br>
<syntaxhighlight lang="c++">
QString SelFilter = "";
QString FileName = QFileDialog::getSaveFileName(this, tr("名前を付けて保存"), ".",
                                                tr("TIFF image document(*.tif *.tiff);;Portable network graphic(*.png)"),
                                                &SelFilter, QFileDialog::DontUseCustomDirectoryIcons);
if(FileName.isEmpty())
{  // キャンセル
    // キャンセル処理を記述
}
</syntaxhighlight>
<br>
<code>getSaveFileName</code>メソッドの引数を全て省略する時、標準のダイアログが表示される。<br>
この時、ダイログのタイトルは"名前を付けて保存"、初期表示のパスは"実行ファイルが存在するディレクトリ"となる。<br>
また、フィルタ欄と既存ファイルの上書き確認メッセージは表示される。<br>
<syntaxhighlight lang="c++">
QString FileName = QFileDialog::getSaveFileName();
</syntaxhighlight>
<br>
==== ディレクトリ選択ダイアログ(getExistingDirectoryメソッド) ====
<code>getExistingDirectory</code>メソッドを使用して、ディレクトリの一覧を表示する。<br>
ディレクトリを1つ選択することができる。<br>
# 書式フォーマット
[書式] getExistingDirectory(親ウインドウのポインタ, ダイアログのタイトル, 初期表示のパス, オプション)
<br>
QFileDialog::Optionsにおいて、ShowDirsOnlyを指定することで、ディレクトリのみ表示することができる。<br>
<code>getExistingDirectory</code>メソッドの戻り値は、選択したディレクトリ名のフルパスである。(キャンセルした場合、空文字となる)<br>
また、以下のメッセージに対応するため、オプションにHideNameFilterDetailsを指定する。
selectNameFilter: Invalid parameter 'Directories' not found in 'All Files (*)'.
<br>
<syntaxhighlight lang="c++">
QFileDialog::Options options = QFileDialog::ShowDirsOnly | QFileDialog::HideNameFilterDetails | QFileDialog::DontUseCustomDirectoryIcons;
QString DirName = QFileDialog::getExistingDirectory(this, tr("ディレクトリの選択"), "~/", options);
if(DirName.isEmpty())
{  // キャンセル
    // キャンセル処理を記述
}
</syntaxhighlight>
<br>
また、オプションに<code>DontUseNativeDialog</code>を指定する時、下図に示すダイアログが表示される。<br>
<br>
<code>getExistingDirectory</code>メソッドの引数を全て省略する場合、標準のダイアログが表示される。<br>
この時、タイトルは"フォルダーの選択"、初期表示のパスは"実行ファイルが存在するディレクトリ"となる。<br>
<syntaxhighlight lang="c++">
QString DirName = QFileDialog::getExistingDirectory();
</syntaxhighlight>
<br><br>
<br><br>


== モーダルダイアログ ==
== モーダルダイアログ ==
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
// mainwindow.cpp
  void MainWindow::OnBtnClicked()
  void MainWindow::OnBtnClicked()
  {
  {