QMLの基礎 - ダイアログ
概要
ディレクトリ選択ダイアログ
FolderDialog
FolderDialog
は、ネイティブプラットフォームのディレクトリ選択ダイアログのためのQML APIを提供する。
※注意
Qt.labs Platform
モジュールのアイテムは、将来のバージョンでの互換性が保証されていない。
ディレクトリ選択ダイアログを表示するには、FolderDialog
の定義やプロパティを記述して、open
メソッドを呼び出す。
currentFolder
プロパティは、ダイアログ内で現在選択されているディレクトリのURLが設定される。
folder
プロパティは、ダイアログの選択ボタンにより選択された後にのみ設定される。
FolderDialog
の使用手順を以下に示す。
Qt Labs Platform
モジュールは、ネイティブな実装が利用できないプラットフォーム上のフォールバックとしてQt Widgetsを使用している。
したがって、Qt Labs Platform
モジュールのアイテムを使用する場合、
QtWidgets
ライブラリをリンクして、QGuiApplication
クラスの代わりにQApplication
クラスを使用する必要がある。
まず、QtWidgets
ライブラリをリンクするには、.proファイルに以下の設定を追記する。
# .proファイル QT += 〜 widgets
main
関数において、QGuiApplication
クラスの代わりにQApplication
クラスのインスタンスを生成する。
// main.cppファイル
#include <QApplication>
//#include <QGUIApplication>
#include <QQmlApplicationEngine>
// ...略
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
//QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QApplication app(argc, argv);
QQmlApplicationEngine engine;
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app,
[url](QObject *obj, const QUrl &objUrl)
{
if (!obj && url == objUrl)
{
QCoreApplication::exit(-1);
}
}, Qt::QueuedConnection);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
FileDialog
やStandardPaths
も参照すること。
FileDialog
のプロパティを以下に示す。
- acceptLabel
- 値 : string型 (既定値 : 空の文字列)
- ダイアログの選択ボタンに表示されるラベルテキストを設定する。
- 空の文字列を設定すると、プラットフォームの標準のラベルテキスト(Open)が使用される。
- rejectLabelプロパティも参照すること。
- rejectLabel
- 値 : string (既定値 : 空の文字列)
- ダイアログのキャンセルボタンに表示されるラベルテキストを設定する。
- 空の文字列を設定すると、プラットフォームの標準のラベルテキスト(Cancel)が使用される。
- acceptLabelプロパティも参照すること。
- currentFolder
- 値 : url型 (既定値 : なし)
- ダイアログで現在選択されているフォルダを設定する。
- folderプロパティとは異なり、currentFolderプロパティは、ダイアログ内でディレクトリを選択している間、最終的な選択がなされる前でも更新される。
- folderプロパティも参照すること。
- folder
- 値 : url型 (既定値 : なし)
- 最終的に選択されたディレクトリのURLが設定される。
- currentFolderプロパティとは異なり、folderプロパティはダイアログでディレクトリを選択している間は更新されず、最終的な選択が行われた後にのみ更新される。
- つまり、Openボタンを押下した場合、または、acceptedシグナルを処理して最終選択をした場合のみである。
- currentFolderプロパティおよびacceptedメソッドも参照すること。
- options
- 値 : enumlation型 (既定値 : なし)
- ダイアログの外観に影響を与える様々なオプションを設定する。
- 既定値では、全てのオプションが無効になっている。
- optionsプロパティは、ダイアログを表示する前に設定する必要がある。
- ダイアログが表示されている間に設定を変更した場合、ダイアログに影響を与えることは保証されていない。
- 使用可能なoptionsプロパティの値を、以下に示す。
定数 | 説明 |
---|---|
FolderDialog.ShowDirsOnly | ディレクトリのみを表示する。 既定値では、フォルダとディレクトリの両方を表示する。 |
FolderDialog.DontResolveSymlinks | シンボリックリンクを解決しない。 既定値では、シンボリックリンクを解決する。 |
FolderDialog.ReadOnly | ダイアログ内でディレクトリの作成を許可しない。 |
ファイル選択ダイアログ
FileDialogコンポーネント
まず、必要なモジュールをインポートして、FileDialog
コンポーネントを使用して、ファイル選択ダイアログを作成する。
これは、一般的に、アプリケーションのメインウィンドウや特定のコンポーネント内で記述する。
FileDialog
コンポーネントのプロパティを以下に示す。
title
プロパティ- ダイアログのタイトルを設定する。
nameFilters
プロパティ- 表示するファイルタイプを制限することができる。
selectedFiles
プロパティ- 選択されたファイルのパスが配列として格納される。
- 一般的に、単一ファイル選択の場合は、selectedFiles[0]を使用する。
fileMode
プロパティ- 単一ファイル選択または複数ファイル選択を指定できる。
FileDialog
コンポーネントのシグナルハンドラ (スロット) を以下に示す。
onAccepted
ハンドラ- ファイルが選択された場合の処理を定義する。
onRejected
ハンドラ- ダイアログがキャンセルされた場合の処理を定義する。
ファイル選択ダイアログを表示する場合は、open
メソッドを実行してダイアログを表示する。
import QtQuick
import QtQuick.Controls
import QtQuick.Dialogs
// ...略
FileDialog {
id: fileDialog
title: "ファイルを選択してください"
nameFilters: ["テキストファイル (*.txt)", "すべてのファイル (*)"]
// ファイルを選択した場合
onAccepted: {
console.log("選択されたファイル:", fileDialog.selectedFiles)
selectedFileText.text = "選択されたファイル: " + fileDialog.selectedFiles[0]
}
// キャンセルした場合
onRejected: {
console.log("ファイル選択がキャンセルされました")
}
}
Column {
anchors.centerIn: parent
spacing: 20
// ダイアログを表示するためのトリガ (例: ボタン)
Button {
text: "ファイルを開く"
onClicked: fileDialog.open()
}
Text {
id: selectedFileText
text: "ファイルが選択されていません"
}
}
※注意
Qt 6以降では、QtQuick.Dialogs
モジュールを使用する。
Qt 5では、Qt.labs.platform
モジュールを使用する。
ファイル選択ダイアログの動作は、使用しているプラットフォーム (Windows、MacOS、Linux) により異なる場合がある。
QWidgetのファイル選択ダイアログ
QMLからQWidgetのファイル選択ダイアログを使用することもできる。
ただし、純粋なQMLアプリケーションではなくなることに注意する。
QWidgetを使用するには、QGuiApplication
からQApplication
に変更する必要がある。
つまり、QWidgetインスタンスの作成に必要な機能を提供するQApplication
を使用する。
- QGuiApplication
- ウインドウやGUI (OpenGLやQtQuick等のウィジェットに関連しないもの) の処理に関連するものである。
- QApplication
- ウィジェットの処理に関連する機能であり、QGuiApplicationを拡張するものである。
// main.cppファイル
#include <QApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
set_qt_environment();
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreated,
&app,
[url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
},
Qt::QueuedConnection);
engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");
engine.addImportPath(":/");
engine.load(url);
if (engine.rootObjects().isEmpty()) {
return -1;
}
return app.exec();
}