造了个新轮子 ef.qt ,让我们用写前端的手感来写 qt

2019-12-16 17:59:32 +08:00
 ClassicOldSong

https://github.com/TheNeuronProject/ef.qt

用法参考 ef.js ,官网 ef.js.org

跟女票一起造的轮子,codegen 部分是用 js 写的,所以生成出来的东西是纯 C++的,性能超强。有了 ef.qt 以后至少我自己开发跨平台桌面应用的话,electron 可以洗洗睡了。。。

demo app 体积只有 100k 左右,内存占用 10M,相当节省资源。更关键的是,我甚至可以在嵌入式应用里使用 ef.qt 且依旧能够保持极高的性能和极低的占用。对比一下 rn 或者 weex 这样的技术,ef.qt 同样能做到一套代码在多个平台上使用,而且还摆脱了 js runtime 带来的性能问题,使用体验也十分接近前端开发,岂不美哉🤣

8536 次点击
所在节点    分享创造
65 条回复
ClassicOldSong
2019-12-17 11:08:36 +08:00
@123s 不是,是让用 C++写 qt 的时候能像写前端一样方便
diveIntoWork
2019-12-17 11:39:05 +08:00
error: C2653: “ef”: 不是类或命名空间名称

demo 跑不通。。
yangheng4922
2019-12-17 13:42:34 +08:00
用起来怎么样
SansXie
2019-12-17 14:29:42 +08:00
看了下源码, 跟我写的 thrift 转 ts, ts gateway 生成 api 类型包都是一个套路出来的哈哈哈
OctopusGO
2019-12-17 14:32:24 +08:00
举报了,楼主有女票
ClassicOldSong
2019-12-17 14:42:36 +08:00
@diveIntoWork 你是不是忘记运行 `efqt generate` 了。。。。另外 VisualStudio 下的行为我不太熟悉,有熟悉的同学麻烦帮忙看一下😂
ClassicOldSong
2019-12-17 14:43:52 +08:00
@diveIntoWork 刚刚修了一个绝对路径的 bug,麻烦顺便更新一下
1239305697
2019-12-17 18:06:43 +08:00
好了,知道你有女朋友了
hmzt
2019-12-17 18:29:01 +08:00
就是说用 js 来写界面, 不用 qt 自带的手动拖控件?
xrr2016
2019-12-17 18:32:10 +08:00
画重点 “跟女票一起造的轮子”
ClassicOldSong
2019-12-17 18:46:54 +08:00
@hmzt
![image]( https://user-images.githubusercontent.com/10512422/70927016-2903ef00-2069-11ea-8385-2b004fc914af.png)

不是用 js 写界面,是用图上这种模版语法来写,然后用 js 写的生成器把模版生成为 C++ header。好处是可以在模版里标注逻辑层需要访问 /修改哪些信息,并且可以在模版里描述哪些地方需要监听事件。这样逻辑层就可以只操心模版中标注出来的信息而不需要管其他无关紧要的布局 /占位用 widget。
nobodyhere
2019-12-17 20:08:45 +08:00
ClassicOldSong
2019-12-17 20:32:08 +08:00
@nobodyhere 这个的逻辑层还是 js,而且还多了一大把 js 跟 C++之间的数据交换开销。ef.qt 实际上是纯 C++的,所以最终的执行效率、内存占用以及文件体积都会比基于 NodeGUI 的东西小很多很多。
ClassicOldSong
2019-12-17 20:34:51 +08:00
@yangheng4922 我女票表示:
```
我花了 10 分钟解决了在 Qt Creator 里拖来拖去半小时才能解决的问题
```

```
然后我刚才发现
使用 efqt 我可以做这么一件神奇的事情
使用同一套逻辑管理几种不同的界面
用模板就行了
```
ClassicOldSong
2019-12-17 20:36:09 +08:00
@yangheng4922
```
所以,这样的话,我的 UI 部分无论怎么变化,逻辑代码都不用变
只要相同功能的控件名字一样
```
ClassicOldSong
2019-12-17 20:37:49 +08:00
@ClassicOldSong 噗执行效率应该是高很多很多
aunox
2019-12-17 20:52:44 +08:00
加油,让我们看到更多
secondwtq
2019-12-17 21:11:51 +08:00
C++ 写逻辑就说的通了 ...
GUI 还有一个问题是集合的处理,就是把数组渲染成控件列表,数组更新时控件如何更新的问题(或者可以扩展到任何 non-trivial 的数据绑定)
React 和 Angular 是根据 key 做 diff,需要整个遍历一遍数组。WPF 稍微聪明一点,搞了个 ObservableCollection
Qt 需要显式操作组件,Cocoa 不用 Binding 的话好像也是
不知道 ef.qt 怎么处理
ClassicOldSong
2019-12-17 21:29:47 +08:00
@secondwtq ef 比较偷懒,数组里放的是组件而不是 data,所以对数组的操作是直接映射到 view 上 widget 的位置变化上的。ef 的逻辑是单层管理,所以并不存在 React 或者 Vue 或 Angular 这样需要给数据进行 key tracking 或者 diff 的操作。
这一点在 ef.js 和 ef.qt 里都是如此,而我造 ef.js 的最初始动机就是 Vue 想要在一个列表渲染结果里展示不同类型的组件时写起来太尴尬。。。需要 v-if、v-else、v-else-if 写一大堆,而我把不同类型的数据放进去之前很可能已经做过一遍 if else 了。。。。。。
skadi
2019-12-17 22:34:45 +08:00
xml 描述 GUI,然后,他貌似说的要用 ruby 做"动"的东西.结果鸽了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/629553

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX