QML小例子【信号与槽】

1、效果

代码参考B站视频:https://www.bilibili.com/video/av36584062

功能:点击左边,会发出信号,右边会有个颜色动画,然后计数+1

2、分析:

一共有两个对象,他们很多属性都差不多,如可变颜色、原型、可变text..所以可以声明一个Circle对象,然后Sender和Recver都继承它;

能够通过Sender控制Recver,那么Sender一定有信号发出,然后Recver有一个函数用于状态改变;

应该在发出信号的地方即Sender里,连接信号与槽,根据总结:https://www.cnblogs.com/judes/p/11243242.html,这里属于QML的信号QML的槽,所以应该直接使用signal.connect(slot)的形式,但是怎么在Sender中访问到Recver的槽函数呢?

可以这样:在Sender里加一个Recver属性,初始化为null,然后在这个Recver的onRecverChanged回调中,connect。

3、图形基类Circle.qml

import QtQuick 2.0

Item {
    width: 200
    height: 200
    property alias circlrColor: circlr.color
    property alias contentText: content.text
    Rectangle {
        id: circlr
        color: "#f94141"
        radius: width*0.5
        anchors.fill: parent

        Text {
            id: content
            x: 93
            y: 94
            color: "#e5d9d9"
            text: qsTr("Text")
            verticalAlignment: Text.AlignVCenter
            horizontalAlignment: Text.AlignHCenter
            anchors.verticalCenter: parent.verticalCenter
            anchors.horizontalCenter: parent.horizontalCenter
            font.pixelSize: 30
        }
    }
}

这里需要注意:

property alias circlrColor: circlr.color

property alias contentText: content.text

我是直接在设计界面直接导出别名属性:

这个别名属性即alias,外界可以通过改变这个变量直接改变到对应的控件属性。

4、Sender.qml

import QtQuick 2.0

Circle {
    id: sender
    property int counter: 0
    signal sendSignal(string value)
    property Recver target:null
    onTargetChanged: {
        sendSignal.connect(target.recvSlot)
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            sender.counter++
            sender.sendSignal(counter)
        }
        onPressed: {
            sender.circlrColor="red"
        }
        onReleased: {
            sender.circlrColor="blue"
        }
    }
}

核心就是在红色的地方,将null Recver作为自己的属性,然后在main里赋值,当赋值成功就连接信号与槽

5、Recver.qml

import QtQuick 2.0
import QtQuick 2.7
Circle {
    id: recver
    function recvSlot(value)
    {
        contentText=value;
        colorNotify.running=true;
    }

    SequentialAnimation on circlrColor {
        id: colorNotify
        running: false

        ColorAnimation {
            from: "red"
            to: "blue"
            duration: 200
        }

        ColorAnimation {
            from: "blue"
            to: "red"
            duration: 200
        }
    }
}

这里有个重点就是红色部分,即序列动画,里面的动画按照顺序执行,看文档或者资料都没有SequentialAnimation on circlrColor的用法,这里是直接作用于颜色【很多QML的骚用法在文档里都找不到,这也是我认为阻挡我学习QML的难处】

6、main.qml

import QtQuick 2.9
import QtQuick.Window 2.2

Window {
    id: window
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Background {
        id: background
        anchors.fill: parent

        Recver {
            id: recver
            x: 359
            y: 128
            circlrColor: "#ff0000"
            contentText: "Recver"
            anchors.verticalCenterOffset: 0
            anchors.verticalCenter: parent.verticalCenter
        }

        Sender {
            id: sender
            x: 79
            y: 140
            target: recver
            circlrColor: "#0000ff"
            contentText: "Sender"
            anchors.verticalCenterOffset: 0
            anchors.verticalCenter: parent.verticalCenter
        }
    }
}

Background可不管,就是个简单的背景qml

原文地址:https://www.cnblogs.com/judes/p/11295762.html

时间: 2024-10-15 15:36:54

QML小例子【信号与槽】的相关文章

QML - 小例子 - 文件目录浏览器

