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

QML小例子【QML工程里信号与槽】的更多相关文章

  1. [QT][转载] Qt信号和槽

    From: http://blog.csdn.net/rl529014/article/details/51346955 GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘.绘制完成.点击鼠 ...

  2. Qt对象模型之一:信号和槽

    一.信号和槽机制概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目 ...

  3. QML之信号与槽

    一.C++的信号和QML的槽 前言: Qt中的信号与槽,通常是一个信号SIGNAL和一个槽SLOT,通过connet连接,而QML中不需要再写槽函数,只需要在合适的地方告诉QML:如果x信号产生则执行 ...

  4. Spring.Net在ASP.NET Mvc里使用的一个小例子

    就贴个小例子,就不注意格式了. 1.下载dll NuGet的下载地址:http://docs.nuget.org/docs/start-here/installing-nuget 在vs的NuGet里 ...

  5. QML于C++交互之信号与槽(signal&slot )

    connect c++ SIGNAL with QML SLOT 简介 QML 与 C++ 混合编程时,总结了一下qml和c++互相直接调用.及信号与槽连接 的几种情况,详细使用情况看示例代码 所有的 ...

  6. spring小例子-springMVC+mybits整合的小例子

    这段时间没更博,找房去了...   吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了..   搬家太 ...

  7. 在 C++Builder 工程里使用 Visual C++ DLL(3个工具) good

    译者序: 第一次读这篇文章是在 2001 年 10 月,帮我解决了一点小问题.本来不好意思翻译,因为英语水平实在太差.最近发现不少网友在问在 C++Builder 的工程里调用 Visual C++  ...

  8. QML Object Attributes QML对象属性

    QML Object Attributes Every QML object type has a defined set of attributes. Each instance of an obj ...

  9. vuex2.0+两个小例子

    首先vuex概念比较多,一定要搞懂里面的概念,可以参考官网Vuex2.0概念,我写此文的目的是希望能对前端爱好者提供个参考,加深对vuex2.0各核心概念的理解. 废话少说,直接上干货.这是官网上的一 ...

随机推荐

  1. python自动化

    自动化测试一些问题 什么是自动化测试? 自动化测试,顾名思义,自动完成测试工作.通过一些自动化测试工具或自己造轮子实现模拟之前人工点点/写写的工作并验证其结果完成整个测试过程,这样的测试过程,便是自动 ...

  2. js 面向对象之构造器与工厂函数

    字面量模式声明一个对象实例 let m = {name: "lisi", age:15} m.constructor // ƒ Object() { [native code] } ...

  3. unable to import maven project see logs for details

    2019-10-21 19:31:06,987 [40598655]   WARN - ution.rmi.RemoteProcessSupport - SLF4J: Actual binding i ...

  4. TCP服务端实现并发

    socket 在 tcp 协议下通信 客户端 import socket ​ # 创建客户端TCP协议通信 c = socket.socket() # 与指定服务端握手 c.connect(('127 ...

  5. python - Flask 基础 - 蓝图( Blueprint )(2)

    """ 蓝图:为开发者提供的目录结构 - 使用: 1. 根目录创建一个跟项目名一样的文件 - 创建后第一步,在这个文件夹中添加一个 __init__.py 的配置文件 - ...

  6. 01_Tutorial 1: Serialization 序列化

    1.序列化 1.官方教程 https://q1mi.github.io/Django-REST-framework-documentation/tutorial/1-serialization_zh/ ...

  7. Centos命令和Shell脚本问题集合

    1.cat 错误写法 cat >> somefile.txt << EOF something EOF 原因:EOF 之后一定要是 ENTER(回车) 不能是空格或者其他.EO ...

  8. spark读文件写mysql(java版)

    package org.langtong.sparkdemo; import com.fasterxml.jackson.databind.ObjectMapper; import org.apach ...

  9. 题解 CF1063B 【Labyrinth】

    题解 CF1063B [Labyrinth] 完了我发现我做CF的题大部分思路都和别人不一样qwq 这道题其实很水,不至于到紫题 我们只要bfs一下,向四个方向剪下枝,就A了(好像还跑的蛮快?) 是一 ...

  10. TCP数据的传输过程

    建立连接后,两台主机就可以相互传输数据了.如下图所示: 上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程.首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 ...