QML小例子【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
QML小例子【QML工程里信号与槽】的更多相关文章
- [QT][转载] Qt信号和槽
From: http://blog.csdn.net/rl529014/article/details/51346955 GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘.绘制完成.点击鼠 ...
- Qt对象模型之一:信号和槽
一.信号和槽机制概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal).这种发出是没有目 ...
- QML之信号与槽
一.C++的信号和QML的槽 前言: Qt中的信号与槽,通常是一个信号SIGNAL和一个槽SLOT,通过connet连接,而QML中不需要再写槽函数,只需要在合适的地方告诉QML:如果x信号产生则执行 ...
- Spring.Net在ASP.NET Mvc里使用的一个小例子
就贴个小例子,就不注意格式了. 1.下载dll NuGet的下载地址:http://docs.nuget.org/docs/start-here/installing-nuget 在vs的NuGet里 ...
- QML于C++交互之信号与槽(signal&slot )
connect c++ SIGNAL with QML SLOT 简介 QML 与 C++ 混合编程时,总结了一下qml和c++互相直接调用.及信号与槽连接 的几种情况,详细使用情况看示例代码 所有的 ...
- spring小例子-springMVC+mybits整合的小例子
这段时间没更博,找房去了... 吐槽一下,自如太坑了...承诺的三年不涨房租,结果今年一看北京房租都在涨也跟着涨了... 而且自如太贵了,租不起了.. 突然有点理解女生找对象要房了.. 搬家太 ...
- 在 C++Builder 工程里使用 Visual C++ DLL(3个工具) good
译者序: 第一次读这篇文章是在 2001 年 10 月,帮我解决了一点小问题.本来不好意思翻译,因为英语水平实在太差.最近发现不少网友在问在 C++Builder 的工程里调用 Visual C++ ...
- QML Object Attributes QML对象属性
QML Object Attributes Every QML object type has a defined set of attributes. Each instance of an obj ...
- vuex2.0+两个小例子
首先vuex概念比较多,一定要搞懂里面的概念,可以参考官网Vuex2.0概念,我写此文的目的是希望能对前端爱好者提供个参考,加深对vuex2.0各核心概念的理解. 废话少说,直接上干货.这是官网上的一 ...
随机推荐
- python自动化
自动化测试一些问题 什么是自动化测试? 自动化测试,顾名思义,自动完成测试工作.通过一些自动化测试工具或自己造轮子实现模拟之前人工点点/写写的工作并验证其结果完成整个测试过程,这样的测试过程,便是自动 ...
- js 面向对象之构造器与工厂函数
字面量模式声明一个对象实例 let m = {name: "lisi", age:15} m.constructor // ƒ Object() { [native code] } ...
- 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 ...
- TCP服务端实现并发
socket 在 tcp 协议下通信 客户端 import socket # 创建客户端TCP协议通信 c = socket.socket() # 与指定服务端握手 c.connect(('127 ...
- python - Flask 基础 - 蓝图( Blueprint )(2)
""" 蓝图:为开发者提供的目录结构 - 使用: 1. 根目录创建一个跟项目名一样的文件 - 创建后第一步,在这个文件夹中添加一个 __init__.py 的配置文件 - ...
- 01_Tutorial 1: Serialization 序列化
1.序列化 1.官方教程 https://q1mi.github.io/Django-REST-framework-documentation/tutorial/1-serialization_zh/ ...
- Centos命令和Shell脚本问题集合
1.cat 错误写法 cat >> somefile.txt << EOF something EOF 原因:EOF 之后一定要是 ENTER(回车) 不能是空格或者其他.EO ...
- spark读文件写mysql(java版)
package org.langtong.sparkdemo; import com.fasterxml.jackson.databind.ObjectMapper; import org.apach ...
- 题解 CF1063B 【Labyrinth】
题解 CF1063B [Labyrinth] 完了我发现我做CF的题大部分思路都和别人不一样qwq 这道题其实很水,不至于到紫题 我们只要bfs一下,向四个方向剪下枝,就A了(好像还跑的蛮快?) 是一 ...
- TCP数据的传输过程
建立连接后,两台主机就可以相互传输数据了.如下图所示: 上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程.首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 ...