Hazama开发笔记

Hazama的开发进程已经无限搁浅。永远在C++重写阶段

 


Yuu Mousou2015-11-16 09:15:36-0500 – Updated: 2015-11-16 09:15:58-0500

关于Qt4的HiDPI支持,其实它在windows上的表现比linux还好。至少菜单里的图标是能正确缩放的(当然得提供够大的图像,qt只缩小不放大)

之前一直以为这是qt5的专利,完全搞错了……


Yuu Mousou2017-01-04 05:25:50-0500 – Updated: 2017-05-01 09:02:25-0400

======CPython和PySide内幕======

C扩展实现的类型可以自由决定实例能不能增删属性:在type里指定tp_dictoffset然后在实例结构体里留个PyObject的指针(用来存__dict__)就行了。tp_dict是存type自己的属性用的。如果要使类型本身能增删属性就用它了。不过每次改完得调用下PyType_Modified,它会清除属性查找缓存。可能是因为这个内置类型才不能直接修改(略牵强)。


Yuu Mousou2016-12-29 22:59:33-0500 – Updated: 2017-05-01 09:02:44-0400

======列表======

就是这种web上也非常常见的元素比较复杂的列表。列表里的每个项(item/entry)都包含其他很多子元素的(如用户头像、实际内容的预览、日期、“展开”按钮之类)。

关于行数限制:
内容预览一般都会切掉过长的内容。我原来用的是先算好预览行数限制对应的高度,然后直接暴力切掉。这样当有很多字的时候那些看不见的字也照样会被渲染。现在换用Qt的QTextLayout真正排版出来(题外话,看API的样子不支持竖排),效率反而会提升。
QTextLayout的文档挺抽象的,要不是QML里有类似功能(maximumLineCount)我也不会发现。但是去年或者前年明明已经知道也看了文档,结果就是没法理解。果然是等级不够

关于ListView的实现:
准备一个模板widget,每次paint事件都设好数据然后直接渲染widget。Android的RecyclerView更高级,会自动回收不再可见的模板widget让app放新数据进去。它的模板数量等于viewport里可见的行数。参考http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

关于Fallback和高度:
以前一直没解决的正文一旦含有当前字体没有的字符时高度会和预先计算的对不上的问题。然而这次换用QTextLayout之后默认是不包括字体的leading的,莫名其妙的就正常了……看一票英文字体反正也没leading(Dejavu之类),就这样吧。原因以后再找


Yuu Mousou2016-11-04 23:29:02-0400 – Updated: 2017-05-01 09:03:42-0400

======字体渲染======

日记软件本身的原创功能没多少,却加了一堆歪门邪道上去……

这次是Windows字体渲染增强功能,mactype。经过调教,在150%缩放的显示器上观感很接近Ubuntu的渲染。毕竟底层都是FreeType。

补图,150%缩放10pt字体的效果果然还是一般般。用久了新鲜感过去了就觉得不过是换了种风格。毕竟老式渲染技术就是为了让小字号尽量清晰。差距在大字号才显现出来。
左图传统GDI,右图mactype(当然不是默认配置),左图里字的边缘像是被狗啃过。当然如果没见过高分辨率的平板/电子书阅读器的效果的话,也不是不能接受……

mactype的默认配置真是不敢恭维,以前什么都不懂的时候用过,100%缩放糊成屎还用的不亦乐乎

 

最近win10的1703版增加了系统增强DPI缩放模式,对直接使用win32api的GUI程序效果最好,对自绘控件的框架如gtk几乎没有效果。截图里字体被肆意替换导致混乱(然后1703正式发布的当天出的累积更新修复了这个问题。):

现在cintanotes可以借这个功能几乎完美支持hidpi了,真是悲伤:


Yuu Mousou2016-12-21 08:45:38-0500 – Updated: 2016-12-21 08:50:36-0500
#Universal-C-Runtime
简直是那些自带crt的dll的程序的噩梦。原来两三个dll搞定,现在要四十几个。
微软在这篇文章说目的是为了让CRT的一部分“稳定”,而且还禁止了自带crt(说这是系统组件,你不能自带。我们要消灭你的控制面板已安装程序里那一排排的CRT,不过后来又屈服了)。以后的VS就不会有msvcr150.dll啥的了,而是对ucrt原地升级。像firefox那样满不在乎的把这一堆dll全塞进目录……


Yuu Mousou2016-12-04 00:51:41-0500 – Updated: 2016-12-04 21:15:52-0500
#字体
Qt自带的字体选择,和系统自带的在很多方面有微妙的区别。比如同属一个family的一些字体不会自动整合到同family的style选择里。例如:https://github.com/adobe-fonts/source-sans-pro/issues/50 里提到的细体之类单独显示为一个字体(系统的字体对话框至少win7及以上无此问题)。
然而普通的FontCombo(上面讲的是FontDialog)因为没有地方去整合(大部分程序只有粗体和斜体俩按钮,没地方选其他风格),只好显示无法整合的(当然Bold和Italic一直不会单独显示为一个family,不过还可以干加粗细体这种无聊的事)。似乎DirectWrite在枚举所有family的时候会自动整合

