「Qtの基礎 - ダイアログ」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == <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()
  {
  {

2021年1月27日 (水) 13:58時点における版

概要



ダイアログの種類

下表に、Qtにおいて、標準で存在するダイアログの種類を示す。

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



ファイル・ディレクトリ選択ダイアログ

QFileDialogクラス

下表に、用途別に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)


下表に、QFileDialogクラスのオプションを示す。(enum QFileDialog::Option)

定義 説明
ShowDirsOnly 0x00000001 フォルダのみ表示する。
(FileModeDirectoryの時に有効)
DontResolveSymlinks 0x00000002 シンボリックリンクを解釈しない。
(指定しない場合、解釈する)
DontConfirmOverwrite 0x00000004 既存ファイル選択時に確認画面を表示しない。
(指定しない場合、表示する)
DontUseNativeDialog 0x00000010 OS標準のダイアログを使用しない。
(指定しない場合、使用する)
ReadOnly 0x00000020 ReadOnlyを表示する。
HideNameFilterDetails 0x00000040 ファイル名フィルタの詳細が隠されているか示す。
DontUseCustomDirectoryIcons 0x00000080 ディレクトリのアイコンは常に標準のものを使用する。
ただし、カスタムアイコンを使用すると負荷が大きいため、
ディレクトリのアイコンは常に標準のものを使用した方がよい。


※注意
シンボリックリンク(ショートカット)を選択しても、ディレクトリ欄には表示されない。

また、DontResolveSymlinksを指定すると、シンボリックリンク(ショートカット)を選択した場合、エラーメッセージを出力する。
指定しない場合、シンボリックリンク(ショートカット)を解釈するため、リンク先のファイルまたはディレクトリを選択したことになる。

ファイル選択ダイアログ

ファイルを開く(getOpenFileNameメソッド)

ファイルとディレクトリの一覧を表示する。
getOpenFileNameメソッドは、ファイルを1つ選択できる。

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


以下の例では、初期表示のパスを/home/<ユーザ名>、フィルタを2番目のフィルタ(*.txt)として表示する。
getOpenFileNameメソッドの戻り値には、選択したファイル名がフルパスで代入される。(キャンセルした場合、空文字が代入される)
変数SelFilterには、初期に選択するフィルターが入る。(キャンセルした場合、元のままになる)

 QString SelFilter = tr("テキスト(*.txt)");
 QString FileName = QFileDialog::getOpenFileName(this, tr("ファイルを開く"), "~/", tr("すべて(*.*);;テキスト(*.txt);;ソース(*.h *.cpp)"),
                                                 &SelFilter, QFileDialog::DontUseCustomDirectoryIcons);
 
 if(FileName.isEmpty())
 {  // キャンセル
    // キャンセル処理を記述
 }


また、引数を全て省略する場合、標準のダイアログが表示される。
標準のダイアログとは、タイトルは"開く"、初期表示のパスは"実行ファイルが存在するディレクトリ"となる。
また、フィルタ欄は表示されない。

 QString fileName = QFileDialog::getOpenFileName();


名前を付けて保存(getSaveFileNameメソッド)

getSaveFileNameメソッドを使用して、ファイルを1つ保存することができる。
既に同じ名前のファイルが存在する場合、上書きの確認メッセージが表示される。

[書式] getSaveFileName(親ウインドウのポインタ, ダイアログのタイトル, 初期表示のパス, フィルタ, 選択フィルタ, オプション)


パスに.(カレントディレクトリ)を指定する時、実行ファイルが存在するディレクトリを表示する。
getSaveFileNameメソッドの戻り値は、選択したファイル名のフルパスである。(キャンセルした場合、空文字となる)
選択フィルタ(下例では、変数SelFilter)には、選択したフィルタが代入される。(キャンセルした場合、元のままとなる)
選択フィルタ(下例では、変数SelFilter)を指定しない場合、フィルタの初期表示はフィルタの1つ目の要素(下例では、*.tif *.tiff)となる。

 QString SelFilter = "";
 QString FileName = QFileDialog::getSaveFileName(this, tr("名前を付けて保存"), ".", 
                                                 tr("TIFF image document(*.tif *.tiff);;Portable network graphic(*.png)"),
                                                 &SelFilter, QFileDialog::DontUseCustomDirectoryIcons);
 if(FileName.isEmpty())
 {  // キャンセル
    // キャンセル処理を記述
 }


getSaveFileNameメソッドの引数を全て省略する時、標準のダイアログが表示される。
この時、ダイログのタイトルは"名前を付けて保存"、初期表示のパスは"実行ファイルが存在するディレクトリ"となる。
また、フィルタ欄と既存ファイルの上書き確認メッセージは表示される。

 QString FileName = QFileDialog::getSaveFileName();


ディレクトリ選択ダイアログ(getExistingDirectoryメソッド)

getExistingDirectoryメソッドを使用して、ディレクトリの一覧を表示する。
ディレクトリを1つ選択することができる。

# 書式フォーマット
[書式] getExistingDirectory(親ウインドウのポインタ, ダイアログのタイトル, 初期表示のパス, オプション)


QFileDialog::Optionsにおいて、ShowDirsOnlyを指定することで、ディレクトリのみ表示することができる。
getExistingDirectoryメソッドの戻り値は、選択したディレクトリ名のフルパスである。(キャンセルした場合、空文字となる)
また、以下のメッセージに対応するため、オプションにHideNameFilterDetailsを指定する。

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


 QFileDialog::Options options = QFileDialog::ShowDirsOnly | QFileDialog::HideNameFilterDetails | QFileDialog::DontUseCustomDirectoryIcons;
 QString DirName = QFileDialog::getExistingDirectory(this, tr("ディレクトリの選択"), "~/", options);
 
 if(DirName.isEmpty())
 {  // キャンセル
    // キャンセル処理を記述
 }


また、オプションにDontUseNativeDialogを指定する時、下図に示すダイアログが表示される。


getExistingDirectoryメソッドの引数を全て省略する場合、標準のダイアログが表示される。
この時、タイトルは"フォルダーの選択"、初期表示のパスは"実行ファイルが存在するディレクトリ"となる。

 QString DirName = QFileDialog::getExistingDirectory();



モーダルダイアログ

 // mainwindow.cpp
 void MainWindow::OnBtnClicked()
 {
    ModalDialog ModalDlg;
    ModalDlg.setModal(true);
    ModalDlg.exec();
 }



モードレスダイアログ

 // mainwindow.h
 
 #ifndef MAINWINDOW_H
 #define MAINWINDOW_H
 
 #include <QMainWindow>
 #include "ModelessDialog.h"
 
 namespace Ui
 {
    class MainWindow;
 }
 
 class MainWindow : public QMainWindow
 {
    Q_OBJECT
 
 public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
 private slots:
    void on_pushButton_clicked();
 
 private:
    Ui::MainWindow *ui;
    std::unique_ptr<ModelessDialog> ModelessDlg;
 };
 
 #endif // MAINWINDOW_H


 // mainwindow.cpp
 
 void MainWindow::OnBtnClicked()
 {
    ModelessDlg = std::make_unique<ModelessDialog>(this);
    ModelessDlg->show();
 }