3

main.qmlに(他のすべてのコンポーネントの上のレイヤーとして)実装されているメッセージボックスを表示したいと思います。この関数showMessage()は、QMLメッセージボックスを表示し、テキストを設定します。したがって、main.qml内のコードでメッセージボックスを表示することは可能ですが、他のコンポーネント(main.qml内ではない)もメッセージボックスを表示できる必要があります。

displayMessage()これまでの私の考えは、ルートコンテキストの関数を呼び出すshowMessage()関数(→ main.qml )を持つC++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.");

    // [...]
}
4

1 に答える 1

5

ラドン、あなたは正しい解決策を見つけました。ここで拡張機能としてお勧めするのは、メッセージ ボックスを MessageBox.qml という別のファイルに移動し、main.qml で MessageBox コンポーネントを宣言し、追加の QtObject 要素を作成する代わりに ID で直接メッセージ ボックスを参照することです。それを通して実際のメッセージボックスを参照してください。例えば:

// 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 を削除してコードをコンパクトにすることができます。メッセージ ボックスを「上げる」必要がある場合は、ラッパーを使用する代わりに、 Item 要素の z プロパティを使用できます。

これにより、コードが見栄えが良くなることを願っています。

于 2011-04-10T15:53:26.663 に答える