当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
QWidget对象的Eventable接口
发布时间:2011/5/10 10:03:06 来源:城市学习网 编辑:ziteng

    今天我们来讲讲用Scala实现Qt QWidget对象的Eventable接口。这个Eventable接口是我项目中常用的一个东西,Scala强调FP,但是Qt Jambi本身是基于OOP的,事件重载需要在类里面进行。在前面展示的例子中,大家可以看到经常会这样展开一个类去重载:
    new QLabel {
    override def xxxxEvent  }  这种声明的方法多了其实很容易让人觉得不规范,而且阅读也是不易。所以我萌生了让将js那种声明事件风格的代码加入至此,js是一个可以很fp的语言,而scala也是,这不是一个很好的决定吗?献上具体的代码:
    package yourporject.package
    import scala.collection.mutable.{ ArrayBuffer, HashMap }  import com.trolltech.qt.gui._  import com.trolltech.qt.core._  import com.trolltech.qt.core.QEvent  import com.trolltech.qt.QSignalEmitter._  import com.agiers.mvc.Base  /*
    * Base类里面封装了的是对于Java和Scala既有类的方法扩展,使用的是隐式混入的方式,不会改变对象本身。
    * 如
    * "onClick".toEventName => click
    * "中文字".encode => url encode
    * "繁体字".encodeSys => 这个是根据客户端操作系统默认的字符编码进行urlencode
    * "繁体字".toSimplified => 繁体转简体
    * "简体字".toTraditional => 简体转繁体
    * "hello_world".toCamelCase => HelloWorld
    * "good guys".dump("temp.txt") => 将字符串内容输入到一个io文件中
    * "hello world".md5 => 将字符串md5加密
    */
    trait Eventable[T <: QWidget] extends QWidget with Base {
    // 定义闭包的格式声明
    // 凡是在Eventable里使用闭包的类型,应该首先使用Fn类型
    // 修改闭包类型,应该在此修改,而不在具体声明的地方修改
    type Fn = EventHandle => Unit
    // 定义一个event的类型组合
    // 这个代表的实际上是String -> Fn或者(String, Fn)
    type Ev = (String, Fn)
    /**
    * 事件接管对象
    * 用于接管声明事件时的闭包处理,并临时寄存该闭包中的各种状态和变量
    * @TODO 要逐渐增加他的寄存和读取的接口
    * @author Janpoem
    */
    sealed case class EventHandle(val widget : T, val event : QEvent) {
    // 这个是用来获取该widget执行event时的状态的
    private var _break = false
    // 以下
    def isBreak = _break
    def isBreak_=(is : Boolean) = _break = is
    def break(fn : EventHandle => Boolean) = isBreak = fn(this)
    }

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved