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

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
編集の要約なし
174行目: 174行目:
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  QString DirName = QFileDialog::getExistingDirectory();
  QString DirName = QFileDialog::getExistingDirectory();
</syntaxhighlight>
<br><br>
== 色選択ダイアログ(QColorDialogクラス) ==
RGBを10進または16進で入力できる色選択ダイアログである。<br>
<br>
<code>getColor</code>メソッドを使用すると、Qt標準の色選択ダイアログを表示する。<br>
[書式] getColor(色, 親ウインドウのポインタ, ダイアログのタイトル, オプション)
<br>
以下の例では、初期表示として、青で透明度を指定している。<br>
<br>
<code>getColor</code>メソッドの戻り値は、選択した色情報クラスである。(キャンセルした場合、Validがfalseになる)<br>
色は、#AARRGGBB形式、#RRGGBB形式、Qt定義色(<code>Qt::red</code>等)で指定する。<br>
透明度(AA、アルファチャンネル)を省略する時、初期値は255となる。<br>
<code>ShowAlphaChannel</code>オプションを指定しない場合、AAに初期値を指定しても戻り値は固定でFF(255)となる。<br>
<syntaxhighlight lang="c++">
QColor color = QColorDialog::getColor("#800a64c8", this, tr("色選択"), QColorDialog::ShowAlphaChannel);
if(color.isValid())
{
    // color.name();  → "#0a64c8" (#RRGGBB)
    // color.name(QColor::HexArgb);  → "#800a64c8" (#AARRGGBB)
    // int r, g, b, a;
    // color.getRgb(&r, &g, &b, &a);  → r=10, g=100, b=200, a=128
}
</syntaxhighlight>
<br>
<center>
QColorDialogのオプション(enum QColorDialog::ColorDialogOption)<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | オプション名
! style="background-color:#00ffff;" | 値
! style="background-color:#00ffff;" | 説明
|-
| ShowAlphaChannel || 0x00000001 || アルファチャンネル(透明度)を表示する。
|-
| NoButtons || 0x00000002 || OKとキャンセルのボタンを表示しない。<br>(ライブダイアログで役立つ)
|-
| DontUseNativeDialog || 0x00000004 || OS標準ではなくQt標準の色選択を使用する。<br>(指定しない場合、有効)。
|}
</center>
<br>
<code>getColor</code>メソッドの引数を全て省略する時、標準のダイアログが表示される。<br>
この時、標準ダイアログのタイトルは"Select Color"、色は白(#ffffff)、アルファチャンネルの項目は無い。<br>
<syntaxhighlight lang="c++">
QColor color = QColorDialog::getColor();
</syntaxhighlight>
<br><br>
== フォント選択ダイアログ(QFontDialog) ==
フォント選択ダイアログは、フォントを選択できるダイアログである。<br>
<code>QFontDialog</code>クラスの<code>getFont</code>メソッドは、Qt標準のフォント選択ダイアログを表示する。<br>
[書式1] getFont(結果, 初期フォント, 親ウインドウのポインタ, ダイアログのタイトル, オプション)
[書式2] getFont(結果, 親ウインドウのポインタ)
<br>
以下の例では、初期フォントを18pxのCourier、等幅フォントとしている。<br>
<code>getFont</code>メソッドの戻り値は、選択したフォント情報のクラスである。(キャンセルした場合、第1引数はfalseとなる)<br>
[Esc]キーを押下する場合は、キャンセルしたものと見なされる。<br>
<syntaxhighlight lang="c++">
bool ok;
QFont font = QFontDialog::getFont(&ok, QFont("Courier", 18), this, tr("フォント選択"), QFontDialog::MonospacedFonts);
if(ok)
{
    // font.family();  → "Courier"
    // font.pointSize();  → 18
    // font.italic();  → false (true:Font styleがItalic)
    // font.bold();  → false (true:Font styleがBold)
    // font.weight();  → 50 (bold()=trueの時は75)
    // font.strikeOut();  → false (true:EffectsのstrikeOutオン)
    // font.underline();  → false (true:Effectsのunderlineオン)
}
</syntaxhighlight>
<br>
<center>
QFontDialogクラスのオプション(enum QFontDialog::FontDialogOption)<br>
{| class="wikitable" style="background-color:#fefefe;"
|-
! style="background-color:#00ffff;" | オプション名
! style="background-color:#00ffff;" | 値
! style="background-color:#00ffff;" | 説明
|-
| NoButtons || 0x00000001 || [OK]ボタンと[キャンセル]ボタンを表示しない。<br>(ライブダイアログで役立つ)<br><u>ただし、ダイアログ右上の[閉じる]ボタンが使用できなくなる。</u>
|-
| DontUseNativeDialog || 0x00000002 || OS標準ではなくQt標準のフォント選択を使用する。<br>指定しない場合、Qt標準のフォント選択を使用する。
|-
| ScalableFonts || 0x00000004 || スケーラブルフォントを表示する。<br>スケーラブルフォントとは、拡大縮小しても精度の変わらないフォントである。
|-
| NonScalableFonts || 0x00000008 || スケーラブルフォント以外を表示する。
|-
| MonospacedFonts || 0x00000010 || 等幅フォントを表示する。
|-
| ProportionalFonts || 0x00000020 || 可変幅フォントを表示する。
|}
</center>
<br>
第1引数は必須であり、他の引数を全て省略する時、標準のフォント選択ダイアログが表示される。<br>
この時、ダイアログのタイトルは"Select Font"、使用可能なフォントをアルファベット順に並べて、その先頭が選択された状態となる。<br>
<syntaxhighlight lang="c++">
bool ok;
QFont font = QFontDialog::getFont(&ok);
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

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

概要



ダイアログの種類

下表に、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();



色選択ダイアログ(QColorDialogクラス)

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

getColorメソッドを使用すると、Qt標準の色選択ダイアログを表示する。

[書式] getColor(色, 親ウインドウのポインタ, ダイアログのタイトル, オプション)


以下の例では、初期表示として、青で透明度を指定している。

getColorメソッドの戻り値は、選択した色情報クラスである。(キャンセルした場合、Validがfalseになる)
色は、#AARRGGBB形式、#RRGGBB形式、Qt定義色(Qt::red等)で指定する。
透明度(AA、アルファチャンネル)を省略する時、初期値は255となる。
ShowAlphaChannelオプションを指定しない場合、AAに初期値を指定しても戻り値は固定でFF(255)となる。

 QColor color = QColorDialog::getColor("#800a64c8", this, tr("色選択"), QColorDialog::ShowAlphaChannel);
 
 if(color.isValid())
 {
    // color.name();  → "#0a64c8" (#RRGGBB)
    // color.name(QColor::HexArgb);  → "#800a64c8" (#AARRGGBB)
    // int r, g, b, a;
    // color.getRgb(&r, &g, &b, &a);  → r=10, g=100, b=200, a=128
 }


QColorDialogのオプション(enum QColorDialog::ColorDialogOption)

オプション名 説明
ShowAlphaChannel 0x00000001 アルファチャンネル(透明度)を表示する。
NoButtons 0x00000002 OKとキャンセルのボタンを表示しない。
(ライブダイアログで役立つ)
DontUseNativeDialog 0x00000004 OS標準ではなくQt標準の色選択を使用する。
(指定しない場合、有効)。


getColorメソッドの引数を全て省略する時、標準のダイアログが表示される。
この時、標準ダイアログのタイトルは"Select Color"、色は白(#ffffff)、アルファチャンネルの項目は無い。

 QColor color = QColorDialog::getColor();



フォント選択ダイアログ(QFontDialog)

フォント選択ダイアログは、フォントを選択できるダイアログである。
QFontDialogクラスのgetFontメソッドは、Qt標準のフォント選択ダイアログを表示する。

[書式1] getFont(結果, 初期フォント, 親ウインドウのポインタ, ダイアログのタイトル, オプション)
[書式2] getFont(結果, 親ウインドウのポインタ)


以下の例では、初期フォントを18pxのCourier、等幅フォントとしている。
getFontメソッドの戻り値は、選択したフォント情報のクラスである。(キャンセルした場合、第1引数はfalseとなる)
[Esc]キーを押下する場合は、キャンセルしたものと見なされる。

 bool ok;
 QFont font = QFontDialog::getFont(&ok, QFont("Courier", 18), this, tr("フォント選択"), QFontDialog::MonospacedFonts);
 
 if(ok)
 {
    // font.family();  → "Courier"
    // font.pointSize();  → 18
    // font.italic();  → false (true:Font styleがItalic)
    // font.bold();  → false (true:Font styleがBold)
    // font.weight();  → 50 (bold()=trueの時は75)
    // font.strikeOut();  → false (true:EffectsのstrikeOutオン)
    // font.underline();  → false (true:Effectsのunderlineオン)
 }


QFontDialogクラスのオプション(enum QFontDialog::FontDialogOption)

オプション名 説明
NoButtons 0x00000001 [OK]ボタンと[キャンセル]ボタンを表示しない。
(ライブダイアログで役立つ)
ただし、ダイアログ右上の[閉じる]ボタンが使用できなくなる。
DontUseNativeDialog 0x00000002 OS標準ではなくQt標準のフォント選択を使用する。
指定しない場合、Qt標準のフォント選択を使用する。
ScalableFonts 0x00000004 スケーラブルフォントを表示する。
スケーラブルフォントとは、拡大縮小しても精度の変わらないフォントである。
NonScalableFonts 0x00000008 スケーラブルフォント以外を表示する。
MonospacedFonts 0x00000010 等幅フォントを表示する。
ProportionalFonts 0x00000020 可変幅フォントを表示する。


第1引数は必須であり、他の引数を全て省略する時、標準のフォント選択ダイアログが表示される。
この時、ダイアログのタイトルは"Select Font"、使用可能なフォントをアルファベット順に並べて、その先頭が選択された状態となる。

 bool ok;
 QFont font = QFontDialog::getFont(&ok);



モーダルダイアログ

 // 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();
 }