为其他组件调用根QML组件的功能

问题描述:

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

我的想法到目前为止是创建具有这样的功能displayMessage()它调用根上下文的showMessage()功能的C++ QML组分(→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 
} 

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 

    // [...] 
} 

是否有可能创造这样一个静态的功能,这将允许类似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 
} 

App.qml

import QtQuick 1.0 

Rectangle { 
    id: anApp 

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

    // [...] 
} 

氡,你找到了正确的解决方案,真实。我在这里推荐的一个增强功能是将你的消息框移动到一个名为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,使代码更紧凑。如果您需要某些方法来“提升”您的消息框,而不是使用包装物,则可以使用z property of Item element

希望能让你的代码更好看。

+0

感谢您的提示! – hiddenbit 2011-04-10 16:56:28