3

我想显示一个消息框,它在main.qml中实现(作为所有其他组件之上的一个层)。该函数showMessage()使 QML 消息框可见并设置文本。因此main.qml中的代码可以显示消息框,但其他组件(不在main.qml中)也应该能够显示消息框。

到目前为止,我的想法是创建一个 C++ QML 组件,该组件具有一个displayMessage()调用showMessage()根上下文函数的函数(→ main.qml)。

mail.qml(根组件)

import QtQuick 1.0
// [...]

Rectangle {
    id: main

    function showMessage(text) {
        // make a message area visible and set text
    }

    // [...]

    // message box implementation
}

应用程序.qml

import QtQuick 1.0
import MessageForwarder 1.0  // implemented in C++
// [...]

Rectangle {
    id: anApp

    MessageForwarder { id: mf }  // ← Possible without this? 

    Component.onCompleted: mf.displayMessage("A message."); // show message

    // [...]
}

是否可以创建类似静态函数的东西,允许类似的东西MessageForwarder.displayMessage("Foo"),而不需要组件的额外实例MessageForwarder

或者是否有其他方便的可能性showMessage()在其他组件中使用?
(也许类似于Qt全局对象?)

谢谢!


编辑:

我想我找到了一个非常简单的解决方案:由于 QML 是一种动态范围的语言(→ Qt Doc)并且所有组件都嵌套在main.qml中,所以这很简单:

main.qml

import QtQuick 1.0

Rectangle {
    id: main

    QtObject { 
        id: messageBox
        // nested for a more modular design
        function showMessage(text) {
            // make a message area visible and set text
        }
    }

    // [...]

    // message box implementation
}

应用程序.qml

import QtQuick 1.0

Rectangle {
    id: anApp

    Component.onCompleted: messageBox.showMessage("A message.");

    // [...]
}
4

1 回答 1

5

氡,你找到了正确的解决方案,真的。我在这里推荐的增强功能是将您的消息框移动到一个名为 MessageBox.qml 的单独文件中,然后在 main.qml 中声明 MessageBox 组件并通过其 ID 直接引用您的消息框,而不是创建额外的 QtObject 元素和通过它参考实际的消息框。例如:

// MessageBox.qml
Item {
    property string headerText
    property string messageText
    ...
    Text {
        ...
    }
    ... 
    function show(headerText, bodyText, mode) {
        ...
    }
}

然后在你的 main.qml 中使用它:

// main.qml
Rectangle {
   id: main
   MessageBox { id: messageBox } // a very compact declaration of you MessageBox
   ...
}

然后在你的应用程序的任何文件中调用它,如下所示:

//NetworkConnectionsWindow.qml
Rectangle {
    ...
    onError: {
        ...
        // and here you refer to you global message box object
        messageBox.show('Network error', 'Server is not responding', ErrorMode);
    }
}

对我来说,它提高了代码的可读性和结构,并允许您摆脱在 main.qml 中使用的 QtObject,从而使代码紧凑。如果您需要一些东西来“提升”您的消息框,而不是使用包装器,您可以使用Item element 的 z 属性

希望这会让你的代码看起来更好。

于 2011-04-10T15:53:26.663 回答