为其他组件调用根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。
希望能让你的代码更好看。
感谢您的提示! – hiddenbit 2011-04-10 16:56:28