QML写动画比较方便,参考QML提供的例子写了如下在Android上可用的文件目录浏览器(电脑端其实也可用,只是还不完整) 以上这两张截图是在电脑上直接运行时的样子,在Android手机上运行的话,会有一些小差异. FileListView.xml的代码大概如下: import QtQuick 2.3 import Qt.labs.folderlistmodel 2.1 import QtQuick.Controls.Styles 1.2 import QtQuick.Controls 1.2

Qt on Android: Qt Quick 事件处理之信号与槽

前面两篇文章< Qt on Android:QML 语言基础>和<Qt on Android: Qt Quick 简单教程>中我们介绍了 QML 语言的基本语法和 Qt Quick 的常见元素,亲们,通过这两篇文章,您应该已经可以完成简单的 Qt Quick 应用了.接下来呢,哈,我们要介绍 Qt Quick 中一个灰常灰常重要的主题:事件处理.这将是比较长长长长的一篇,哦,不还有后续好几篇--废话少说,还是谈正事儿吧兄弟姐妹们. 本文参加 CSDN 博文大赛,请点这里投我一票,谢

QT 的信号与槽

转载: QT 的信号与槽机制介绍 QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上.QT 支持下列平台:MS/WINDOWS-95.98.NT 和 2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IBM AIX.SGI IRIX:EMBEDDED- 支持 framebuffer

信号与槽(可以与第三方库混用,首次见到QObject::destroyed的使用)

信号与槽用于对象之间的通信.信号与槽机制是Qt的核心特性和区别于其他框架的特性. Introduction 在GUI程序中,当我们改变一个widget,经常需要其他的widget得到通知.更普遍的是,我们需要任意的对象可以与另外的对象进行通信.例如,一个用户点击关闭按钮,我们可以需要windows的close()函数被调用. 旧的工具包通过回调函数实现这种通信.一个回调函数是一个函数指针,所以你需要一个处理函数来通知你关于一些事件,你传递一个指向另一个函数的处理函数.这个处理函数在适当的时候调用

QT的信号和槽机制简介

信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上.QT支持下列平台:MS/WINDOWS-95.98.NT和2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IB

QT的信号与槽机制介绍

信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前Linux上最为流行的KDE桌面环境就是建立在QT库的基础之上.QT支持下列平台:MS/WINDOWS-95.98.NT和2000:UNIX/X11-Linux.Sun Solaris.HP-UX.Digital Unix.IB

PyQt4信号和槽

每个GUI库都提供了事件发生的不少细节,如鼠标点击.键盘按键等.例如,如果用户点击了一个写有Click Me的按钮后,按钮所附带的信息就会变成可用.GUI库可以告知我们 鼠标点击时与按钮的相对坐标,与按钮相应的父窗口部件,还有与屏幕相关的信息:GUI库还 会给出Shift.Ctrl.Alt以及NumLock键在当时的状态:也会给出按下和松开按钮的精确时间等.如果用户通过非鼠标点击的其他方式按下按钮,也应该能够提供相类似的信息.用户也有可能通过多次使用Tab键来把光标移动到按钮上,之后再按下空格,

1.3 初步了解信号和槽

在Qt中,如何响应动作.这会用到Qt的信号和槽机制. 我的理解:它和Win32程序的消息响应机制差不多吧. 信号,简单理解就是:当我们点击一个按钮时,这个按钮自身就会产生一个叫作"单击"的信息,这个信息说明了刚刚我们点击了这一个按钮.产生的这个信息就相当于自己发射了一个信号,表明一个用户动作已经发生了或者是一个状态已经改变了.这就是信号(signal). 槽,可以理解为:当这个按钮发射了这个信号之后,假如有一个"监听员"发现了这个信号,它会马上做出响应,做相应的动作

Qt的信号与槽机制

1.信号和槽机制是QT的核心机制,要精通QT编程就必须对信号和槽有所了解. 2.信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方. 3.信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码. 4.在我们所熟知的很多GUI工具包中,窗口小部件(widget