【golang-GUI开发】qt之signal和slot(二)

栏目: 编程工具 · 发布时间: 6年前

内容简介:今天我们将介绍slot的使用。在qt中slot和signal十分相像,这次我们将实现一个能显示16进制数字的SpinBox,它继承自QSpinbox并重写了我们先看一下示例:

上一篇文章 里我们详细介绍了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()
}

显示效果:

【golang-GUI开发】qt之signal和slot(二)

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

祝玩得愉快!


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

腾讯之道

腾讯之道

艾永亮、刘官华、梁璐 / 机械工业出版社 / 2016-7-19 / 59

放眼整个中国乃至全球,腾讯都是一家成功的互联网企业,它代表中国企业在世界互联网版图中竖起了一面高高的旗帜。腾讯为何能取得如此大的成就,它的成功方法和商业逻辑是什么?你是不是和无数中国企业和商界人士一样,都想向腾讯取取经,但是又不得其门而入? 腾讯一直以低调、务实著称,所 以腾讯及其内部员工都极少对外界分享他们的经验;加之腾讯的商业模式多元、业务繁多且交叉、体量又极其庞大,使得从外部来系统研究......一起来看看 《腾讯之道》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具