2011-04-10 85 views
3

我想要顯示一個消息框,它在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."); 

    // [...] 
} 

回答

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,使代碼更緊湊。如果您需要某些方法來「提升」您的消息框,而不是使用包裝物,則可以使用z property of Item element

希望能讓你的代碼更好看。

+0

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

相關問題