a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 90|回复: 0

[专业语言] JAVA认证:QWidget对象的Eventable接口详解(2)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
/**
; n9 E! B: b, m* m    * 闭包的存放容器
) P6 M# h! J/ l- P3 o    * 允许将闭包作为一个队列存放,并在fire的时,按照队列先后顺序执行。! z* v3 m* y  n. V
    * @author Janpoem* d( \; y$ U* k: {: l
    */6 y: M- E# x, c  x
    sealed case class FnContainer(fn : Fn) {
& J% N1 m. A4 e0 ~0 l    private var fns = ArrayBuffer[Fn](fn)% T9 ~% B( K+ r/ [; M6 L  S8 x
    def +(fn : Fn) : this.type = {
) Q3 n' l; C- q0 a4 c2 W. E    fns += fn2 e  M9 X5 d/ d
    this
. n' p- |" a! b/ ]" Y% V/ s  {    }) f- O$ J+ m3 F& R5 Q
    def fire(widget : T, event : QEvent) : EventHandle = {
9 Q5 a  C: d9 L: K" H3 Z    val handle = EventHandle(widget, event)
; w/ X' e3 @7 H' W0 Q8 |    fns.foreach(_(handle)); E. f" n, G6 g! ^; D% b) @
    handle
2 u: ?  o3 N4 ~0 [    }' `$ K/ X- Y+ T3 t: c, P
    }
3 f) O8 \7 [2 A4 _1 @" [    // 定义Qt标准时间类型转换到当前类的助记名6 [9 @0 C: b; i# J% f5 O$ V/ r4 a
    // name统一使用小写
& k( ~8 j4 k2 R1 s. \8 ^) ?    // @TODO 要不断增加QEvent.Type的内容
- w- \" X; i4 P" m# H# b    private val _eventsMap = HashMap[QEvent.Type, String](9 F6 _/ {; i8 A  j# Z: j# J3 M' S
    QEvent.Type.Show
  E! y8 q# p- A8 k6 n    -> "show",8 n2 g  g& y, X' c' r
    QEvent.Type.MouseButtonPress& x0 r6 ]0 J$ E
    -> "click",1 ~2 M  c! R- D4 j" o4 q; U
    QEvent.Type.MouseButtonDblClick -> "doubleclick",6 G. \* h8 Y. w# R
    QEvent.Type.FocusIn
" q( ]. Z* p" P; U( m    -> "focus",9 v0 O: w$ G& p; M4 D9 l; P( Q
    QEvent.Type.FocusOut
( V8 l+ G3 j6 r  ^( M    -> "blur",
7 k: m4 s+ M  r. M    QEvent.Type.Enter: D0 B+ A0 o* k
    -> "enter",5 ~7 {. V# T- c# o% H. |( V$ V7 c$ |
    QEvent.Type.Leave1 R& W& I* P3 v  }; @
    -> "leave"4 |, A8 W% V: Z6 J8 G3 W
    )$ |/ ?& w& c' g7 @+ B7 X9 u- {  o  @$ {8 C
    // 事件
1 |  F7 l' D+ d    private val _events = HashMap[String, FnContainer]()$ o5 g8 M# {( e; u
    // 传入Qt的QEvent.Type,获取其在Eventable内部的快捷助记名
  B% m6 R  k4 J* ^4 h    def eventType2Name(_type : QEvent.Type) : Option[String] = _eventsMap.get(_type)
7 c  v# x0 z9 G& ?3 O0 S, L    // 装载事件" x3 H( [- ?# R$ b
    // w.addEvent("show", handle => { /*  */ })/ r; R: u6 a- x3 U" N
    def addEvent(s : String, fn : Fn) : this.type = {
+ W6 `# t: B! A! z' x6 N    val name = s.toEventName+ M) @+ y3 ?+ n; Z, K0 O
    if (!this.hasEvent(name))# V4 `0 H# q- J! H% t% X
    _events(name) = FnContainer(fn)
1 S+ {4 e- ^/ x+ O- G" c    else
5 a# v) d9 P5 c    _events(name) + fn% ~8 V  w  z" \" G8 p+ v
    this5 `, g! q  E6 _% [7 C
    }
4 e$ Q4 D% G8 r, q/ K$ E5 U    // w.addEvent("click" -> { handle => println(handle.event) })" Q  V2 S) N! O# [" H' s
    def addEvent(event : Ev) : thisthis.type = this.addEvent(event._1, event._2)9 o. a, u1 T* p6 Z8 U
    def addEvents(events : Ev*) : this.type = {
1 i+ ^6 A# W' _* Z: k    events.foreach(this.addEvent(_))
9 t' U- ~5 z+ `3 v% m; C    this
) ^! D2 x9 j: V  J, ~( w- ?    }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 08:47 , Processed in 0.230980 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表