Qt/PyQt 概谈

其实,PyQt的实际使用经验,我大概也就三个月。而Qt,最多也就一个月吧。所以这篇文章并不是想说Qt的编程和PyQt的编程。而是想说说我这一个多礼拜的编译经验和这两者的关系而已。(只涉及技术思路,不涉及具体技术。具体技术网上一大堆。)

Qt,最大的好处是可移植。Python,最大的好处是编程更加敏捷,且也是可移植的。那PyQt,其实就是Qt的一个Python wrapper。现在好多C/C++的动态库都有Python的wapper。比如我常常使用的OpenCV啦,还有同事经常使用的OpenGL啦,OpenCL啦。所以目前,用C++进行底层的实现,而提供Python的接口,是比较流行的做法。女儿前段时间很喜欢看《海底小纵队》,我也跟着看了几集。里面有一个叫巴克的北极熊和一个叫呱唧的猫。他俩经常一起出去执行任务,因为组合了北极熊的力量和猫的敏捷,他俩总是能出色地完成各种考验。现在想想,如果把C++比喻成北极熊,而把Python比喻成猫,也是十分合适的。

说回Qt/PyQt的编译。现在常用的Qt版本有Qt4和Qt5两种。目前来说还是支持Qt4的开源库多一些。而Qt4相较于Qt5,我暂时还没有感受到明显的弱项。所以我电脑上的环境目前是Qt4的最高版本-4.8.11。如果是安装Qt,在Ubuntu上可以直接用sudo apt install来安装Qt的开发库。在Windows上有相应的安装程序来安装。那PyQt呢,得看你用什么python版本。有的python版本,用pip就可以直接安装,而又的python版本,就是无法直接安装。而好死不死,由于某种原因,我必须使用的python版本,用pip就是无法安装PyQt4。这个时候就要通过源码来编译。

riverbankcomputing的网站,上面有下PyQt4,PyQt5以及SIP的源码。SIP,是编译PyQt所必须使用的编译工具。所以编译PyQt的顺序是这样:

  1. 安装好Qt。
  2. 保证qmake在Windows的控制台或Ubuntu的终端上是可用的。
  3. 下载SIP源码包,安装SIP。
  4. 下载PyQt源码包,安装。

这里比较好玩的地方在于,看看Qt到PyQt到底是怎么做的。PyQt的源码包中没有Qt的任何原文件,只有一些sip定义的文件,还有其它的一些工具软件。也就是说,PyQt的具体实现,真的就是在Qt中。另外,在整个编译过程中,并不需要对Qt本身进行修改。那SIP的做法很好啊~后来,我看了一下SIP的文档。在Introduction中,是这么说的:

SIP是一个工具,能对C/C++库自动生成Python-bindings。SIP最初是在1998年被开发出来用于PyQt——the Python bindings for the Qt GUI toolkit,但是它也同样适用于C/C++库。
本版SIP生成的绑定适用于Python2.3及以后版本,包括Python3。
还有许多跟SIP功能类似的工具。其中一个就是SWIG,事实上SIP之所以被叫做SIP是起初就是一个小的SWIG。与SWIG不同的是,SIP是专门设计用于将Python和C/C++集成在一起,并不遗余力地使集成更加紧密。

其特点如下(不全,摘录):

  • 绑定能够被快速加载,并且最大限度地减少了内存消耗,特别是在仅使用大型库的小型子集时
  • 标准Python和C/C++数据类型之间的自动转换
  • 用不同的参数签名重载函数和方法
  • 支持Python的关键字参数语法
  • 支持明确指定的和自动生成的文档注释
  • 能够访问C++类的protected方法
  • 能够定义一个Python类,它是C++类的一个子类,包括抽象的C++类
  • Python子类可以实现__dtor __()方法,该方法将从C++类的虚拟析构函数中调用
  • 支持普通的C++函数,类方法,静态类方法,虚拟类方法和抽象类方法
  • 能够在Python中重新实现C++的虚拟方法和抽象方法
  • 支持全局变量和类变量
  • 支持全局操作符和类操作符
  • 支持C++命名空间
  • 支持C++模版
  • 支持C++异常并以Python异常的方式捕获它们
  • 支持弃用警告
  • 能够定义C++类与相似的Python数据类型之间的映射,并且是被自动调用的
  • 能够自动利用任何可用的运行时类型信息来确保Python实例对象的类匹配相应C ++实例的类
  • 能够改变Python对象的类型及元类型,用来包装C/C++的数据类型
  • 全面支持Python全局解释器锁定,能够让指定的C++函数阻塞,允许释放锁定从而运行其他Python线程
  • 支持C++实例所有权的概念(例如,代码的哪一部分负责调用实例的析构函数)以及在应用执行期间所有权可能如何改变
  • 能够生成一个C++类库的绑定,这个C++类库是在另外一个已经生成了绑定的C++类库的基础上建立的,因此不同的绑定能够集成和并正确地共享代码
  • 有一个复杂的版本控制系统,从而允许在一组简单的规范文件中描述C++类库的完整生命周期,包括任何平台特有的或者可选的特征。
  • SIP 可以在 UNIX, Linux, Windows, MacOS/X, Android and iOS下使用。

另外,看了一下Using SIP的文档。其中比较复杂的那个例子,说明了如何使用Qt来编写一个控件,然后把它放到PyQt的工程中。这么做是非常有意义的。因为:

  1. 如果控件本身的逻辑比较复杂,用Python实现比较慢,那就可以用C++来实现,只在PyQt中调用即可。
  2. 万一看到别人用C++的Qt实现了一个自己想用的控件,可以在几乎不改人家的源代码的情况下,拿过来嵌入到自己的PyQt项目中。(不过有一个前提,人家用Qt4,你就得用PyQt4,人家用Qt5,你就得用PyQt5)

注:官网提供了Qt4到PyQt4的例程,github上有一个Qt5到PyQt5的例程。在Google搜索Qt5ToPyQt5即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • Qt是属于一个跨平台的GUI开发软件,支持的平台有Unix、Linux、Windows/WinCE、IOS等。 Q...
    一叶之界阅读 8,016评论 0 17
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,859评论 1 3
  • 英文原版:https://github.com/vinta/awesome-python中文版:https://g...
    会灰的大飞狼阅读 3,559评论 1 56
  • 前言 关于Qt的学习道路需要不断日积月累,下面有一些学习资料提供给大家:Qt官网、编码风格、GitHub & Th...
    YBshone阅读 5,624评论 3 95
  • “我喜欢你。”“……又和谁玩大冒险啦”“[图片]怪我咯?[捂脸]”“不是说三声的嘛……太没有诚意了!”“……你个…...
    姐夫点菜阅读 236评论 1 3