Jump to Navigation

Qt5

Qt5.0版本

另一种qt绑定到c, go语言的方式

这种方法,主要是解决编译速度问题,编译占用内存资源大的问题。

这是与现在therecipe/qt和go-qt绑定相比的,当前这种方式,编译过程时需要实时编译很多的C++代码,并且链接Qt5的库,所以特别慢,并且占用内存多,完全把go的编译速度优势丢失了。

这种新的方式,是使用libffi直接加载.so,而不是链接的方式编译,所以go binding编译时的速度会加快。在最近的实现版本中,qt5 for go binding的代码中已经完全不包含C/C++代码,不需要在.go文件引入cgo,编译过程达到原生go的速度。

基本测试,编译therecipe/qt的基本包,需要30分钟以上,最大使用内存达到3G。而编译该绑定的go库,只需要不到10分钟,内存占用最大1G。两者皆是原来的1/3,效果明显。特别是在使用go绑定做实际开发过程中,节省的编译时间也大大减少。同时最终编译得到的文件大小同样也会小很多。

msvc2017编译Qt5.7.1(支持Windows XP) (mingw-x64 gcc-6.3/7.1 qt5.7.1)

msvc2017编译Qt5.7.1(支持Windows XP) (mingw-x64 gcc-6.3/7.1 qt5.7.1)

最近做了点Qt + Windows程序,对最近的Qt情况的一点总结。

Qt也不准备继续支持Windows XP了,Qt5.7.0是官方公开支持的最后一个版本,包括Qt5.7.1都不行。

这里我标题说的没错,本文指的确实是Qt5.7.1,由于同为Qt5.7.x系统,源代码树变动不大,做了个小的调整,能够像Qt5.7.0一样支持Windows XP。

新版本兼容Windows XP宏定义

从vs2012 update4开始,发布了支持Windows XP的解决方案,

vs安装包的名字为:对 C++ 的 Windows XP 支持

msvc2017, USING_V141_SDK71

msvc2015, USING_V140_SDK71,

msvc2013, USING_V120_SDK71,

msvc2012, USING_V110_SDK71,

qt.rust绑定中的signal/slot实现

qt.rust绑定中的signal/slot实现

中继层次

中继实例的回收,可以使用QObject parent方式回收,或者,手动管理回收。

有没有可能使用QSignalMapper来管理呢

回调层次

signal连接层次

C++11信号连接

传统Qt信号连接

信号连接到一个函数或者闭包,或者另一实例的slot。

连接到另一个实例的语法难以实现,要写成闭包,而闭包则无法释放空间的问题。因为rust无法表达方法变量。

关闭信号连接

Qt支持关闭某个实例的所有连接,支持关闭某个实例的某个信号的所有连接。

支持关闭某个实例连接到另一实例slot的连接。

控制粒度还是非常细的,功能非常完整的。

可能QObject的findChildren有用,遍历object的层次关系。

Category:

rust实现继承

rust实现继承

目前找到两种方式 ,一种使用AsRef trait,一种使用Deref trait,都能实现单继承,而AsRef则能实现类似多继承的功能。

第一种,显式的.as_ref()

AsRef这是rust提供的一个trait,用来做类型的转换,例如,

impl AsRef for NButton { fn as_ref(&self) -> &NWidget { return &self.nbase; } }

其含义为,为NButton类型实现AsRef trait,可以把NButton类型引用转换为NWidget引用。

前提是NButton引用能在某处存放着一个nbase,如self.nbase。

有了这个trait实现之后,可以简单的方式实现类型转换了,

 btn.as_ref().callsth();

这个在使用上稍微有点不方便,需要显式地调用as_ref()方法。

多继承:

用rust语言实现C++的方法重载,overload

用rust语言实现C++的方法重载,overload

C++的重载方法,指的是方法名字相同,参数不同的一功能相似的方法。

一种重载是参数类型或者个数不同,但是返回值类型相同。 一种重载是参数类型或者个数不同,而且返回值类型也不同。

由于在rust语言中表达这两种方式有差别,所以区分开描述。

第一种情况,

假设C++类有如下方法,

class QString;

QString & QString::append(const QString & str); QString & QString::append(QChar ch);

这种代码在C++毫无违和感,语言级就支持,还比较好。

那么在rust实现同名的方法,显然不行的。

struct QString{};

在PyQt5中使用Qt DBus的延时响应返回

在PyQt5中使用Qt DBus的延时响应返回

### dbus介绍
dbus是一种现代linux系统中的本机RPC调用实现,实现了程序间的松耦合依赖。

### RPC调用
RPC调用可分为同步调用和异步调用。
常用的同步调用很容易理解,就是调用并一直等待RPC服务器端的返回值。
异步调用,是针对某次耗时的RPC调用而言,像文件操作,或者是网络操作,或者计算操作。
如果再一直等待服务器端的返回,客户端的效率将非常低下。

