Qt4 使根QML组件的函数可为其他组件调用

Qt4 使根QML组件的函数可为其他组件调用,qt4,qml,Qt4,Qml,我想显示一个消息框,它在main.qml中实现(作为所有其他组件之上的一个层)。函数showMessage()使QML消息框可见并设置文本。因此,main.qml中的代码可以显示消息框,但其他组件(不在main.qml中)也应该能够显示消息框 我的想法是创建一个C++ QML组件,它具有一个函数:代码> DePaseMeMeXAGE()/Cuth>,它调用根上下文的显示消息()/函数(→ main.qml) mail.qml(根组件) App.qml import QtQuick 1.0 imp

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

我的想法是创建一个C++ QML组件,它具有一个函数:代码> DePaseMeMeXAGE()/Cuth>,它调用根上下文的<代码>显示消息()/<代码>函数(→ main.qml

mail.qml(根组件)

App.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

    // [...]
}
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
}
import QtQuick 1.0

Rectangle {
    id: anApp

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

    // [...]
}
是否可以创建一个类似于静态函数的函数,允许类似于
MessageForwarder.displayMessage(“Foo”)
的函数,而不需要
MessageForwarder
组件的额外实例

或者在其他组件中是否可以方便地使用
showMessage()
(可能类似于
Qt
global对象?)

谢谢


编辑:

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

main.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

    // [...]
}
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
}
import QtQuick 1.0

Rectangle {
    id: anApp

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

    // [...]
}
App.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

    // [...]
}
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
}
import QtQuick 1.0

Rectangle {
    id: anApp

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

    // [...]
}

Radon,你找到了正确的解决方案,没错。我在这里推荐的一个增强方法是将消息框移动到一个单独的文件say MessageBox.qml中,然后在main.qml中声明MessageBox组件,并通过其ID直接引用消息框,而不是创建额外的QtObject元素并引用实际的消息框thr例如:

// 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,使代码紧凑。如果您需要一些东西来“提升”消息框,而不是使用您可以使用的包装器

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