a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 93|回复: 0

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
/**& n( |% q' M+ B- d: J
    * 闭包的存放容器
' ^% @; m, p# H1 c) s0 W' Y5 x    * 允许将闭包作为一个队列存放,并在fire的时,按照队列先后顺序执行。
& U; v1 [2 z9 B- T7 \/ I3 ?    * @author Janpoem
: C1 T: ^: J0 ]- f    */( `) [0 ]5 `% \7 m. q
    sealed case class FnContainer(fn : Fn) {
7 c  J" N. v) T    private var fns = ArrayBuffer[Fn](fn). E8 `) G, s6 C* F9 U
    def +(fn : Fn) : this.type = {- _( K+ u/ Y2 U( \7 D8 N' `$ S, P, a$ j
    fns += fn
& E/ ~8 F2 g0 O0 k    this( w. s$ b; s8 O( O
    }
  z$ x5 q; O6 k5 k0 ]1 s  H# l    def fire(widget : T, event : QEvent) : EventHandle = {
) p( C% j9 V; w- w5 c, h    val handle = EventHandle(widget, event)
3 ]% ^; k! @1 j3 F    fns.foreach(_(handle))$ c& c# Z. {* b( I0 \  {) o
    handle$ x8 B1 `/ W/ R3 Q# b- @, b% ]
    }5 c7 O# |$ J. J+ h  a
    }( o! m1 C3 ?, f/ e
    // 定义Qt标准时间类型转换到当前类的助记名: u9 A# G2 D; X3 Z, @& \) o
    // name统一使用小写
! T7 E- V6 K$ H% [. {" a    // @TODO 要不断增加QEvent.Type的内容& b) R7 `3 B5 Z! b& Y
    private val _eventsMap = HashMap[QEvent.Type, String](2 ], g. F7 Z5 @# t( o* C/ P
    QEvent.Type.Show
6 A" h! [+ `; @, c    -> "show",
% d6 d' o( _1 T+ D    QEvent.Type.MouseButtonPress
6 {* }% }" i8 ~8 i) N0 D    -> "click",4 X  y: ?1 b$ U8 h6 k( X& N
    QEvent.Type.MouseButtonDblClick -> "doubleclick",
) j7 T# c9 B% c; p3 ?& Z. F8 r' [    QEvent.Type.FocusIn3 f8 h/ Y: _- b
    -> "focus",
# n# m, i+ |; O  D' a    QEvent.Type.FocusOut
+ a7 D- M4 ~0 Y6 A, q! M4 i- }* s    -> "blur",
! Y- a* @2 A- O2 R9 N. k    QEvent.Type.Enter" k( e% v! [: \: i. D: S# p7 `$ U9 [
    -> "enter",
' k% K, v7 T4 k% D: @2 `/ U9 c' x    QEvent.Type.Leave" i0 b! R1 M, c! |* Y
    -> "leave"- s; T# }& Q" t& |% i
    )5 |% K2 H/ n2 i8 e" v2 }9 ]( V
    // 事件* _: J: E9 j8 J+ ?+ ^  q$ H
    private val _events = HashMap[String, FnContainer](): V% n6 i8 k0 F" ?
    // 传入Qt的QEvent.Type,获取其在Eventable内部的快捷助记名
0 y! o" v% u3 @1 }- \& w4 Y+ C    def eventType2Name(_type : QEvent.Type) : Option[String] = _eventsMap.get(_type)
! P0 l+ H4 o1 s    // 装载事件
& D0 L& [. f* O: ?5 l. R1 i" l' |    // w.addEvent("show", handle => { /*  */ })
( X! c; ^( E/ b5 A* K3 Z: r8 C    def addEvent(s : String, fn : Fn) : this.type = {7 w) F; M9 s* T) e; i# b( m. \
    val name = s.toEventName
! ^1 T  b, A% x  Y/ L3 f& ~    if (!this.hasEvent(name))
% n& A6 w& K8 _6 B    _events(name) = FnContainer(fn)
' l$ t0 S% R( M6 p* @  C    else# T2 l/ f  l4 Q( |* B" G" D
    _events(name) + fn; b( n- a$ l! H6 |  r3 C9 U2 H, z% l
    this# V9 R& P3 E2 A* h
    }
" K. y) ]  W4 G9 H2 R7 v    // w.addEvent("click" -> { handle => println(handle.event) })
  M& w) z  _* Z    def addEvent(event : Ev) : thisthis.type = this.addEvent(event._1, event._2)6 E* u) M. u, v7 V: k1 [0 G) _
    def addEvents(events : Ev*) : this.type = {$ b' h# g& |) i0 M% G# n5 t7 i
    events.foreach(this.addEvent(_))8 g2 H" H  m' {; R. c0 h  r
    this. z( f& w) P6 L# k; }
    }
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-3 06:19 , Processed in 0.238367 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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