「QMLの基礎 - ダイアログ」の版間の差分
5行目: | 5行目: | ||
== ディレクトリ選択ダイアログ == | == ディレクトリ選択ダイアログ == | ||
==== FolderDialog ==== | ==== FolderDialog ==== | ||
<code>FolderDialog</code> | まず、必要なモジュールをインポートして、<code>FolderDialog</code>コンポーネントを使用する。<br> | ||
<br> | |||
<code>FolderDialog</code>コンポーネントのプロパティを以下に示す。 | |||
* <code>title</code>プロパティ | |||
*: ダイアログのタイトルを設定する。 | |||
* <code>currentFolder</code>プロパティ | |||
*: 初期表示するフォルダを設定する。 | |||
*: <code>StandardPaths</code>を使用することにとより、プラットフォーム間で一貫した方法で標準的なディレクトリを参照できる。 | |||
*: <br> | |||
*: 以下の例では、<code>StandardPaths</code>を使用してドキュメントディレクトリを指定している。 | |||
<br> | |||
<code>FolderDialog</code>コンポーネントのシグナルハンドラ (スロット) を以下に示す。<br> | |||
* <code>onAccepted</code>ハンドラ | |||
*: ディレクトリが選択された場合の処理を定義する。 | |||
* <code>onRejected</code>ハンドラ | |||
*: キャンセルされた場合の処理を定義する。 | |||
<br> | |||
<syntaxhighlight lang="qml"> | |||
import QtCore | |||
import QtQuick | |||
import QtQuick.Controls | |||
import QtQuick.Dialogs | |||
// ...略 | |||
FolderDialog { | |||
id: folderDialog | |||
title: "フォルダを選択してください" | |||
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0] | |||
options: FolderDialog.ShowDirsOnly | FolderDialog.DontResolveSymlinks | |||
acceptLabel: "選択" | |||
rejectLabel: "キャンセル" | |||
modality: Qt.WindowModal | |||
onAccepted: { | |||
console.log("選択されたフォルダ: " + folderDialog.selectedFolder) | |||
selectedFolderText.text = "選択されたフォルダ: " + folderDialog.selectedFolder | |||
} | |||
onRejected: { | |||
console.log("フォルダ選択がキャンセルされました") | |||
} | |||
onFolderChanged: { | |||
console.log("現在のフォルダが変更されました: " + folderDialog.currentFolder) | |||
} | |||
onVisibleChanged: { | |||
if (visible) { | |||
console.log("フォルダダイアログが開かれました") | |||
} | |||
else { | |||
console.log("フォルダダイアログが閉じられました") | |||
} | |||
} | |||
} | |||
Column { | |||
spacing: 20 | |||
anchors.centerIn: parent | |||
// ダイアログを表示するためのトリガ (例: ボタン) | |||
Button { | |||
text: "フォルダを選択" | |||
onClicked: folderDialog.open() | |||
} | |||
Text { | |||
id: selectedFolderText | |||
text: "選択されたフォルダ: なし" | |||
} | |||
} | |||
Component.onCompleted: { | |||
// ディレクトリ選択ダイアログの初期設定およびカスタマイズをここで行うこともできる | |||
folderDialog.currentFolder = StandardPaths.standardLocations(StandardPaths.HomeLocation)[0] | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
この実装を使用することで、ユーザーはボタンをクリックしてフォルダ選択ダイアログを開き、フォルダを選択できます。選択されたフォルダのパスは画面に表示され、コンソールにも出力されます。 | |||
追加の注意点: | |||
- `FolderDialog`の`folder`プロパティは非推奨となっており、代わりに`currentFolder`を使用することが推奨されています。 | |||
- `StandardPaths`を使用することで、プラットフォーム間で一貫した方法で標準的なフォルダを参照できます。 | |||
- 実際のアプリケーションでは、選択されたフォルダのパスを使用して、ファイル操作やその他の処理を行うことができます。 | |||
このコードをカスタマイズして、特定のアプリケーションのニーズに合わせることができます。例えば、選択されたフォルダ内のファイル一覧を表示したり、特定の種類のファイルのみを扱うようにフィルタリングしたりすることが可能です。 | |||
<br> | <br> | ||
<u>※注意</u><br> | <u>※注意</u><br> | ||
15行目: | 103行目: | ||
<code>folder</code>プロパティは、ダイアログの選択ボタンにより選択された後にのみ設定される。<br> | <code>folder</code>プロパティは、ダイアログの選択ボタンにより選択された後にのみ設定される。<br> | ||
<br> | <br> | ||
<code>FolderDialog</code> | ==== QWidgetのディレクトリ選択ダイアログ ==== | ||
QMLからQWidgetのファイル選択ダイアログを使用することもできる。<br> | |||
<br> | |||
ただし、純粋なQMLアプリケーションではなくなることに注意する。<br> | |||
<br> | |||
QWidgetを使用するには、<code>QGuiApplication</code>から<code>QApplication</code>に変更する必要がある。<br> | |||
つまり、QWidgetインスタンスの作成に必要な機能を提供する<code>QApplication</code>を使用する。<br> | |||
<br> | |||
* QGuiApplication | |||
*: ウインドウやGUI (OpenGLやQtQuick等のウィジェットに関連しないもの) の処理に関連するものである。 | |||
* QApplication | |||
*: ウィジェットの処理に関連する機能であり、QGuiApplicationを拡張するものである。 | |||
<code>FolderDialog</code>は、ネイティブプラットフォームのディレクトリ選択ダイアログのためのQML APIを提供する。<br> | |||
<br> | |||
<u>※注意</u><br> | |||
<u><code>Qt.labs Platform</code>モジュールのアイテムは、将来のバージョンでの互換性が保証されていない。</u><br> | |||
<br> | |||
<code>Qt Labs Platform</code>モジュールは、ネイティブな実装が利用できないプラットフォーム上のフォールバックとしてQt Widgetsを使用している。<br> | <code>Qt Labs Platform</code>モジュールは、ネイティブな実装が利用できないプラットフォーム上のフォールバックとしてQt Widgetsを使用している。<br> | ||
したがって、<code>Qt Labs Platform</code>モジュールのアイテムを使用する場合、<br> | したがって、<code>Qt Labs Platform</code>モジュールのアイテムを使用する場合、<br> | ||
21行目: | 125行目: | ||
<br> | <br> | ||
まず、<code>QtWidgets</code>ライブラリをリンクするには、.proファイルに以下の設定を追記する。<br> | まず、<code>QtWidgets</code>ライブラリをリンクするには、.proファイルに以下の設定を追記する。<br> | ||
# . | <syntaxhighlight lang="make"> | ||
# Qtプロジェクトファイル (.pro) | |||
QT += | QT += widgets | ||
</syntaxhighlight> | |||
<br> | <br> | ||
<code>main</code>関数において、<code>QGuiApplication</code>クラスの代わりに<code>QApplication</code>クラスのインスタンスを生成する。<br> | <code>main</code>関数において、<code>QGuiApplication</code>クラスの代わりに<code>QApplication</code>クラスのインスタンスを生成する。<br> | ||
30行目: | 136行目: | ||
#include <QApplication> | #include <QApplication> | ||
#include <QQmlApplicationEngine> | #include <QQmlApplicationEngine> | ||
38行目: | 143行目: | ||
{ | { | ||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) | #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) | ||
QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); | QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); | ||
#endif | #endif | ||
119行目: | 223行目: | ||
</center> | </center> | ||
<br> | <br> | ||
== ファイル選択ダイアログ == | == ファイル選択ダイアログ == | ||
==== FileDialogコンポーネント ==== | ==== FileDialogコンポーネント ==== |
2024年9月2日 (月) 21:46時点における版
概要
ディレクトリ選択ダイアログ
FolderDialog
まず、必要なモジュールをインポートして、FolderDialog
コンポーネントを使用する。
FolderDialog
コンポーネントのプロパティを以下に示す。
title
プロパティ- ダイアログのタイトルを設定する。
currentFolder
プロパティ- 初期表示するフォルダを設定する。
StandardPaths
を使用することにとより、プラットフォーム間で一貫した方法で標準的なディレクトリを参照できる。- 以下の例では、
StandardPaths
を使用してドキュメントディレクトリを指定している。
FolderDialog
コンポーネントのシグナルハンドラ (スロット) を以下に示す。
onAccepted
ハンドラ- ディレクトリが選択された場合の処理を定義する。
onRejected
ハンドラ- キャンセルされた場合の処理を定義する。
import QtCore
import QtQuick
import QtQuick.Controls
import QtQuick.Dialogs
// ...略
FolderDialog {
id: folderDialog
title: "フォルダを選択してください"
currentFolder: StandardPaths.standardLocations(StandardPaths.DocumentsLocation)[0]
options: FolderDialog.ShowDirsOnly | FolderDialog.DontResolveSymlinks
acceptLabel: "選択"
rejectLabel: "キャンセル"
modality: Qt.WindowModal
onAccepted: {
console.log("選択されたフォルダ: " + folderDialog.selectedFolder)
selectedFolderText.text = "選択されたフォルダ: " + folderDialog.selectedFolder
}
onRejected: {
console.log("フォルダ選択がキャンセルされました")
}
onFolderChanged: {
console.log("現在のフォルダが変更されました: " + folderDialog.currentFolder)
}
onVisibleChanged: {
if (visible) {
console.log("フォルダダイアログが開かれました")
}
else {
console.log("フォルダダイアログが閉じられました")
}
}
}
Column {
spacing: 20
anchors.centerIn: parent
// ダイアログを表示するためのトリガ (例: ボタン)
Button {
text: "フォルダを選択"
onClicked: folderDialog.open()
}
Text {
id: selectedFolderText
text: "選択されたフォルダ: なし"
}
}
Component.onCompleted: {
// ディレクトリ選択ダイアログの初期設定およびカスタマイズをここで行うこともできる
folderDialog.currentFolder = StandardPaths.standardLocations(StandardPaths.HomeLocation)[0]
}
この実装を使用することで、ユーザーはボタンをクリックしてフォルダ選択ダイアログを開き、フォルダを選択できます。選択されたフォルダのパスは画面に表示され、コンソールにも出力されます。
追加の注意点:
- `FolderDialog`の`folder`プロパティは非推奨となっており、代わりに`currentFolder`を使用することが推奨されています。 - `StandardPaths`を使用することで、プラットフォーム間で一貫した方法で標準的なフォルダを参照できます。 - 実際のアプリケーションでは、選択されたフォルダのパスを使用して、ファイル操作やその他の処理を行うことができます。
このコードをカスタマイズして、特定のアプリケーションのニーズに合わせることができます。例えば、選択されたフォルダ内のファイル一覧を表示したり、特定の種類のファイルのみを扱うようにフィルタリングしたりすることが可能です。
※注意
Qt.labs Platform
モジュールのアイテムは、将来のバージョンでの互換性が保証されていない。
ディレクトリ選択ダイアログを表示するには、FolderDialog
の定義やプロパティを記述して、open
メソッドを呼び出す。
currentFolder
プロパティは、ダイアログ内で現在選択されているディレクトリのURLが設定される。
folder
プロパティは、ダイアログの選択ボタンにより選択された後にのみ設定される。
QWidgetのディレクトリ選択ダイアログ
QMLからQWidgetのファイル選択ダイアログを使用することもできる。
ただし、純粋なQMLアプリケーションではなくなることに注意する。
QWidgetを使用するには、QGuiApplication
からQApplication
に変更する必要がある。
つまり、QWidgetインスタンスの作成に必要な機能を提供するQApplication
を使用する。
- QGuiApplication
- ウインドウやGUI (OpenGLやQtQuick等のウィジェットに関連しないもの) の処理に関連するものである。
- QApplication
- ウィジェットの処理に関連する機能であり、QGuiApplicationを拡張するものである。
FolderDialog
は、ネイティブプラットフォームのディレクトリ選択ダイアログのためのQML APIを提供する。
※注意
Qt.labs Platform
モジュールのアイテムは、将来のバージョンでの互換性が保証されていない。
Qt Labs Platform
モジュールは、ネイティブな実装が利用できないプラットフォーム上のフォールバックとしてQt Widgetsを使用している。
したがって、Qt Labs Platform
モジュールのアイテムを使用する場合、
QtWidgets
ライブラリをリンクして、QGuiApplication
クラスの代わりにQApplication
クラスを使用する必要がある。
まず、QtWidgets
ライブラリをリンクするには、.proファイルに以下の設定を追記する。
# Qtプロジェクトファイル (.pro)
QT += widgets
main
関数において、QGuiApplication
クラスの代わりにQApplication
クラスのインスタンスを生成する。
// main.cppファイル
#include <QApplication>
#include <QQmlApplicationEngine>
// ...略
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
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.OpenFile
- 単一ファイルを選択する。 (デフォルト)
FileDialog.OpenFiles
- 複数ファイルを選択する。
FileDialog.SaveFile
- ファイルを保存する。
options
プロパティ- ダイアログの動作オプションを設定する。
- 指定できる値を以下に示す。
FileDialog.ReadOnly
- 読み取り専用モード
FileDialog.DontResolveSymlinks
- シンボリックリンクを解決しない。
currentFolder
プロパティ- 初期表示するディレクトリを指定する。
selectedFile
プロパティ- 選択されたファイルのURLを保持する。 (単一ファイル選択時)
selectedFiles
プロパティ- 選択されたファイルのURL配列 (複数ファイル選択時)
acceptLabel
プロパティ- [開く]ボタンおよび[保存]ボタンのラベルをカスタマイズする。
rejectLabel
プロパティ- [キャンセル]ボタンのラベルをカスタマイズする。
FileDialog
コンポーネントのシグナルハンドラ (スロット) を以下に示す。
onAccepted
ハンドラ- ファイルが選択された場合の処理を定義する。
onRejected
ハンドラ- ダイアログがキャンセルされた場合の処理を定義する。
selectionChanged
ハンドラ- ファイル選択が変更された時に発行される。
ファイル選択ダイアログを表示する場合は、open
メソッドを実行してダイアログを表示する。
import QtQuick
import QtQuick.Controls
import QtQuick.Dialogs
// ...略
FileDialog {
id: fileDialog
title: "ファイルを選択してください"
nameFilters: ["テキストファイル (*.txt)", "すべてのファイル (*)"]
fileMode: FileDialog.OpenFile
options: FileDialog.ReadOnly
// ファイルを選択した場合
onAccepted: {
console.log("選択されたファイル:", fileDialog.selectedFiles)
selectedFileText.text = "選択されたファイル: " + fileDialog.selectedFiles[0]
}
// ファイル選択が変更された場合
onSelectionChanged: {
console.log("現在選択中: ", fileDialog.currentFile)
}
// キャンセルした場合
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();
}