如何保持window的单个实例?

How to keep a single instance of the window?

我有下一个 QML:

import Qt.labs.platform 1.0

SystemTrayIcon {
    visible: true
    iconSource: "qrc:/icons/ic_tray.png"
    menu: Menu {
        MenuItem {
            text: qsTr("Settings")
            onTriggered: {
                // Don't create a new object if it exists, just show
                var settings = Qt.createComponent("main.qml")
                var form = settings.createObject(this)
                form.show()
            }
        }
        MenuItem {
            text: qsTr("Quit")
            onTriggered: Qt.quit() // Just hide an existing
        }
    }
}

如何仅创建 main.qml 一次并在 show/hide 之后创建?
P.S. 我正在学习 Qt,仅包括 QtQuick 2

您可以在 onCompleted 中创建组件。

SystemTrayIcon {
    visible: true
    iconSource: "qrc:/icons/ic_tray.png"

    menu: Menu {
        MenuItem {
            text: qsTr("Settings")
            property var form
            onTriggered: {
                form.show()
            }
            Component.onCompleted: {
                // Don't create a new object if it exists, just show
                var settings = Qt.createComponent("Test.qml")
                form = settings.createObject(this)
            }
        }
        MenuItem {
            text: qsTr("Quit")
            onTriggered: Qt.quit() // Just hide an existing
        }
    }
}

根据您的应用程序的结构,最好的方法可能是从 "further up" 您的用户界面结构中传入托盘图标应作为 属性 控制的 window .

首先,扩展您的托盘图标组件并向其添加 "window" 属性:

import QtQuick 2.9
import QtQuick.Window 2.2
import Qt.labs.platform 1.0

SystemTrayIcon {
    id: trayIcon

    // this property holds the window the tray icon controls:
    property Window window

    visible: true

    iconSource: "qrc:/icons/ic_tray.png"
    menu: Menu {
        MenuItem {
            text: qsTr("Settings")
            onTriggered: {
                trayIcon.window.show();
            }
        }
        MenuItem {
            text: qsTr("Quit")
            onTriggered: Qt.quit() // Just hide an existing
        }
    }
}

现在,您可以实例化托盘图标,例如在你的主要 window 中像这样:

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    id: mainWindow

    width: 800
    height: 600

    TrayIcon { window: mainWindow }
}

在这种情况下,托盘图标将控制主 window 本身;但是,您可以轻松地在主 window 中创建设置 window 的单个实例并将其传递给托盘图标。