国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

用Scala實現Qt QWidget對象的Eventable接口

移動開發 后端
今天我們來講講用Scala實現Qt QWidget對象的Eventable接口。Scala強調FP,但是Qt Jambi本身是基于OOP的,事件重載需要在類里面進行。

今天我們來講講用Scala實現Qt QWidget對象的Eventable接口。這個Eventable接口是我項目中常用的一個東西,Scala強調FP,但是Qt Jambi本身是基于OOP的,事件重載需要在類里面進行。在前面展示的例子中,大家可以看到經常會這樣展開一個類去重載:

  1. new QLabel {  
  2.   override def xxxxEvent  
  3. }  

這種聲明的方法多了其實很容易讓人覺得不規范,而且閱讀也是不易。所以我萌生了讓將js那種聲明事件風格的代碼加入至此,js是一個可以很fp的語言,而scala也是,這不是一個很好的決定嗎?獻上具體的代碼:

  1. package yourporject.package  
  2.  
  3. import scala.collection.mutable.{ ArrayBuffer, HashMap }  
  4. import com.trolltech.qt.gui._  
  5. import com.trolltech.qt.core._  
  6. import com.trolltech.qt.core.QEvent  
  7. import com.trolltech.qt.QSignalEmitter._  
  8. import com.agiers.mvc.Base  
  9. /*  
  10.  * Base類里面封裝了的是對于Java和Scala既有類的方法擴展,使用的是隱式混入的方式,不會改變對象本身。  
  11.  * 如  
  12.  * "onClick".toEventName => click  
  13.  * "中文字".encode => url encode  
  14.  * "繁體字".encodeSys => 這個是根據客戶端操作系統默認的字符編碼進行urlencode  
  15.  * "繁體字".toSimplified => 繁體轉簡體  
  16.  * "簡體字".toTraditional => 簡體轉繁體  
  17.  * "hello_world".toCamelCase => HelloWorld  
  18.  * "good guys".dump("temp.txt") => 將字符串內容輸入到一個io文件中  
  19.  * "hello world".md5 => 將字符串md5加密  
  20.  */  
  21.  
  22. trait Eventable[T <: QWidget] extends QWidget with Base {  
  23.     
  24.   // 定義閉包的格式聲明  
  25.   // 凡是在Eventable里使用閉包的類型,應該首先使用Fn類型  
  26.   // 修改閉包類型,應該在此修改,而不在具體聲明的地方修改  
  27.   type Fn = EventHandle => Unit  
  28.   // 定義一個event的類型組合  
  29.   // 這個代表的實際上是String -> Fn或者(String, Fn)  
  30.   type Ev = (String, Fn)  
  31.     
  32.   /**  
  33.    * 事件接管對象  
  34.    * 用于接管聲明事件時的閉包處理,并臨時寄存該閉包中的各種狀態和變量  
  35.    * @TODO 要逐漸增加他的寄存和讀取的接口  
  36.    * @author Janpoem  
  37.    */  
  38.   sealed case class EventHandle(val widget : T, val event : QEvent) {  
  39.       
  40.     // 這個是用來獲取該widget執行event時的狀態的  
  41.     private var _break = false 
  42.       
  43.     // 以下  
  44.     def isBreak = _break 
  45.     def isBreak_=(is : Boolean) = _break = is 
  46.     def break(fn : EventHandle => Boolean) = isBreak = fn(this)  
  47.   }  
  48.     
  49.   /**  
  50.    * 閉包的存放容器  
  51.    * 允許將閉包作為一個隊列存放,并在fire的時,按照隊列先后順序執行。  
  52.    * @author Janpoem  
  53.    */  
  54.   sealed case class FnContainer(fn : Fn) {  
  55.       
  56.     private var fns = ArrayBuffer[Fn](fn)  
  57.       
  58.     def +(fn : Fn) : this.type = {  
  59.       fns += fn  
  60.       this  
  61.     }  
  62.       
  63.     def fire(widget : T, event : QEvent) : EventHandle = {  
  64.       val handle = EventHandle(widget, event)  
  65.       fns.foreach(_(handle))  
  66.       handle  
  67.     }  
  68.   }  
  69.     
  70.   // 定義Qt標準時間類型轉換到當前類的助記名  
  71.   // name統一使用小寫  
  72.   // @TODO 要不斷增加QEvent.Type的內容  
  73.   private val _eventsMap = HashMap[QEvent.Type, String](  
  74.     QEvent.Type.Show                -> "show",  
  75.     QEvent.Type.MouseButtonPress    -> "click",  
  76.     QEvent.Type.MouseButtonDblClick -> "doubleclick",  
  77.     QEvent.Type.FocusIn             -> "focus",  
  78.     QEvent.Type.FocusOut            -> "blur",  
  79.     QEvent.Type.Enter               -> "enter",  
  80.     QEvent.Type.Leave               -> "leave"  
  81.   )  
  82.     
  83.   // 事件  
  84.   private val _events = HashMap[String, FnContainer]()  
  85.  
  86.   // 傳入Qt的QEvent.Type,獲取其在Eventable內部的快捷助記名  
  87.   def eventType2Name(_type : QEvent.Type) : Option[String] = _eventsMap.get(_type)  
  88.     
  89.   // 裝載事件  
  90.   // w.addEvent("show", handle => { /*  */ })  
  91.   def addEvent(s : String, fn : Fn) : this.type = {  
  92.     val name = s.toEventName  
  93.     if (!this.hasEvent(name))  
  94.       _events(name) = FnContainer(fn)  
  95.     else  
  96.       _events(name) + fn  
  97.     this  
  98.   }  
  99.     
  100.   // w.addEvent("click" -> { handle => println(handle.event) })  
  101.   def addEvent(event : Ev) : thisthis.type = this.addEvent(event._1, event._2)  
  102.     
  103.   def addEvents(events : Ev*) : this.type = {  
  104.     events.foreach(this.addEvent(_))  
  105.     this  
  106.   }  
  107.     
  108.   // 判斷是否存在事件  
  109.   def hasEvent(name : String) : Boolean = _events.contains(name.toEventName)  
  110.     
  111.   // Qt事件覆蓋  
  112.   override def event(event : QEvent) : Boolean = {  
  113.     eventType2Name(event.`type`()) match {  
  114.       case Some(name) => 
  115.         if (this.hasEvent(name)) {  
  116.           val handle = _events(name).fire(this.asInstanceOf[T], event)  
  117.         }  
  118.       case _ => 
  119.     }  
  120.     super.event(event)  
  121.   }  
  122. }  

