【golang-GUI开发】struct tags系统(一)
我们已经介绍了qt的signal和slot,现在该讲讲它的struct tags系统了。qt拥有多种的struct tags,我们会去一一了解它们。
什么是struct tags?
struct tag
又叫做结构体标签,顾名思义,它就是用来给结构体字段做标记的。比如我们熟悉的JSON就使用了tags:
type User struct {UserId int `json:"user_id" bson:"user_id"`UserName string `json:"user_name" bson:"user_name"`
}
tags由反引号包裹,name在:
之前,value在:
之后由双引号包裹。
有了这些tags,我们的代码就可以很轻松的使用reflect来取得tags的name和name对应的值:
u := &User{UserId: 1, UserName: "tony"}
t := reflect.TypeOf(u)
field := t.Elem().Field(0)
fmt.Println(field.Tag.Get("json")) // "user_id"
fmt.Println(field.Tag.Get("bson")) // "user_id"
我们的qt正是依赖这一特性实现了Qt的moc系统,使用不同的tags除了可以实现signal和slot之外还能实现moc的多种功能,甚至是qt自己的一些扩展。
“->” 和 “<-”
在signal里我们已经介绍了auto,它具有很多的局限性,项目作者也表示auto应该尽量单独使用,不应该使用auto(...)
的形式。而为了更方便的连接signal和slot,我们就需要用到->
和<-
了。
先看个示例,这次我们从官方的例子里节选一段:
type Chart struct {core.QObject*charts.QChart_ func() `constructor:"init"`_ func() `slot:"handleTimeout,<-(this.m_timer.timeout)"`
}
对于槽handleTimeout,我们使用了<-
,它和下面这句等价:
this.m_timer.ConnectTimeout(this.handleTimeout)
意思是将this.m_timer
的Timeout信号和this.handleTimeout
函数connect,当触发了this.m_timer
的Timeout信号时这个函数也会被调用。
你也可以不指定信号名称,默认会和signal tag指定的信号名同名的函数进行connect:
_ func() `slot:"handleTimeout,<-(this.m_timer)"`
和
_ func() `slot:"handleTimeout,<-(this.m_timer.handleTimeout)"`
等价。
我们再来看一下->
的使用:
import "controller"type dialogTemplate struct {core.QObject_ func() `constructor:"init"`_ func(cident string) `signal:"show,<-(controller.Controller)"`_ func(bool) `signal:"blur,->(controller.Controller)"`
}
可以看到,我们对信号Blur使用了->
,这个表达的含义与<-
相反,它是将signal tag声明的信号或是slot tag声明的槽与->
之后的函数进行connect,当你触发这个信号或是调用这个槽时,括号内的函数也会被调用,等价于:
this.ConnectBlur(controller.Controller.blur)
或是(如上面所说,可以省略函数名)
this.ConnectBlur(controller.Controller)
“->”和“<-”的一些使用规则
上一段里我们已经提到可以在这两个tags里省略连接和被连接对象的函数名,这里还有几个规则:
- 括号里指定的可以是全局对象,包括导入的包里的可见对象,例如上个例子里的
controller.Controller
。 - this代指当前对象的实例(可以理解为c++的
this
,python的self
占位符,或者golang的receiver
)。 - 括号里的内容还可以是
this.StructField
,也就是对象里的字段 - 对于想连接继承的
QObject
及其派生类或是其他类的signal/slot,目前只能使用this.BaseClass.method
的形式(与auto类似),这一点作者表示会在以后改进。
“->”和“<-”以及“auto”
这三者都需要和signal/slot tag配合使用,他们都会自动connect信号和槽,但是它们也有许多不同。
- 首先我们日常使用应该尽量使用
singal:"signalName,auto"
而不是auto(...)
,->
或<-
,如果只是为了少写Connect*
,那么不应使用后三者,因为除非你有大量的Connect*
需要编写,否则容易影响代码阅读,特别是对连接对象是当前类实例的成员函数时。 ->
和<-
用于不同的对象之间进行交互,比起分散的Connect*
调用,在struct tags里声明逻辑关系更易于维护。->
和<-
用于连接已有的信号和槽,如果想复用基类或者成员变量的signal和slot,你就需要->
或<-
替代auto
。- 和QML交互时,也应该使用
->
和<-
连接来自QML的signals。
客观上这三者都能极大的简化我们对signal/slot的实现和使用,所以根据不同的场景需求,我们需要选用合适的tags来简化我们的开发。
下一篇文章我们将了解constructor
这个tag,qt中的构造函数。
如果对本篇有什么疑问或者建议,欢迎在评论中提出。
祝玩得愉快!
转载于:https://www.cnblogs.com/apocelipes/p/9392628.html
【golang-GUI开发】struct tags系统(一)相关推荐
- golang日志服务器_日志系统 | log/syslog (log) – Go 中文开发手册 - Break易站
Go 中文开发手册 日志系统 | log/syslog (log) - Go 中文开发手册 import "log/syslog"概述索引示例 概述 软件包系统日志为系统日志服务提 ...
- 开源一个golang小程序商城后台系统(moshopserver)
开源一个golang小程序商城后台系统(moshopserver) 开源一个golang小程序商城后台(moshopserver) golang和c/c++比起来是一门新的语言,一直想学,网上搜集了一 ...
- [golang Web开发] 1.golang web开发:简介以及web服务器的搭建以及http协议简介
一.web开发简介 1.简介 Web应用在我们的生活中无处不在,看看我们日常使用的各个应用程序,它们要么是 Web应用,要么是移动 App 这类 web应用的变种,无论哪一种编程语言,只要它能够开发出 ...
- python gui开发工具_深入解析Python,透析应用开发,涵盖9大应用领域的Python框架...
前言 当前,Python 已经成为最流行的程序设计语言之一,被越来越多的人作为首选语言来学习和应用.作为一种解释型的语言,Python具有内置的高级数据结构和简单有效的面向对象编程机制.同时,其语法简 ...
- php7可以做什么开发,php7 图形用户界面GUI 开发怎么做?看完这个代码你就明白了...
[摘要]php7作为PHP的一个版本,也能实现很多功能,不过今天环球网校的小编要为大家讲解php7 图形用户界面GUI 开发怎么做?看完这个代码你就明白了,因为只要你了解了php7 图形用户界面GUI ...
- python编程工具p-python Gui开发工具选择
Python最大的特点就在于她的快速开发功能.作为一种胶水型语言,python几乎可以渗透在我们编程过程中的各个领域.这里我简单介绍一下用python进行gui开发的一些选择. 1.Tkinter T ...
- 【.NET Core 跨平台 GUI 开发】第一篇:编写你的第一个 Gtk# 应用
本文是[.NET Core 跨平台 GUI 开发]系列博文的第一篇.该系列博文是一个关于 Gtk# 跨平台应用开发的初级随笔集合.该随笔集合介绍了 GTK 和 Gtk# 的基本信息以及开发方法,并展示 ...
- 【Java】浅谈Java的GUI开发
GUI是什么? 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面. 图形用户界面是一种人与计算机通信的界面显示格 ...
- golang服务开发平滑升级之优雅重启
女主宣言 本文章主要探讨golang服务器开发中在平滑升级过程中对优雅重启的使用与研究. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算",点关注哦! 经典平滑升级方案 ...
最新文章
- windows下db2数据库的卸载
- ubuntu 14.04 安装redmine
- CPU并行与GPU并行联系及区别
- 老师,我们想看到您的笑容!
- PHP语法像C,PHP编程语法的三个魅力之处
- html css没有反应,只有CSS和HTML的标签没有正确响应
- 最痛苦的一周——第三周作业Collinear
- java中绘制长方形,椭圆形,圆形的方法
- 联想 M7400 pro Linux下 CUPS 驱动安装
- 一种雷达和电子海图图像叠加方法
- v2ex站长专访 - 100offer专访Livid:不仅仅是V站站长
- 污水计算机仿真技术,活性污泥法污水处理计算机仿真软件的开发及应用
- typora:一些常用数学符号
- 计网day12 奈氏准则和香农定理
- 【opencv】18、视频操作
- 东北大学OJ题解—1741: C语言编程测试2020-6-11-焦明海
- Workbench中DM建模草图修改不了的解决办法
- 基于蒙特卡诺和拉格朗日乘子法的电动车调度【有序、无序充放电】【Matlab代码】
- 计算机专业英语 论文的框架结构,一张图看懂硕士论文框架结构
- 微信小程序之model弹框
热门文章
- python解常微分方程龙格库_求解常微分方程组初值问题的龙格库塔法分析及其C代码...
- localhost可以访问 ip不能访问_如何解决域名可以访问80端口但访问不了其他端口的问题...
- java 打包工具_Java打包Windows安装程序
- python黑网站_python
- java 删除指定文件夹和下面所有文件_JAVA语言基础
- 图像形状特征(四)--轮廓树及PGH
- python list去重函数_Python基础中的集合,函数——06
- 导航守卫与keep-alive
- mysql安装无法创建mysqld_MySQL 5.7安装错误`mysqld:无法创建/写入文件’/ var / lib / mysql / is_writable’...
- Linux开发_printf打印无消息或末尾带“#“or“%“