登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> clq站长各处正式文章收集勘误 >> 主题: 跨平台 UI 框架的事件传递设计及简化历程 [持续更新进化中]     [回主站]     [分站链接]
跨平台 UI 框架的事件传递设计及简化历程 [持续更新进化中]
浏览(428 + ) 作者: clq  发表于 2022-12-17 15:34:34   编辑 关键字:

跨平台 UI 框架的事件传递设计及简化历程 [持续更新进化中]

----------------------------------------------------------------
本文对应 github 中的
qt_file/_ui_align 点击等事件的实现[QT版].txt
https://github.com/clqsrc/sz_ui_align/qt_file/_ui_align 点击等事件的实现[QT版].txt
http://newbt.net/ms/vdisk/show_bbs.php?id=7636D666A696E40B18FF01A027646163&pid=164

对应源码
lua_functions_event.lua
lua_functions_event_new.lua

----------------------------------------------------------------

框架已在工作中使用多年,不过没开源,还没想好叫什么名称,不过估计会带有 ui_align UIAlign newbt_ui_align 这样的。

其实并不难。

不过这之中事件的转递改了好几个版本,原因是开始时针对 lua 的特点设计得非常精巧,目的是想在 lua 中使用方便点。不过需要改进时发现这样我很难想起当初是为什么要这样设计的,同时涉及的代码太多,加个功能差一点点没弄好就不起效。

现在是版本是这样的,当 ui 中有事件,例如 qt ,时直接调用 lua 中的全局函数 UI_OnEvent 怎么知道是哪个控件触发的呢?
直接将对应的 QWidget * view 指针转换为字符串就好了。因为 lua 创建控件或者取控件时得到的就是这个指针的字符串,所以它是知道界面中谁发生了事件的。

而对于 java 这样不好直接使用指针的,那么双方约定一个相同的指针向整数转换的方法,同时使用这个转换后的整数结果就可以了。这样 lua 方完全不用将自己的参数转递给 c 语言端。
那么事件触发时 lua 如何知道是调用哪个函数去处理呢?
答案是 lua 自己绑定控件与函数的关系,比如 lua 中定好:key 为 "控件1" + 事件 "鼠标按下" 时,value 为 处理事件为 "函数1",参数为 "参数1"。
这样当 UI_OnEvent 被调用时,通过其中的控件指针和事件类型就可以找到对应的 value 从而调用其中的 "函数1"。

新增加一个文件 lua_functions_event_new.lua
只有两个函数。
--//设置 UI_OnEvent 时要调用的函数和参数 //obj 可以是 UiEvent, func 等,设置时是什么,取出时就是什么
function Set_UI_OnEvent_Func(view, event_name, obj)

--//UI_OnEvent 触发时根据传入的内容取出设置的 obj (如果有设置的话)
function Get_UI_OnEvent_Func(index)

增加了三个函数来对以上操作进行辅助
function MakeEventObj(func, param)

-- //ts 是不支持返回返回值的(严格来说是无法正确转换成 lua 的)
function GetEventObj_func(eobj)
function GetEventObj_param(eobj);

设置事件函数时大概是这样
Set_UI_OnEvent_Func(file1, "mouse_down_right", RClick_Desktop_file);
这个 RClick_Desktop_file 可以直接是函数也可以是 MakeEventObj 后的东西,不过为了统一最后是 MakeEventObj 后的东西。

事件发生时会告知 view 的事件的名称,即这里的 [file1, "mouse_down_right"],这两个东西 qt 是直接知道的,并不用 lua 转入参数
在 lua 中会触发 UI_OnEvent 根据这个函数中的 s_key, event_key 对应到上面的 [file1, "mouse_down_right"] 用它们组成 key ,通过 GetEventObj_func GetEventObj_param 取出设置的函数和参数,
最后调用就可以了。

这里要注意的是 ts 转换成 lua 函数时会在成员函数中带一个 self 参数,所以我们为了最大兼容性通通忽略掉事件响应函数中的第一个参数。
同时因为 c 语言/qt 里在事件触发时,除了知道是什么事件外,还会有自己的参数,所以在 lua 的事件函数中还得有一个参数来接收它。所以 lua 的事件函数最好是有三个参数:
第一个交给 ts 不使用,第二个是自己传入的参数,第三个是 c语言/qt 传入的参数。






[2022-12-17 17:18:03 最后更新]


总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1