我想显示一个消息框,它在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
}
Run Code Online (Sandbox Code Playgroud)
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
// [...]
}
Run Code Online (Sandbox Code Playgroud)
是否可以创建类似静态函数的东西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
}
Run Code Online (Sandbox Code Playgroud)
App.qml
import QtQuick 1.0
Rectangle {
id: anApp
Component.onCompleted: messageBox.showMessage("A message.");
// [...]
}
Run Code Online (Sandbox Code Playgroud)
小智 5
氡,你找到了正确的解决方案,是的.我在这里推荐的增强功能是将消息框移动到一个名为MessageBox.qml的单独文件中,然后在main.qml中声明MessageBox组件并直接通过其ID引用消息框,而不是创建其他QtObject元素和通过它参考实际的消息框.例如:
// MessageBox.qml
Item {
property string headerText
property string messageText
...
Text {
...
}
...
function show(headerText, bodyText, mode) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
然后在main.qml中使用它:
// main.qml
Rectangle {
id: main
MessageBox { id: messageBox } // a very compact declaration of you MessageBox
...
}
Run Code Online (Sandbox Code Playgroud)
然后在你的app的任何文件中调用它,如下所示:
//NetworkConnectionsWindow.qml
Rectangle {
...
onError: {
...
// and here you refer to you global message box object
messageBox.show('Network error', 'Server is not responding', ErrorMode);
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,它提高了代码的可读性和结构,并允许你摆脱你在main.qml中使用的QtObject,使代码紧凑.如果你需要某些东西来"提升"你的消息框,而不是使用包装器,你可以使用Item元素的z属性.
希望这会让你的代码看起来更好.