QML(26)——多层qml界面传递信号

使用场景

界面嵌套关系如下

RootPanel
Panel 1: 接收信号
Panel 2
Panel 3
Panel 4: 触发信号

传统方式

单纯用qml来传递多层信号,只能在每一层添加signal, 逐层触发,非常麻烦
我尝试过Connections, target使用: Panel2. Panel3. Panel4, 但是不生效

高效方式

使用C++类作为信号中转

代码

qml界面

// RootPanel
import QtQuick 2.15
import QtQuick.Layouts 1.2

ColumnLayout {
    spacing: 20

    Panel01 {
        Layout.preferredWidth: 200
        Layout.preferredHeight: 50
    }

    Panel02 {
        Layout.preferredWidth: 200
        Layout.preferredHeight: 50
    }
}



// Panel02
import QtQuick 2.15
Item {
//    Detected anchors on an item that is managed by a layout
//    anchors.fill: parent
    Panel03 { anchors.fill: parent }
}



// Panel03
import QtQuick 2.15

Item {
    anchors.fill: parent
    Panel04{
        anchors.fill: parent
    }
}


// Panel04
import QtQuick 2.15
import QtQuick.Controls 2.15

Button {
    property int index: 0
    anchors.fill: parent
    text: "panel 4:  " + index
    font.pixelSize: 20
    onClicked: {
        index ++
        // 触发C++中的信号
        toolWorker.sigAddIndex(index)
    }
    background: Rectangle{
        color: "lightGreen"
    }
}




// Panel01
import QtQuick 2.15
import QtQuick.Controls 2.15

Button {
    property int index: 0
    text: "panel 1:  " + index
    font.pixelSize: 20

    // 这里只是简单的属性传递,其实可以使用属性绑定
    // Connections最适合复杂逻辑场景
    Connections {
        target: toolWorker
        function onSigAddIndex(val) {
            index = val
            console.log("index", index)
        }
    }
}

C++
这里使用单例模式

// ToolWorker.h
#ifndef TOOLWORKER_H
#define TOOLWORKER_H

#include <QObject>

class ToolWorker : public QObject
{
    Q_OBJECT

public:
    static ToolWorker &GetInstance();

private:
    ToolWorker();
    ~ToolWorker();

    ToolWorker(const ToolWorker &) = delete;
    ToolWorker(const ToolWorker &&) = delete;
    ToolWorker &operator=(const ToolWorker &) = delete;

signals:
    void sigAddIndex(int val);

public slots:
};
#endif // TOOLWORKER_H



// ToolWorker.cpp
#include "ToolWorker.h"
ToolWorker &ToolWorker::GetInstance()
{
    static ToolWorker myTool;
    return myTool;
}
ToolWorker::ToolWorker(){}
ToolWorker::~ToolWorker(){}

main.cpp
添加以下内容

#include <QQmlContext>
#include "ToolWorker.h"

 engine.rootContext()->setContextProperty("toolWorker", &ToolWorker::GetInstance());

效果展示

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值