Menu QML Type

コンテキストメニューやポップアップメニューとして使えるメニューポップアップ。詳細...

Import Statement: import QtQuick.Controls
Inherits:

Popup

プロパティ

メソッド

  • Action actionAt(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void addAction(Action action) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void addItem(Item item)
  • void addMenu(Menu menu) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void dismiss() (since QtQuick.Controls 2.3 (Qt 5.10))
  • void insertAction(int index, Action action) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void insertItem(int index, Item item)
  • void insertMenu(int index, Menu menu) (since QtQuick.Controls 2.3 (Qt 5.10))
  • Item itemAt(int index)
  • Menu menuAt(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void moveItem(int from, int to)
  • void popup(MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(Item parent, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(point pos, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(Item parent, point pos, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(real x, real y, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void popup(Item parent, real x, real y, MenuItem item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void removeAction(Action action) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void removeItem(Item item) (since QtQuick.Controls 2.3 (Qt 5.10))
  • void removeMenu(Menu menu) (since QtQuick.Controls 2.3 (Qt 5.10))
  • Action takeAction(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • MenuItem takeItem(int index) (since QtQuick.Controls 2.3 (Qt 5.10))
  • Menu takeMenu(int index) (since QtQuick.Controls 2.3 (Qt 5.10))

詳細説明

macOSのネイティブメニュー。

非ネイティブのマテリアル・スタイルのメニュー。

メニューには主に2つの使用例があります:

  • コンテキストメニュー:例えば、右クリックした後に表示されるメニュー。
  • ポップアップメニュー:例えば、ボタンをクリックした後に表示されるメニュー。

コンテキスト・メニューとして使用する場合、メニューを開くにはpopup() を呼び出すことをお勧めします。位置が明示的に指定されない限り、マウスカーソルが利用可能なデスクトップ・プラットフォームでは、メニューはマウスカーソルの位置に置かれ、そうでない場合は親アイテムの中央に置かれます。

MouseArea {
    anchors.fill: parent
    acceptedButtons: Qt.LeftButton | Qt.RightButton
    onClicked: {
        if (mouse.button === Qt.RightButton)
            contextMenu.popup()
    }
    onPressAndHold: {
        if (mouse.source === Qt.MouseEventNotSynthesized)
            contextMenu.popup()
    }

    Menu {
        id: contextMenu
        MenuItem { text: "Cut" }
        MenuItem { text: "Copy" }
        MenuItem { text: "Paste" }
    }
}

ポップアップ・メニューとして使用する場合は、xy の座標をそれぞれのプロパティで指定して位置を指定し、open() を呼び出してメニューを開くのが最も簡単です。

Button {
    id: fileButton
    text: "File"
    onClicked: menu.open()

    Menu {
        id: menu
        y: fileButton.height

        MenuItem {
            text: "New..."
        }
        MenuItem {
            text: "Open..."
        }
        MenuItem {
            text: "Save"
        }
    }
}

ボタンがクリックされたときにメニューも閉じる必要がある場合は、Popup.CloseOnPressOutsideParent フラグを使用します:

onClicked: menu.visible = !menu.visible

Menu {
    // ...
    closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent

QtQuick.Controls 2.3 (Qt 5.10)から、Menuの中にサブメニューを作成し、Actionオブジェクトを宣言することもできるようになりました:

Menu {
    Action { text: "Cut" }
    Action { text: "Copy" }
    Action { text: "Paste" }

    MenuSeparator { }

    Menu {
        title: "Find/Replace"
        Action { text: "Find Next" }
        Action { text: "Find Previous" }
        Action { text: "Replace" }
    }
}

サブメニューは、マウスカーソルが利用可能なデスクトップ・プラットフォームではデフォルトでcascading 。非カスケード・メニューは一度に1つのメニューが表示され、親メニューの上にセンタリングされます。

通常、メニュー項目は静的にメニューの子として宣言されますが、Menuは動的にaddinsertmoveremove 項目へのAPIも提供します。メニューの項目にはitemAt() やcontentChildren を使ってアクセスすることができます。

MenuItems はMenuで最もよく使われますが、どのようなタイプの項目でも含めることができます。

余白

Popupから継承されているように、Menuはmargins をサポートしています。デフォルトでは、すべてのビルトインスタイルは、メニューがウィンドウの境界内に保たれるように、Menuのマージンに0 を指定します。メニューがウィンドウの外に出るようにするには(例えば、メニューが視界に入るようにアニメーションさせるには)、margin プロパティを-1 に設定します。

メニュー項目の動的生成

メニュー項目を動的に作成するには、Instantiator または動的オブジェクト作成を使用します。

Instantiator の使用

メニュー項目を動的に生成するには、Instantiator を使用します。次のコードでは、"Recent Files" サブメニューを実装しています:

Menu {
    title: qsTr("File")

    Menu {
        id: recentFilesMenu
        title: qsTr("Recent Files")
        enabled: recentFilesInstantiator.count > 0

        Instantiator {
            id: recentFilesInstantiator
            model: settings.recentFiles
            delegate: MenuItem {
                text: settings.displayableFilePath(modelData)
                onTriggered: loadFile(modelData)
            }

            onObjectAdded: (index, object) => recentFilesMenu.insertItem(index, object)
            onObjectRemoved: (index, object) => recentFilesMenu.removeItem(object)
        }

        MenuSeparator {}

        MenuItem {
            text: qsTr("Clear Recent Files")
            onTriggered: settings.clearRecentFiles()
        }
    }
}

動的オブジェクトの作成

Qt.createComponent() を使って、QMLファイルからコンポーネントを動的に読み込むこともできます。コンポーネントの準備ができたら、createObject()メソッドを呼び出すことで、そのコンポーネントのインスタンスを生成することができます。

Row {
    anchors.centerIn: parent

    Component {
        id: menuItemComponent

        MenuItem {}
    }

    Button {
        id: button
        text: "Menu"
        onClicked: menu.open()
        Menu {
            id: menu
        }
    }

    Button {
        text: "Add item"
        onClicked: {
            onClicked: {
                let menuItem = menuItemComponent.createObject(
                    menu.contentItem, { text: qsTr("New item") })
                menu.addItem(menuItem)
            }
        }
    }
}

Qt 6.8 以降、メニューはプラットフォームによって 3 種類の実装があります。popupType を設定することで、どれを優先するかを選ぶことができます。これにより、メニューを別ウィンドウとして表示するか、親ウィンドウ内のアイテムとして表示するか、ネイティブメニューとして表示するかを制御できます。これらのオプションについてはhere をご覧ください。

デフォルトのpopupType はスタイルによって決まります。例えば、macOS スタイルでは Popup.Native に設定されますが、Imagine スタイルでは Popup.Window が使用されます(スタイルでポップアップの種類が設定されていない場合のデフォルトです)。メニューにカスタマイズを追加し、スタイルに関係なくそれらを使用したい場合は、ポップアップタイプを明示的にPopup.Window (またはPopup.Item )に設定する必要があります。もう1つの方法は、Qt::AA_DontUseNativeMenuWindows application attribute を設定することです。これは、スタイルに関係なく、アプリケーション全体のネイティブ・コンテキスト・メニューを無効にします。

デフォルトのpopupType はスタイルによって決まります。例えばmacOSスタイルでは Popup.NativeImagineスタイルでは Popup.Window (スタイルでポップアップタイプが設定されていない場合のデフォルト)を使用します。メニューにカスタマイズを追加し、スタイルに関係なくそれらを使用したい場合は、ポップアップタイプを明示的にPopup.Window (またはPopup.Item )に設定する必要があります。

メニューが優先タイプを使用できるかどうかはプラットフォームに依存します。Popup.Item はすべてのプラットフォームでサポートされていますが、Popup.Window は通常デスクトッププラットフォームでのみサポートされています。さらに、メニューがnative menubar の中にある場合、メニューはネイティブになります。また、メニューが他のメニューの中のサブメニューである場合、親(またはルート)メニューがタイプを決定します。

ネイティブメニュー使用時の制限

popupTypePopup.Native に設定する場合、Popup.ItemPopup.Window を使用する場合と比較して、いくつかの制限と違いがあります。

APIの違い

ネイティブメニューを使用する場合、Menu API のサブセットのみがすべてのプラットフォームでサポートされます:

さらに、ポップアップの表示(たとえばopen() やpopup() など)は、プラットフォームによってはブロッキング・コールになります。これは、メニューが再び閉じられる前に呼び出しが返されないことを意味し、アプリケーションのロジックに影響を与える可能性があります。これは、アプリケーションが複数のプラットフォームをターゲットにしており、ネイティブメニューがサポートされていないプラットフォームで実行されることがある場合、特に考慮する必要があります。その場合、popupType はPopup.Item などにフォールバックし、open() への呼び出しはブロックされません。

MenuItem のようなアイテムは、対応するネイティブ・メニュー・アイテムのクリックにシグナルを発するなどして反応しますが、ネイティブの対応するアイテムに置き換えられます。

レンダリングの違い

ネイティブメニューは、プラットフォーム上で利用可能なネイティブメニューAPIを使用して実装されます。そのため、これらのメニューとそのコンテンツはQMLではなく、プラットフォームによってレンダリングされます。つまり、delegate はレンダリングに使用されません。しかし、onCompleted() のような関数はプラットフォームやpopupType に関係なく実行されるように、常にインスタンス化されます(ただし非表示)。

対応プラットフォーム

ネイティブ・メニューは現在、以下のプラットフォームでサポートされています:

  • アンドロイド
  • iOS
  • Linux(GTK+プラットフォーム・テーマで動作している場合、スタンドアロンのコンテキスト・メニューとしてのみ利用可能)
  • macOS
  • Windows

メニューのカスタマイズ,MenuItem,メニューコントロール,ポップアップコントロール,JavaScript からの動的 QML オブジェクト作成,Popup type,[QML],popupTypeも参照してください

プロパティ ドキュメント

cascade : bool [since QtQuick.Controls 2.3 (Qt 5.10)]

このプロパティはメニューがサブメニューをカスケードするかどうかを保持します。

デフォルト値はプラットフォーム固有です。マウスカーソルが利用可能なデスクトッププラットフォームでは、メニューはデフォルトでカスケード表示されます。カスケードされないメニューは、一度に1つのメニューが表示され、親メニューの上にセンタリングされます。

注意 :メニューが開いている間、プロパティの値を変更しても効果はありません。

注意: このプロパティは、non-native Menu を使用している場合のみサポートされます。

このプロパティは、QtQuick.Controls 2.3 (Qt 5.10) で導入されました。

overlapも参照してください


contentData : list<QtObject> [default]

このプロパティは、コンテンツ・データのリストを保持します。

このリストには、QMLでメニューの子として宣言されたすべてのオブジェクトと、addItem()、insertItem()メソッドを使って動的に追加、挿入されたアイテムが含まれます。

注: contentChildren とは異なり、contentData には視覚的でない QML オブジェクトも含まれます。アイテムが挿入されたり移動されたりしても、並び替えは行われません。

Item::data およびcontentChildrenも参照してください


contentModel : model [read-only]

このプロパティは、メニュー項目を表示するために使用されるモデルを保持する。

コンテンツモデルは視覚化のために提供される。これは、メニューの内容を提示するコンテンツアイテムにモデルとして割り当てることができる。

Menu {
    id: menu
    contentItem: ListView {
        model: menu.contentModel
    }
}

このモデルによって、メニュー項目をメニューの子として静的に宣言することができる。


count : int [read-only, since QtQuick.Controls 2.3 (Qt 5.10)]

このプロパティはアイテムの数を保持する。

このプロパティは、QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


currentIndex : int [since QtQuick.Controls 2.3 (Qt 5.10)]

このプロパティは、現在ハイライトされている項目のインデックスを保持します。

メニュー項目は、マウスホバーまたはキーボードナビゲーションによってハイライトされます。

注意: このプロパティは、non-native Menu を使用している場合のみサポートされます。

このプロパティは、QtQuick.Controls 2.3 (Qt 5.10) で導入されました。

MenuItem::highlightedも参照してください


delegate : Component [since QtQuick.Controls 2.3 (Qt 5.10)]

このプロパティは、アクションを提示するアイテムの作成に使用されるコンポーネントを保持します。

Menu {
    Action { text: "Cut" }
    Action { text: "Copy" }
    Action { text: "Paste" }
}

注: デリゲートは、non-native Menu を使用している場合にのみ表示されます。

このプロパティは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。

Actionも参照してください


focus : bool

このプロパティは、ポップアップがフォーカスを欲しているかどうかを保持します。

ポップアップが実際にフォーカスを受け取ると、activeFocustrue になります。詳細については、「Qt Quick のキーボードフォーカス」を参照してください。

デフォルト値はtrue です。

注意: このプロパティは、non-native Menu を使用している場合のみサポートされます。

activeFocusも参照してください


icon group

icon.cache : bool

icon.color : color

icon.height : int

icon.name : string

icon.source : url

icon.width : int

このプロパティグループは、QtQuick.Controls 6.5 で追加されました。

名前説明
名前このプロパティは、使用するアイコンの名前を保持します。

アイコンはプラットフォームのテーマから読み込まれます。アイコンがテーマにある場合は、icon.source が設定されていても、常にそのアイコンを使用します。アイコンが見つからない場合は、icon.source

テーマ・アイコンの詳細については、QIcon::fromTheme()を参照のこと。

ソースこのプロパティは、使用するアイコンの名前を保持します。

アイコンは通常の画像として読み込まれます。

icon.name が設定され、有効なテーマアイコンを参照している場合、このプロパティの代わりに常にそのアイコンが使用されます。

このプロパティはアイコンの幅を保持する。

アイコンの幅がこの値を超えることはありませんが、必要に応じて縮小されます。

高さこのプロパティはアイコンの高さを保持します。

アイコンの高さがこの値を超えることはありませんが、必要に応じて縮小されます。

このプロパティはアイコンの色を保持する。

色が"transparent" に設定されていない限り、アイコンは指定された色で着色されます。

キャッシュこのプロパティは、アイコンをキャッシュするかどうかを指定します。

デフォルト値はtrueである。

詳細については、cache を参照してください。

このプロパティはQtQuick.Controls 2.13 で導入されました。

注意: このプロパティは、non-native Menu を使用している場合のみサポートされます。

AbstractButton::textAbstractButton::display 、およびQt Quick Controls の Iconsも参照してください


overlap : real [since QtQuick.Controls 2.3 (Qt 5.10)]

このプロパティは、メニューがその親メニューに水平に重なるピクセル量を保持する。

このプロパティは、メニューがカスケードサブメニューとして使用される場合にのみ効果を持つ。

デフォルト値はスタイルに依存する。

注意 :メニューが開いている間、プロパティの値を変更しても効果はない。

注意: このプロパティは、non-native Menu を使用している場合のみサポートされます。

このプロパティは、QtQuick.Controls 2.3 (Qt 5.10) で導入されました。

cascadeも参照してください


title : string

このプロパティは、メニューのタイトルを保持します。

メニューのタイトルは、メニューがサブメニューの場合はメニュー項目のテキストに、メニューバーの場合はツールボタンのテキストに表示されます。


方法 ドキュメント

マウスカーソルが利用可能なデスクトップ・プラットフォーム上では、マウスカーソルの位置にメニューを開き、そうでない場合は、parent アイテムの上にメニューをセンタリングします。

メニューはオプションで特定のメニューitem に合わせることができる。current. item が指定されない場合、currentIndex-1 に設定されます。

この QML メソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。

Popup::open()も参照してください


popups 座標系で指定された位置pos に、つまりparent アイテムからの相対座標にメニューを開きます。

メ ニ ュ ーはオプシ ョ ンで、 特定のメ ニ ュ ーitem に整列 さ せる こ と も で き ます。current. item が指定されていない場合、currentIndex-1 に設定されます。

この QML メソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。

Popup::open()も参照してください


popups 座標系で指定された位置x,y に、つまりparent アイテムからの相対座標にメニューを開きます。

メ ニ ュ ーはオプシ ョ ンで特定のメ ニ ュ ーitem に整列 さ せる こ と も で き ます。current. item が指定されていない場合、currentIndex-1 に設定されます。

この QML メソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。

dismiss() およびPopup::open()も参照してください


[since QtQuick.Controls 2.3 (Qt 5.10)] Action actionAt(int index)

index にあるアクションを返します。インデックスが有効でないか、指定したインデックスにアクションがない場合はnull を返します。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


[since QtQuick.Controls 2.3 (Qt 5.10)] void addAction(Action action)

action をメニューの最後に追加します。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


void addItem(Item item)

item を項目リストの最後に追加します。


[since QtQuick.Controls 2.3 (Qt 5.10)] void addMenu(Menu menu)

menu をサブメニューとしてメニューの最後に追加します。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


[since QtQuick.Controls 2.3 (Qt 5.10)] void dismiss()

このメニューが属する階層内のすべてのメニューを閉じます。

注: close() がメニューとそのサブメニューのみを閉じるのとは異なり(non-native menus を使用した場合)、dismiss() は親メニューを含むメニューの階層全体を閉じます。実際には、close() はメニューの階層でナビゲーションを実装する場合などに適しており、dismiss() はメニューの階層全体を閉じるのに適したメソッドです。

このメソッドはQtQuick.Controls 2.3 (Qt 5.10)で導入されました。

popup() およびPopup::close()も参照してください


[since QtQuick.Controls 2.3 (Qt 5.10)] void insertAction(int index, Action action)

indexaction を挿入します。インデックスがメニューのすべての項目内にあります。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


void insertItem(int index, Item item)

indexitem を挿入します。


[since QtQuick.Controls 2.3 (Qt 5.10)] void insertMenu(int index, Menu menu)

index にサブメニューとしてmenu を挿入します。インデックスはメニューのすべての項目内にあります。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


Item itemAt(int index)

index にあるアイテムを返します。存在しない場合はnull を返します。


インデックスが有効でないか、指定されたインデックスにサブメニューがない場合は、index 、またはnull にサブメニューを返します。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


void moveItem(int from, int to)

項目from のインデックスto を別のインデックスに移動します。


[since QtQuick.Controls 2.3 (Qt 5.10)] void removeAction(Action action)

指定されたaction を削除して破棄します。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


[since QtQuick.Controls 2.3 (Qt 5.10)] void removeItem(Item item)

指定されたitem を削除・破棄します。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


[since QtQuick.Controls 2.3 (Qt 5.10)] void removeMenu(Menu menu)

指定されたmenu を削除・破棄します。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


[since QtQuick.Controls 2.3 (Qt 5.10)] Action takeAction(int index)

index のアクションを削除して返します。インデックスはメニューの全アイテム内です。

注意: アクションの所有権は呼び出し元に移ります。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


[since QtQuick.Controls 2.3 (Qt 5.10)] MenuItem takeItem(int index)

index にある項目を削除して返します。

注意: アイテムの所有権は呼び出し元に移ります。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


[since QtQuick.Controls 2.3 (Qt 5.10)] Menu takeMenu(int index)

index にあるメニューを削除して返します。インデックスはメニューのすべての項目内にあります。

注意: メニューの所有権は呼び出し元に移ります。

このメソッドは QtQuick.Controls 2.3 (Qt 5.10) で導入されました。


本書に含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。