QML中的信号和信号处理

转自:https://blog.csdn.net/douzhq/article/details/81007504

1. 信号处理器

QML中使用on+信号的方式作为信号处理器,来处理所所发送的信号。比如相应按钮的点击事件,代码如下:

Button {
    text: '退出'
    anchors.centerIn: parent
    onClicked: {
        Qt.quit()
    }
}

clicked为点击按钮所发出的信号,与QPushButton发出的clicked信号是相同的,而使用onClicked作为信号的处理器,点击按钮后,相应大括号({})中的语句,即Qt.quit(),程序退出。

2.附加信号处理器

QML语言的语法中,有一个附加属性和附加信号处理器的概念,这是附加到一个对象的额外属性。下面是附加属性和附加信号处理器的简单用法:

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4

Window {
    id: mainWindow
    width: 800
    height: 600
    visible: true

    Rectangle {
        anchors.fill: parent
        Button {
            text: '退出'
            anchors.centerIn: parent
            onClicked: {
                Qt.quit()
            }
        }

        Text {
            id: text
            text: ''
            anchors.top: parent.top
            anchors.topMargin: 10
            anchors.horizontalCenter: parent.horizontalCenter
        }

        Keys.enabled: true
        focus: true
        Keys.onPressed: {
            if (event.key === Qt.Key_Up)
                text.text = 'Has Pressed Up Key'
            else if (event.key === Qt.Key_Down)
                text.text = 'Has Pressed Down Key'
            else if (event.key === Qt.Key_Left)
                text.text = 'Has Pressed Left Key'
            else if (event.key === Qt.Key_Right)
                text.text = 'Has Pressed Right Key'
        }
    }
}

当按键盘的上、下、左、右按键时,显示不同的字符串。

3. Connections

Connections对象创建一个到QML信号的连接。

target: 指向发出信号的对象。
使用on + 信号的方式相应信号处理。

Button {
    id: button
    text: '退出'
    anchors.centerIn: parent
}

Connections {
    target: button
    onClicked: {
        Qt.quit()
    }
}

这个效果同上面的实现。C++中定义的信号,也可以使用Connections连接并处理信号的相应。

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
import Demos.SignalDeno 1.0

Window {
    id: mainWindow
    width: 800
    height: 600
    visible: true

    Rectangle {
        anchors.fill: parent

        SignalDemo {
            id: signalDemo
        }

        ColumnLayout {
            anchors.centerIn: parent
            Text {
                id: text
                text: ''
            }

            Button {
                id: button
                text: '确定'

                onClicked: {
                    signalDemo.callTestSignal()
                }
            }

            Connections {
                target: signalDemo
                onTestSignal: {
                    text.text = 'Recved Test Signals'
                }
            }
        }
    }
}

C++中的头文件:

#ifndef SIGNAL_DEMO_H
#define SIGNAL_DEMO_H
#include <QObject>

class SignalDemo : public QObject
{
    Q_OBJECT

public:
    SignalDemo(QObject *parent = nullptr);
    ~SignalDemo();

    // 调用信号函数
    Q_INVOKABLE void callTestSignal(void);

signals:
    void testSignal(void);
};

#endif

C++中的源文件:

#include "SignalDemo.h"

SignalDemo::SignalDemo(QObject *parent)
    :QObject(parent)
{

}

SignalDemo::~SignalDemo()
{

}

void SignalDemo::callTestSignal(void)
{
    emit testSignal();
}

4. 使用connect()函数连接信号和槽

Qt C++中可以使用QObject::connect()的方式连接信号和槽,QML中也有类似的方法,就是使用signal.connect()连接信号和槽,当然也可以信号连接信号;有connect()方法当然也有disconnect()方法去断开信号和槽函数的连接。下面是使用signal.connect()改写上面的信号和槽的连接,可以达到相同的效果:

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1
import Demos.SignalDeno 1.0

Window {
    id: mainWindow
    width: 800
    height: 600
    visible: true

    Rectangle {
        anchors.fill: parent

        SignalDemo {
            id: signalDemo
        }

        ColumnLayout {
            anchors.centerIn: parent
            Text {
                id: text
                text: ''
            }

            Button {
                id: button
                text: '确定'

                onClicked: {
                    signalDemo.callTestSignal()
                }
            }

            function disposeTestSignal() {
                text.text = 'Recved Test Signals'
            }

            Component.onCompleted: {
                // 连接信号和处理的槽函数
                signalDemo.testSignal.connect(disposeTestSignal)
            }

//            Connections {
//                target: signalDemo
//                onTestSignal: {
//                    text.text = 'Recved Test Signals'
//                }
//            }
        }
    }
}

5. 自定义信号

使用QML的自定义信号,可以使用如下形式:

signal name [type parameterName,]

发送信号,可以直接使用函数即可;下面是一个简单的示例:

import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Controls 1.4

Window {
    id: mainWindow
    width: 800
    height: 600
    visible: true

    Text {
        id: text
        text: 'This is Test Txt!'
        font.pixelSize: 35
        anchors.centerIn: parent

        function textColorChange(clr) {
            text.color = clr
        }

        Component.onCompleted: {
            button1.sendThisColor.connect(textColorChange)
            button2.sendThisColor.connect(textColorChange)
        }
    }

    Rectangle {
        id: button1
        width: 80
        height: 80
        anchors.left: parent.left
        anchors.leftMargin: 5
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 5
        color: Qt.rgba(1.0, 0, 0)
        signal sendThisColor(color rectColor)

        MouseArea {
            anchors.fill: parent
            onClicked: {
                button1.sendThisColor(button1.color)
            }
        }
    }

    Rectangle {
        id: button2
        width: 80
        height: 80
        anchors.left: button1.right
        anchors.leftMargin: 5
        anchors.bottom: parent.bottom
        anchors.bottomMargin: 5
        color: Qt.rgba(0.0, 0.0, 1.0)
        signal sendThisColor(color rectColor)

        MouseArea {
            anchors.fill: parent
            onClicked: {
                button2.sendThisColor(button2.color)
            }
        }
    }
}

效果如下图所示:
在这里插入图片描述
转自:https://blog.csdn.net/douzhq/article/details/81007504
参考:https://doc.qt.io/archives/qt-5.5/qtqml-syntax-signals.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML信号和槽函数是一种用于实现对象间通信的机制,类似于Qt信号和槽。信号是来自QML对象的通知,而槽函数则是由信号触发的表达式或函数。在QML,可以使用signal关键字定义有参或无参的信号。发送信号时,可以使用emit关键字加上信号名和参数进行发送。 为了让信号和槽函数连接起来,需要使用connect函数进行连接。在Qt/C,连接信号和槽函数需要保持参数顺序和类型一致。而在QML,连接信号和槽函数更加方便,可以直接在信号和槽之间使用Connections组件进行连接。 例如,在一个QML的Button组件,可以定义一个信号testSig,然后在按钮点击事件使用emit关键字发送信号。接着可以使用Connections组件来绑定信号和槽函数,通过onTestSig函数来接收信号。槽函数可以在函数体内进行任意的处理,例如打印参数值。 总结来说,QML信号和槽函数机制与Qt类似,可以用于实现对象间的通信和事件处理。通过定义信号、发送信号和连接信号与槽函数,可以实现灵活的交互和逻辑处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【QML事件处理】信号与槽](https://blog.csdn.net/m0_60259116/article/details/129265884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Qml信号的发送与接收信号槽函数的使用](https://blog.csdn.net/Shado_walker/article/details/51243408)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [QML学习笔记【05】:QML信号与槽](https://blog.csdn.net/m0_37845735/article/details/128511282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值