怎么将可QT 移植无法运行的 Python 运行时抓取为镜像


PyQt是Python下的另一套图形界面接口库,顾名思义就是在Python中调用Qt图形库和组件。使用PyQt的优点在于可以使用Qt成熟的IDE(如Qt Creator)进行图形界面设计,并自动生成可执行的Python代码。


获取PyQt的文档和范例程序(非必须):





FTP客户端(网络编程)演示



下面我们通过一段代码演示PyQt的使用。新建Python文件,命名为hello_pyqt.py,代码内容如下:






从上面的例子可以看出手动编写代码调用PyQt依然十分不便,好在PyQt还为我们准备了Qt GUI界面的转换工具,可以将Qt Creator生成的.ui文件直接转换成Python代码。比如需要对test.ui进行转换,其命令如下:


其中-x参数相当于--execute,在代码中增加了一些测试语句,这样生成的Python文件就可以直接执行了。之后我们就可以在生成的代码基础上实现自己的功能。



在Python借用Qt强大的图形控件


这里我们将通过PyQt设计一个监控树莓派内核温度的小软件。首先打开QtCreator,新建一个Qt GUI应用程序工程(如何在树莓派2本地安装运行Qt Creator,请参见:编程篇(一)在树莓派2上本地开发Qt GUI程序)。设计如下图所示的窗口界面:



通过pyuic命令将GUI文件转换成Python文件,然后在此基础上进行修改,代码如下:








LCD控件用于显示CPU当前的温度。在显示界面和运行定时器之前,可以通过手动调用self.timerTemp_TimeOut()函数读取CPU温度来初始化LCD控件内容。


窗口下面的滚动条用于设置温度报警门限,如果CPU温度接近门限值,则会改变温度显示的颜色。如果超过门限值则弹出对话框报警。



这里我们还可以使用一个小程序将CPU占用率提高到100%来提升CPU温度,只要编写一段死循环的运算代码即可(一个Python进程只能在单个内核上运行,对于树莓派2,需要同时启动4个进程才能跑满全部内核)。代码内容如下:


版权声明:本文为博主原创文章,未经博主允许不得转载。 /a/article/details/

出现该问题的原因是环境变量没有添加。


由于支持跨平台,只提供源码下载,需自行编译。

这里以Linux(Ubuntu系)为例,介绍一下编译安装方法。

去Qt网站下载安装包,或者通过apt安装。安装完毕后,在命令行中执行qmake -v,查看输出信息,确认Qt已安装好。

将下载的源码解压。进入解压目录,之后执行编译指令。假设解压目录为PythonQt

编译可能需要花费几分钟,请耐心等待。
编译完成后,编译得到的库文件以及范例程序都在PythonQt/lib下。此时运行范例程序可能失败,需要先安装刚编译好的库。

所谓安装,是指让系统能够找到编译好的库文件。实现的方式有多种,这里介绍通过链接的方式安装。
首先确认系统中的库文件默认目录是什么。

安装完成。双击PythonQt/lib下的范例程序,如果可以运行,说明正常。

可以看范例源码和官方文档学习。这里以Linux(Ubuntu系)环境为例,简单介绍一下使用方法。

需要将一些配置文件和PythonQt库的头文件复制到项目文件夹下(可以新建一个子文件夹)。假设项目目录为[PRJ],PythonQt目录为[PYQ]。

其中.h是头文件,.prf是配置文件,.so是链接库。
头文件可以直接使用。配置文件需要修改,主要是修改相关目录。

说明:配置文件的注释方式是每行前加注释符号#以下是一种修改方式:common.prf 将以下三行删除或注释掉:

在项目.pro文件中加入以下内容:

这个可以参考PythonQt的范例,然后慢慢摸索。

在使用PythonQt时,首先要对PythonQt的单例对象进行操作。包括初始化,获取对象等。

为了能看到python程序中的打印信息,需要连接PythonQt单例对象信号,与你自己写的槽。

第一个信号是向std::out的输出,第二个信号是std::err的输出。
之后就可以操作mainModule的方法来调用python代码了。当然,如果python代码里不需要输出,也可以不连接上述信号。

四、执行Python语句或脚本

按照上一节的说明初始化后,就可以执行Python语句或调用Python脚本了。

如果要调用的python代码只有单一一行语句或者少量几语句,可以使用evalScript函数。该函数的参数是要执行的指令,返回执行结果。

其中"19*2+4"是python语句,第二个参数表示执行的是独立的python表达式。返回类型是QVariant,可以根据实际执行的语句,转换成具体的数据类型。比如这里可以用QVariant::toInt()转换成int,得到的结果分别是42和3。不熟悉的朋友请参考QVariant文档。
evalScript 可以用于定义函数,方便以后调用。例如:

这样就定义了一个Python中的函数,名为add,接受两个参数ab,返回两个数的和。
后面第三部分介绍如何调用Python函数。

如果需要使用Python实现较为复杂的功能,写在一个Python文件中比较方便。假设文件名为func.py。
Python文件的开头需要加入如下语句:

在Qt项目中新建资源文件(.qrc文件),在资源文件中添加func.py,以便调用。调用方式为:

调用时的文件路径与添加到资源文件时的前缀有关。注意evalFile没有返回类型,所以不能用于获得返回值,可以通过第四节所说的打印信息看到执行过程(如果Python程序中有输出语句的话)。如果是Qt GUI项目,也可以把执行结果显示在界面上,这一点在后面第四部分介绍。
执行过evalFile后,脚本中定义的函数可以在以后直接调用。所以可以把需要返回值的功能写在函数中,后续调用。调用方式见第三部分。

前面介绍了,使用evalScriptevalFile都能定义Python函数。定义的函数会保存,之后可以在代码的任意位置调用。要调用这些函数,可使用call。例如第一点介绍中定义了一个Python中的函数,名为add,接受两个参数ab,返回两个数的和。调用该函数的方法如下:

call 的第一个参数是要调用的函数名称,用字符串表示;第二个参数是要调用的Python函数的参数,用一个QVariantList存放所有参数。这里,我们把a和b两个数传入。返回类型是QVariant,需要转换成具体类型。这里的c转换成整数后是5。

第一次调用将标签文字改为Hello,第二次调用改为World。
在Python中操作QObject对象时,要注意,使用的方法、函数、属性等要用Python语法进行。例如在Qt(C++)中改变标签文字的方法是

而在Python中,应该使用

既然使用Python,可能是要使用Python中成熟的库,例如用于科学计算的NumPy。如果在Python程序中写入:

可能在使用PythonQt执行的时候报错,说找不到numpy模块。(当然是已安装的情况下,在Python或命令行中都运行正常。)这很可能是路径问题。

这样就可以正常导入NumPy模块了。

以上介绍了PythonQt库的安装和使用方法。
更加复杂的功能,请参考PythonQt源码中的范例,以及网站上的文档。
源码中也有很多有用信息,关于一些API函数的调用,可以参考头文件中的注释。例如,关于上面介绍的evalScript等函数,可以参考PythonQtObjectPtr.h文件(可用QtCreator内的切换功能快速定位)。

我要回帖

更多关于 QT 移植无法运行 的文章

 

随机推荐