「QMLの基礎 - ダイアログ」の版間の差分
| 120行目: | 120行目: | ||
<br> | <br> | ||
== ファイル選択ダイアログ == | == ファイル選択ダイアログ == | ||
==== FileDialogコンポーネント ==== | |||
まず、必要なモジュールをインポートして、<code>FileDialog</code>コンポーネントを使用して、ファイル選択ダイアログを作成する。<br> | |||
これは、一般的に、アプリケーションのメインウィンドウや特定のコンポーネント内で記述する。<br> | |||
<br> | |||
<code>FileDialog</code>コンポーネントのプロパティを以下に示す。<br> | |||
* <code>title</code>プロパティ | |||
*: ダイアログのタイトルを設定する。 | |||
* <code>nameFilters</code>プロパティ | |||
*: 表示するファイルタイプを制限することができる。 | |||
* <code>selectedFiles</code>プロパティ | |||
*: 選択されたファイルのパスが配列として格納される。 | |||
*: 一般的に、単一ファイル選択の場合は、<u>selectedFiles[0]</u>を使用する。 | |||
* <code>fileMode</code>プロパティ | |||
*: 単一ファイル選択または複数ファイル選択を指定できる。 | |||
<br> | |||
<code>FileDialog</code>コンポーネントのシグナルハンドラ (スロット) を以下に示す。<br> | |||
* <code>onAccepted</code>ハンドラ | |||
*: ファイルが選択された場合の処理を定義する。 | |||
* <code>onRejected</code>ハンドラ | |||
*: ダイアログがキャンセルされた場合の処理を定義する。 | |||
<br> | |||
ファイル選択ダイアログを表示する場合は、<code>open</code>メソッドを実行してダイアログを表示する。<br> | |||
<br> | |||
<syntaxhighlight lang="qml"> | |||
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: "ファイルが選択されていません" | |||
} | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>Qt 6以降では、<code>QtQuick.Dialogs</code>モジュールを使用する。</u><br> | |||
<u>Qt 5では、<code>Qt.labs.platform</code>モジュールを使用する。</u><br> | |||
<br> | |||
<u>ファイル選択ダイアログの動作は、使用しているプラットフォーム (Windows、MacOS、Linux) により異なる場合がある。</u><br> | |||
<br> | |||
==== QWidgetのファイル選択ダイアログ ==== | ==== QWidgetのファイル選択ダイアログ ==== | ||
QMLからQWidgetのファイル選択ダイアログを使用することもできる。<br> | QMLからQWidgetのファイル選択ダイアログを使用することもできる。<br> | ||
2024年9月2日 (月) 20:51時点における版
概要
ディレクトリ選択ダイアログ
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();
}