QWidget对象的Eventable接口

2012-11-12

    今天我们来讲讲用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)
    }

分享到:
0
相关阅读
友情链接
© 2018 我考网 http://www.woexam.com 中国互联网举报中心 湘ICP备18023104号 京公网安备 11010802020116号
违法和不良信息举报:9447029@qq.com