上一篇文章里我们详细介绍了signal的用法。

今天我们将介绍slot的使用。在qt中slot和signal十分相像,这次我们将实现一个能显示16进制数字的SpinBox,它继承自QSpinbox并重写了validatevalurFromTexttextFromValue这三个slot,以便能将原先的10进制整数值显示为16进制。我们将在其中展示slot的具体用法。

slot的声明

我们先看一下示例:

type HexSpinbox struct {
widgets.QSpinBox _ func() `constructor:"init"` _ func(int) string `slot:"textFromValue,auto"`
_ func(string) int `slot:"valueFromText,auto"`
_ func(string, int) gui.QValidator__State `slot:"validate,auto"` validator *gui.QRegExpValidator
}

我们看到和signal一样,需要用struct tags来指定slot和它的名字,名字一样会被strings.Title处理。在Qt中slot实质上是普通的函数,所以是允许拥有返回值的。

我们同样看到slot也可以指定auto,没错对于slot,qt也会像signal一样生成Connect[slot name]Disconnect[slot name][slot name]这三个函数。

这里有一点需要特别注意,在qt中生成slot函数其实和信号一样,是一个空壳函数,需要用Connect[slot name]使其和具体的函数连接,这样才可以通过[slot name]函数使用这个slot。而auto则和signal会自动进行connect。

到目前为止,我们的slot其实和普通的成员函数没什么区别,而且在qt中signal可以和任意函数连接,那么为什么还要特意声明成slot呢?

那是因为我们要对slot进行重写,对Qt熟悉的读者可能已经发现我们的例子里的三个slot正是QSpinBox的slot,我们对它们进行了重写。因为使用了moc系统,直接使用struct里的同名函数进行重写是无效的,所以我们需要用到slot tags。而我们例子里类的派生类也可以通过slot tags来重写基类的slots。如此一来自定义组件将会更为方便和灵活。

slot的使用

前面提到过,想要使用slot,得先connect它,这是和Qt的重要区别之一:

// init 初始化对象,由NewHexSpinBox自动调用
func (h *HexSpinbox) init() {
h.SetRange(0, 255)
// 我们通过正则来验证输入,保证只能输入16进制数字
regexp := core.NewQRegExp2("[0-9A-Fa-f]{1,8}", core.Qt__CaseSensitive, core.QRegExp__RegExp)
h.validator = gui.NewQRegExpValidator2(regexp, h)
} // slots 的实现,这些slot都由spinbox自动调用
// validate 对输入进行验证,无法通过的内容不会被显示
func (h *HexSpinbox) validate(input string, pos int) gui.QValidator__State {
return h.validator.Validate(input, pos)
} // textFromValue 将输入或增加/减少后的内容转换成string并显示出来
func (h *HexSpinbox) textFromValue(value int) string {
return strconv.FormatInt(int64(value), 16)
} // valueFromText 将显示或输入的合法内容转换成整数int
func (h *HexSpinbox) valueFromText(text string) int {
value, _ := strconv.Atoi(text)
return int(value)
} // NewHexSpinbox是moc生成的构造函数,我们以后会讲解
box := NewHexSpinbox(nil)
// 连接slot,使其可用,如果指定了auto就无需手动connect,这里作为示例进行演示
box.ConnectValidate(box.validate)
box.ConnectTextFromValue(box.textFromValue)
box.ConnectValueFromText(box.valueFromText)

连接好之后我们就能调用box.Validatebox.ValueFromTextbox.TextFromValue啦。

// 就像signal,调用他们时连接的函数也会被调用
// 一点区别在于slot拥有返回值,所以你也可以使用变量来接收slot返回的结果
box.ValueFromText("ff") // -> 255
box.TextFromValue("26") // -> "1a"

当然,我们重写这些slot不是为了在代码里调用的,而是为了改变SpinBox显示行为的。

下面是main函数,对于slot的处理完成之后,像使用普通的widget一样使用我们的HexSpinBox即可:

func main() {
widgets.NewQApplication(len(os.Args), os.Args) hexSpin := NewHexSpinbox(nil)
hexSpin.Show() widgets.QApplication_Exec()
}

显示效果:

怎么样,是不是很简单? qt就是这样一个简单而又灵活的库,后面我们还将进行跟深入的研究。如果有意见和建议欢迎在评论中指出,也欢迎大家积极提出问题。

祝玩得愉快!

【golang-GUI开发】qt之signal和slot(二)的更多相关文章

  1. 【golang-GUI开发】qt之signal和slot(一)

    想了很久,我决定还是先从signal和slot(信号槽)开始讲起. signal和slot大家一定不陌生,先看一段示例(选自文档): class Counter : public QObject { ...

  2. qt的signal和slot机制

    signal和slot是QT中的一大特点 signal/slot是Qt对象以及其派生类对象之间的一种高效通信接口 用户可以将N多个信号和单个槽相连接, 或者将将N个槽和单个信号连接, 甚至是一个信号和 ...

  3. 深入了解Qt(三)之元signal和slot

    深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解.在此向原作者表示感谢! 在Qt 信号和槽函数这篇文章中已经详细地介绍了信号和槽的使用及注意事项.在这里对其使用方面的知识 ...

  4. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  5. Qt Signal and Slot

    Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...

  6. PyQt5 signal and slot

    PyQt5 的 signal 与 slot 有所改变,例如,先定义一个 ZeroSignal 类: class ZeroSignal(QObject): atzero = pyqtSignal(int ...

  7. VS IDE环境下,windows GUI(Qt MFC,win32)使用控制台实时打印调试信息

    在工程属性的页面下,点击Build Events,在Build Events下点击Post-Build Event. 然后再Command Line里面输入以下命令: editbin /SUBSYST ...

  8. Python GUI开发环境的搭建

    原文:Python GUI开发环境的搭建 最近对Python的开发又来了兴趣,对于Python的开发一直停留在一个表面层的认识,玩的部分比较大. Python的入手简单,语法让人爱不释手,在网络通信方 ...

  9. Sublime Text3 + Golang搭建开发环境

    Sublime Text3 + Golang搭建开发环境 http://blog.csdn.net/aqiang912/article/details/46775409 1.安装git 因为golan ...

随机推荐

  1. Exp8 Web基础 20154320 李超

    1.实验后回答问题 (1)什么是表单. 表单是一个包含表单元素的区域,表单元素是允许用户在表单中输入信息的元素,表单在网页中主要负责数据采集功能,一个表单有三个基本组成部分:表单标签.表单域.表单按钮 ...

  2. 与http协作的web服务器--代理、网关、隧道

    一台服务器可以搭建多个web站点 代理: 接受客户端发送的请求,转发给其他服务器,然后接受服务器的返回结果(响应)再返回给客户端.每次经过代理服务器,就会追加写入via首部信息. 按两种基准分类.一种 ...

  3. windows mysql zip 安装

    https://www.cnblogs.com/iathanasy/p/8461429.html

  4. 转Centos7.0进入单用户模式修改root密码

    Centos7.0进入单用户模式修改root密码   启动Centos7 ,按空格让其停留在如下界面. 按e进行编辑 在UTF-8后面输入init=/bin/sh 根据提示按ctrl+x 得如下图 输 ...

  5. Bootstrap3.3.7

    页面的布局 <-!不让文字超出左右屏幕--> <style> .demo { word-wrap: break-word; } </style> 他们为那个模板中的 ...

  6. Qt Creator快捷键设置

    QT Creator 下载地址 http://download.qt.io/ 一.快捷键配置方法: 进入“工具->选项->环境->键盘”即可配置快捷键. 二.常用默认快捷键:   编 ...

  7. CSS3中很容易混淆的transform,translate,transition。如何去区分,以及综合写法。

    属性 含义     transition(过渡) 用于设置元素的样式过度,和animation有着类似的效果,但细节上有很大的不同 transform(变形) 用于元素进行旋转.缩放.移动或倾斜,和设 ...

  8. Chapter 8 The Simplest Plug-in Solution

    This chapter introduces the simplest plug-in solution that are applicable to the four major componen ...

  9. 大叔学ML第一:梯度下降

    目录 原理 实践一:求\(y = x^2 - 4x + 1\)的最小值 实践二:求\(z = x^2 + y^2 + 5\)的最小值 问答时间 原理 梯度下降是一个很常见的通过迭代求解函数极值的方法, ...

  10. Android NDK学习(七):NDK 编译支持 C++特有的库

    如果你的C++代码中出现了很多C++特有的库,例如<iostream>,<list>等,那么你还需要在jni的文件夹下添加一个Application.mk文件,文件内容为: A ...