### 原始DBus的方式
dbus是使用了异步IO回调方式,所以并不存在所谓的延时响应返回问题。
因为所有的调用都可以看作是异步的,延时的。
不过dbus提供了一个超时机制,如果超时,则dbus调用端不再接收响应返回值了。

### Qt DBus的方式
在Qt中,把DBus的服务,调用响应封装成为Qt的QObject和slots,从而简化DBus的使用。
同时,默认情况下,Qt还把对应slots的返回作为DBus调用结束的标志。
这样就引入一个问题,如果在这个slots中无法立即完成一个dbus调用,应该怎么处理?

115syncd项目介绍

115网盘是个比较好用的网盘,提供比较大的磁盘容量。

该115syncd项目主要提供以下功能,
自动模拟登陆115网盘api。
以服务模式运行。
指定本地目录以及对应的115网盘目录。
监控指定目录,如有目录或者文件发生变化,则自动上传到115网盘对应的目录。
指定目录对可配置多个。
本地目录与网盘目录能够保持一到,在缺少目录时自动创建。
支持任务队列式并发上传控制,默认3个并发上传。
文件上传采用POST协议方式,有上传文件大小限制。
能够自动过滤掉一些指定的临时文件。
能够实现仅上传模式功能,即本地删除而网盘不删除,这样保持本地空间远小于网盘空间。
反复修改重复上传的文件,根据哈希去重,只保留最近一次上传的文件。

该实现使用PyQt5,在linux系统上安装使用都非常简便。
项目地址:https://github.com/kitech/115syncd

Qt5的ruby语言绑定实现系列:JIT ExecuteEngine与IR Module重用优化

# JIT ExecuteEngine与IR Module重用优化

在项目的原型阶段,为了代码的简洁与直接,很多地方都使用了新实例实现相关功能。
包括JIT ExecuteEngine和IR Module两个大模块。

这种方式由于大量使用了new操作,会浪费大量的内存与CPU资源。
本次改进的目的也是针对这两方面的,以提高现阶段该项目的可用性。

本文从优化的整体架构说明,到每个分模块一一介绍,到最后简单的测试,
希望能够对本次优化做到清晰说明。

###

概要

为什么提高效率,优化内存使用,可行的方式就是资源的重用。

经过项目原型实现的分析,基本整理出来两个关系性比较强,可以重用的模块:
第一个是自动生成的IR代码的重用。
第二个是JIT执行引擎的重用。

以下所有的改进都是围绕这两个部分进行的。

###

Category:

实现Qt的go语言绑定的两种方式

# 实现Qt的go语言绑定的两种方式

Qt是一个成熟优秀的C++ GUI开发库,

###

第一种方式

自动生成完整的cgo代码的方式。

基本原理,
使用一工具扫描使用了qt的go源代码,根据调用特征,生成完整的cgo封装代码。
生成的代码放在项目的目录树中,编译整个项目即可。

这种方式比较直接,编译出来的程序使用cgo的C包直接调用qt类和方法。
这中间完全没有动态处理过程,编译出来的最终程序效率还会比较好。
一个坏处生成的代码量还是比较大的,生成的代码也比较复杂,好在一个项目中可能用到的qt类和方法数量有限,应该可行。
另一个是由于注入了cgo,需要执行C++编译过程,速度比较慢,有点与go追求的极速编译冲突了。

###

第二种方式

使用JIT在类虚拟机ruby-jit-qt后端上即时执行方式。

基本原理,
使用一工具扫描使用了qt的go源代码,根据调用特征,生成调用JIT后端的cgo封装代码。
生成的代码放在项目的目录树中,编译整个项目即可。

Category:

Qt库的ruby语言绑定的探索与实现过程笔记

# Qt库的ruby语言绑定的探索与实现过程笔记

一直一来我经常使用Qt做一些简单的linux桌面工具软件,也算是对Qt库比较熟悉了。
而真正开始搞Qt库的ruby语言的绑定,出于当时觉得ruby是个比较有意思的编程语言,并开始接触学习ruby语言。
虽然在ruby最热门的时期作为web快速开发框架面世的,实现上我认为ruby也是一种非常不错的系统脚本语言。

在不断深入的学习ruby语言的过程中,越来越希望所有的开发工作都使用ruby语言实现,
并且这不只是希望,也尽可能的使用ruby完成一些开发工作。

不过,在这时,遇到一个需要更复杂的项目,希望能为这项目开发GUI界面功能。
经过一番网上搜索,也发现其实已经有qt的ruby语言绑定相关库了,
像kde项目中的rubyqt,还有qtbindings这个gem包,这两个包也比较成熟稳定了。
在试用的过程中了解到这两个包其实是同源的,并且都只支持Qt4版本。

Category:

页面

订阅 RSS - Qt5


Main menu 2

by Dr. Radut