這個Eventable只是一個很初步的封裝,只是針對所有的QWidget適用,我還有好些想法,比如延時事件激活,定時事件循環。并且希望能對QObject進行全部的適用,而對于Qt的信號槽,自然也要兼容。唉,想法太多,可惜時間太有限。先用著吧,能好像寫js一樣寫事件聲明,該知足了。

下面奉上使用的代碼:

  1. class Widget extends QWidget with Eventable[QWidget]  
  2.  
  3. val w = new Widget()  
  4. w.addEvent("onClick", handle => {  
  5.   println("單擊了!")  
  6. })  
  7. w.addEvents(  
  8.   "show" -> { handle =>  
  9.     println("窗口顯示了")  
  10.   },  
  11.   "doubleClick" -> { handle =>  
  12.     println("雙擊了!")  
  13.   }  
  14. )  
  15.  

【編輯推薦】

  1. 用Qt實現類似QQ截圖的工具
  2. Qt 4使用MySQL的中文問題解決方法
  3. QML教程:構建和安裝QtComponents
  4. QML教程:Qt-Quick六大開源組件
  5. Necessitas 讓Qt應用解脫回家的誘惑
責任編輯:佚名 來源: oschina
相關推薦

2011-06-28 11:05:19

Qt QWidget Eventable

2011-07-04 16:12:00

QT QWidget

2011-06-16 11:13:13

QtQWidget

2011-03-18 19:50:32

ScalaJVMQt

2009-07-21 12:18:37

ScalaRational對象toString

2009-07-21 08:21:46

Scala對象相等性

2011-03-18 19:05:31

QQQtWidget

2009-09-09 14:09:35

Scala Trait

2009-07-22 09:22:20

Scala工廠對象

2011-06-15 17:28:23

Qt 多視圖 架構

2023-06-12 15:33:52

Scalafor循環語句

2009-08-13 10:35:05

Scala數組排序

2009-09-09 11:14:16

Scala對象

2010-03-11 10:34:22

Scala

2009-06-22 14:26:12

ScalaXML對象

2011-06-28 11:06:16

Scala

2010-11-17 11:31:22

Scala基礎面向對象Scala

2019-05-14 09:05:16

SerializablJava對象

2011-06-24 10:05:51

QT 對象 父對象

2011-06-21 18:02:14

Qt 動態 鏈接庫
點贊
收藏

51CTO技術棧公眾號