Yuu Mousou2016-12-09 09:28:41-0500 – Updated: 2016-12-09 09:28:41-0500
同一个QTransform,位置不同Combo的文字效果也不同,玄学?

Yuu Mousou2016-11-20 08:34:02-0500 – Updated: 2017-05-01 09:04:00-0400

======Windows Manifest======

Windows的Manifest的一些有趣用途:
1. 可以用来抵消Qt的SetProcessDPIAware的效果(https://msdn.microsoft.com/en-us/library/windows/desktop/ms633543(v=vs.85).aspx
2. 可以把MSVCRT的DLL塞进子目录(特别是VC2015的ucrt那一堆)

属性一览:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374191(v=vs.85).aspx

外置的manifest似乎要改注册表才会被读取;内嵌用命令:/c/Program\ Files\ \(x86\)/Windows\ Kits/10/bin/x64/mt.exe -manifest python.exe.manifest -outputresource:”python.exe;1″


Yuu Mousou2016-11-22 23:30:40-0500 – Updated: 2017-05-01 09:04:17-0400

======cx_Freeze======

最近出了5.0版,支持了Py3.5。观察了一下发现base exe变的很小,以前内嵌在exe的模块估计都扔到zip那边去了。3.5似乎动了包导入系统,还新加了个embedded distribution。


Yuu Mousou2016-10-23 21:48:12-0400 – Updated: 2017-05-01 09:04:36-0400

======PySide的局限性======

1.遍历Model时特别慢,反复创建QModelIndex,耗时是在等价list上操作的20倍(原版的全部方法都是内联,再配上栈分配必然是飞速)

2.有时返回的对象用不了,或者根本没有对应方法的bind。比如QScrollBar.parent,直接就返回了个QWidget,我自己继承的不见了


Yuu Mousou2016-12-27 00:48:37-0500 – Updated: 2017-05-01 09:04:56-0400

======VisualElements======

让windows 10的开始菜单里的图标变大的方法。
然而效果确实不怎么样,因为个别图标很大会显得突兀,而且底色和主题色不协调的话会瞎眼。


Yuu Mousou2017-08-13 04:47:37-0400 – Updated: 2017-10-06 07:55:56-0400
======PySide转到原生Qt======
– QObject的子类有些不适合弄成成员变量,最好留个指针在ctor里new起来。比如QWidget(不便设置parent,因为QObject的dtor会自动delete所有child)- 要用信号槽功能的类别忘了加Q_OBJECT宏,而且编译前要qmake一下。每次都忘- Qt5的QTextLayout排版文字时第一次非常慢,要300ms(QLabel的layout和QPainter::drawText都要用到)。跟进去发现是几乎把所有系统字体的信息都加载了一遍,用作fallback

Yuu Mousou2016-10-30 06:38:01-0400 – Updated: 2017-10-06 07:57:57-0400

======Qt的一些讨厌之处======

1. 莫名其妙的默认字体。在中文Windows上默认的一般界面字体是宋体,如果你的显示器缩放比是100%以上那么字体发虚难看的要死。然而tooltip和菜单又是非衬线的雅黑(更正,似乎这是符合windows标准行为的)

2. Qt5的某个版本以后应用在Windows上是Per-Monitor DPI Aware的,然而Qt自身不能正确处理。会发生移动窗口到另一显示器后菜单肥硕无比、各种控件大小不对的恶劣现象。

3. sqlite3的驱动比较偷懒,错误信息不明不白的。比如数据库文件是只读,python就会报对应错误,qt则是个out of memory,见鬼去啊


Yuu Mousou2017-11-11 01:56:58-0500 – Updated: 2017-11-22 05:10:32-0500

最近几个月都没怎么更新,于是买了个新域名来激发一下动力。C++重写计划,要完了吗

https://hazama.cc/


终于快重写完了,大概还剩800行py代码的样子
————–
今天在翻译删除日记部分的代码,因为之前都信心满满的用真实的日记做实验,结果这次翻车了。删掉了今天的日记(还好有每日备份
————–
内存泄漏,一点头绪都没有,说来惭愧vs的调试器里一坨信息我硬是没看出到底哪漏了。好不容易在linux上编译了想用valgrind,结果程序退出的一瞬间就segfault,c++啊啊 啊啊啊


Yuu Mousou2017-12-08 08:42:36-0500 – Updated: 2017-12-08 08:44:20-0500

以前想做Per-Monitor DPI Aware,但是看到bug10自己的资源管理器都bug一堆,还是不做了吧。先不说难度,用老显示器的时候也是一直单屏

图为8寸寨板1280×800分辨率换到1080p和200%缩放时的奇景

 

 

 

暂无评论

发送评论 编辑评论


上一篇
下一篇