とC++とQMLとの結合、私はmain.qml
は、動的に作成タブ要素
TabView {
id: tabRoot
objectName: "tabRootObj"
}
でTabViewを持っている私のアプリケーションは、すべての新しい着信TCP接続上で新しいタブを作成します。次のコードは、要求に応じて新しいタブを作成します(この回答に基づいて、https://stackoverflow.com/a/27093137/3960195)。また、プロパティを介してアクセス可能ないくつかの統計情報が含まれているクラスConnectionManager
の新しいインスタンス(転送されたバイトの数など)を作成し、すべてのTCP接続で
void addTab(QQmlApplicationEngine& engine) {
root_tab = engine.rootObjects().first()->findChild<QQuickItem*>(QStringLiteral("tabRootObj"));
QVariant new_tab;
QQmlComponent component(&engine, QUrl("qrc:/MyTab.qml");
QMetaObject::invokeMethod(root_tab, "addTab",
Q_RETURN_ARG(QVariant, new_tab),
Q_ARG(QVariant, QStringLiteral("Tab name")),
Q_ARG(QVariant, QVariant::fromValue(&component)));
}
。
//ConnectionManager.hpp
class ConnectionManager : public QObject
{
Q_OBJECT
public:
// ...
Q_PROPERTY(QString address READ address NOTIFY ipChanged)
Q_PROPERTY(int received READ received NOTIFY receivedChanged)
//...
}
//MyTab.qml
Item {
property string ip
property int received
...
}
私が必要とするものは、プロパティーを持つプロパティーをバインドすることです。MyTab.qml
。 問題は方法TabView.addTab
がそれ自身にMyTab
のコンポーネントを作成し、私はそのコンテキストにConnectionManager
の具体的なインスタンスを注入することができないということです。また、新しい接続が作成されるまで、ConnectionManagerは存在しませんので、アプリケーションの開始時にrootContext
まで追加することはできません。この新しく作成されたオブジェクト間にバインディングを作成するにはどうすればよいですか?
それはQMLで私の最初のプロジェクトはので、多分それを行うにはどのようにより良い「QML」方法があります。その場合、「正しい」方法を示す回答も受け入れられます。
'ConnectionManager'をQML' addTab'関数に渡せませんか? また、C++とQMLの間の結合を制限するために、私はC++からタブを追加しません。私は、さまざまな接続のC++モデルを公開し、それをQMLに公開します。次に、私は代理人として 'MyTab'と一緒に' Repeater 'を使用します。 – GrecKo
QML 'addTab'関数には、タブのタイトルと構築されたコンポーネントの2つのパラメータしかありません(http://doc.qt.io/qt-5/qml-qtquick-controls-tabview.html#addTab-method)。リピータのソリューションは本当に素晴らしいようです。私はあなたが 'TabView'の中で' Repeater 'を使うことができるのか分かりませんでした。 – Qeek
* GrecKo *はおそらくあなた自身のC++機能について話していたでしょう:あなたがコンポーネントを作成する 'addTab(...)'。 – derM