亚洲欧洲精品在线观看| 黄色成人在线视频| 亚洲午夜精品一区二区国产| 日本二三区不卡| 久久免费看毛片| 国产精品一区二区精品视频观看| 自拍偷拍亚洲欧美日韩| 亚洲高清一区二| 久久天堂国产精品| 欧美爱爱视频| 色88888久久久久久影院按摩| 中文字幕一区二区三区乱码| 116美女写真午夜一级久久| 永久免费不卡在线观看黄网站| 欧美96一区二区免费视频| 成人a免费视频| 欧美日本三级| 国产亚洲日本欧美韩国| 成年午夜在线| 亚洲黄色免费电影| 国产v亚洲v天堂无码久久久| 国产主播一区二区三区| 欧美高清性xxxxhd| 欧美视频久久| 亲子乱一区二区三区电影 | 亚洲午夜黄色| 国产精品直播网红| 欧美限制电影| 国产精品jvid在线观看蜜臀| 3d动漫一区二区三区在线观看| 亚洲毛片一区二区| 色呦呦在线免费观看| 色婷婷综合久久久久中文一区二区| 日韩男人天堂| 91啪亚洲精品| 男女无套免费视频网站动漫| 久久久久久久av麻豆果冻| 精品国产一区三区| 99视频一区二区| 菠萝蜜视频在线观看入口| 国内成人精品2018免费看| 中文字幕综合在线观看| 国产成人免费在线| 欧美乱做爰xxxⅹ久久久| 国产精品自拍网站| 性欧美videosex高清少妇| 蜜臀av性久久久久av蜜臀妖精| 国产成人无码一二三区视频| 久久精品国内一区二区三区| 97se国产在线视频| 精品国产一级毛片| 午夜精品福利在线观看| 日韩精品一页| 亚洲欧美一区二区三区在线| 牛牛精品视频在线| 欧美电影精品一区二区| 国产黄a三级三级三级av在线看| 91福利在线观看| 99免在线观看免费视频高清| 亚洲激情中文1区| 97se亚洲综合| 天然素人一区二区视频| 亚洲精品一区二区三区不| 僵尸再翻生在线观看免费国语| 日韩一区二区三区免费观看| 91超碰在线免费| 制服丝袜中文字幕一区| 色呦呦在线免费观看| 国产精品美女久久久久久久| 91麻豆天美传媒在线| 成人激情视频在线| 国产在线激情视频| 欧美一区二区三区在线看| 在线a免费看| 欧美日本在线一区| 成人免费图片免费观看| 亚洲国产成人久久| 色综合久久悠悠| 欧美中文在线| 色婷婷综合久色| a级黄色片网站| 亚洲私拍自拍| 日韩hmxxxx| 波多野结衣中文字幕一区| 女人另类性混交zo| 精品毛片三在线观看| 成年人在线观看网站| 欧美在线|欧美| 精品推荐蜜桃传媒| 欧美极品少妇全裸体| 成人a免费在线看| 99国产精品白浆在线观看免费| 成人黄色大片在线观看| 黄网页免费在线观看| 97超级碰碰人国产在线观看| 国产一区二区三区四区五区入口| 美国成人毛片| 琪琪第一精品导航| 久久久夜色精品亚洲| 美洲精品一卡2卡三卡4卡四卡| 久久精品影视伊人网| 一区二区小说| av观看久久| yourporn久久国产精品| ·天天天天操| 精品国产一区二区三区久久久狼| 川上优的av在线一区二区| 中文字幕高清不卡| 99中文字幕一区| 欧美xxxx做受欧美| 免费观看久久久4p| 亚洲午夜久久久久久久久电影网| 日韩精品视频在线观看一区二区三区| 欧美大尺度激情区在线播放| 国产亚洲欧洲| 欧美著名女优| 欧美性视频网站| 26uuu欧美| 欧美日韩不卡| 亚洲人成网站在线播放2019| av毛片在线免费| 国产精品色午夜在线观看| 久久九九全国免费| 亚洲高清影院| 欧美另类videosbestsex日本| 欧美日韩精品电影| 欧美日韩1区2区3区| 国产激情二区| 国产极品精品在线观看| 中文字幕视频一区二区三区久| 91精品亚洲一区在线观看| 国产黄色片免费在线观看| 国产午夜精品一区理论片飘花| 久久av老司机精品网站导航| 看黄网站在线| 国产无套精品一区二区| 色欲综合视频天天天| 欧美裸体在线版观看完整版| 最新中文字幕在线| 国产日韩中文在线| 精品久久久久久久久久ntr影视| 一区二区免费| 区一区二日本| 91精品黄色| 欧美一级二级三级蜜桃| 日韩精品亚洲一区| 色偷偷色偷偷色偷偷在线视频| 一区二区不卡在线观看| 国产午夜精品麻豆| 99精品视频一区二区三区| 国精品产品一区| 无遮挡又爽又刺激的视频| 久久国产精品免费视频| 久久免费视频一区| 欧美日韩一区二区三区四区不卡| 男人的天堂www| 亚洲情综合五月天| 国产精品视频一二三| 久久影院一区| 手机在线免费av| 亚洲成人av动漫| 久久视频在线免费观看| 国产日韩av一区二区| 亚洲va在线| 欧美办公室脚交xxxx| 国产精品-区区久久久狼| 欧美一级免费视频| 欧美特级www| 国产一区二区三区免费观看| 久久大胆人体视频| 黄上黄在线观看| 久久男人资源站| 国产精品久久久久9999| 337p亚洲精品色噜噜狠狠| 岛国精品在线观看| 日韩综合网站| 女厕盗摄一区二区三区| 欧美这里只有精品| 91精品国产综合久久男男| 7777精品伊人久久久大香线蕉完整版| www.四虎成人| 国产丝袜高跟一区| 亚洲日本va中文字幕| 91中文字精品一区二区| 精品一区二区三区不卡 | 亚洲精选91| 日韩脚交footjobhd| 国产综合免费视频| 国产在线一区二区三区四区| 色系列之999| 精品视频一区二区三区免费| 国产精品1区2区3区| 97精品国产| 成人涩涩视频| 女人偷人在线视频| 视频一区二区精品| 欧美一级片在线播放| 国产性色av一区二区| 色综合视频一区二区三区高清| 看片网站欧美日韩|