「Qtの基礎 - ダイアログ」の版間の差分
(ページの作成:「== 概要 == <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 | フォルダのみ表示する。 ( FileModeがDirectoryの時に有効)
|
| 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();
}