引言
找了很多Python GUI工具集,还是觉得PyQt比较理想,功能强大跨平台,还支持界面设计器。花一天时间折腾了Ubuntu14.04(32位)+ Python3.4 + Qt5.3.2 + PyQt5.3.2 + Eric6.0 的完整开发平台的搭建,各种出错差点放弃了,好在终于一一解决了,记录下来以后搭建起来方便点。
安装Python3.4
Ubuntu14.04貌似默认安装了Python2.7 和Python3.4。故Python3.4的安装可略去。
安装Qt5
Ubuntu14.04自带Qt4的部分库文件,但是我们的平台要求Qt5,所以首先安装Qt5.
Qt5.3.2下载:http://qt-project.org/downloads
安装过程:
下载到的是Qt5的在线安装程序,为其赋予可执行权限即可单击启动。由于我之前文件都安装在/opt目录下,故这里以root身份安装:
sudo chmod a+x qt-opensource-linux-x86-1.6.0-5-online.run
sudo ./qt-opensource-linux-x86-1.6.0-5-online.run
启动界面后默认安装即可。
配置过程:
安装完成后配置一下PATH,在当前用户主目录下的.bashrc (or .zshrc)文件中加入:
export QTDIR=/opt/Qt/5.3/gcc/
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${QTDIR}/lib
export PATH=${QTDIR}/bin:${PATH}
注意${QTDIR}/bin和${PATH}的顺序!因为Ubuntu14.04默认${PATH}路径中的/usr/bin下存在诸多qt命令(确切的说是指向qtchooser的软连接,qtchooser最终会选择系统自带的Qt4命令:但是这些命令默认都不存在),如果${QTDIR}/bin在${PATH}之后,会导致Qt命令失效。
特别是qmake命令,在后续安装中需要用到,保险起见,在终端输入qmake,如果显示qmake命令不存在,请通过创建软连接进行解决:
将/usr/bin下的qmake软连接到/opt/Qt/5.3/gcc/bin/qmake上,或者将/usr/lib/i386-linux-gnu/qt4/bin/qmake软连接到/opt/Qt/5.3/gcc/bin/qmake上:
sudo ln -s /opt/Qt/5.3/gcc/bin/qmake /usr/bin/qmake
or
sudo ln -s /opt/Qt/5.3/gcc/bin/qmake /usr/lib/i386-linux-gnu/qt4/bin/qmake
此时再输入qmake查看是否设置成功。
安装SIP
SIP是python调用C/C++库的必备模块。因此SIP是PyQt的依赖工具,安装PyQt之前必须先安装对应版本的SIP。PyQt编译时使用的SIP版本必须与python默认调用的SIP保持一致!否则python中是无法调用PyQt的。这里我们使用最新的SIP 4.16.3.
Ubuntu14.04中貌似是自带4.15版的SIP(or 自己安装python扩展是自动安装的)。终端输入:
sip -V
查看已安装SIP版本,如果存在其他版本,请查看python3的dist-packages目录下是否存在sip相关文件。如果存在将其删除:
sudo -rm /usr/lib/python3/dist-packages/sip*
然后正式安装SIP 4.16.3。
SIP 4.16.3下载:http://www.riverbankcomputing.com/software/sip/download
安装过程:
tar -zxvf sip-4.16.3.tar.gz
cd sip-4.16.3
python3 configure.py
sudo make
sudo make install
配置过程:
SIP无需配置,只是需要安装完成后注意核对一下版本:
分别在终端输入:
sip -V
在python3环境输入:
>>>import sip
>>>print(sip.SIP_VERSION_STR)
查看二者显示的版本是否一致。如不一致,需要重新执行上述删除过程和安装过程。版本不一致将意味着后面编译PyQt所使用的SIP和Python3调用的SIP的不一致,导致在Python3中调用PyQt的相关模块(from PyQt5 import QtCore)出现类似如下错误:
the sip module implements API v11.0 but the PyQt5.QtCore module requires API v11.1
安装PyQt5
PyQt是Python的一个跨平台图形开发工具集,是Python与Qt的成功融合。PyQt包含了大约440个类、超过6000个的函数和方法,灰常强大。需要注意的是,Eric(一种Python IDE,依赖PyQt)当前最新的稳定版Eric5只支持PyQt4(确切的说是PyQt4.8以上5.0以下),支持PyQt5的Eric版本现在仅为Eric6.0 snapshot版,该版本包含最新的Eric5的所有功能,但稳定性需要测试。如果你希望使用稳定的Eric5,请在此步骤安装PyQt4的最新版PyQt4.11.2。这里我们安装PyQt5.3.2.
PyQt5.3.2下载:http://www.riverbankcomputing.com/software/pyqt/download5
安装过程:
tar -zxvf PyQt-gpl-5.3.2.tar.gz
cd PyQt-gpl-5.3.2
python3 configure.py
注意:此命令生成各种Qt模块后,其中的QtWebKitWidgets模块由于Qt4和Qt5的qprinter.h所属模块的调整(Qt4存在于QtGui中,Qt5将其调整到QtPrintSupport中了),QtWebKitWidgets的Makefile中缺失了对QtPrintSupport的头文件目录引用,会导致后面编译PyQt5时无法找到qprinter.h头文件,编译失败(编译过程非常漫长):
qprinter.h: No such file or directory
所以需要向刚生成的QtWebKitWidgets模块源文件的MakeFile文件的INCPATH中添加QtPrintSupport引用。
原INCPATH为:
INCPATH = -I/opt/Qt/5.3/gcc/mkspecs/linux-g++ -I. -I. -I/usr/include/python3.4m -I/opt/Qt/5.3/gcc/include -I/opt/Qt/5.3/gcc/include/QtWebKitWidgets -I/opt/Qt/5.3/gcc/include/QtWebKit -I/opt/Qt/5.3/gcc/include/QtWidgets -I/opt/Qt/5.3/gcc/include/QtNetwork -I/opt/Qt/5.3/gcc/include/QtGui -I/opt/Qt/5.3/gcc/include/QtCore -I.
修改为:
INCPATH = -I/opt/Qt/5.3/gcc/mkspecs/linux-g++ -I. -I. -I/usr/include/python3.4m -I/opt/Qt/5.3/gcc/include -I/opt/Qt/5.3/gcc/include/QtWebKitWidgets -I/opt/Qt/5.3/gcc/include/QtWebKit -I/opt/Qt/5.3/gcc/include/QtWidgets -I/opt/Qt/5.3/gcc/include/QtNetwork -I/opt/Qt/5.3/gcc/include/QtPrintSupport -I/opt/Qt/5.3/gcc/include/QtGui -I/opt/Qt/5.3/gcc/include/QtCore -I.
或者可以直接在QtWebKitWidgets模块源文件的QtWebKitWidgets.pro文件中加入:
QT += printsupport
也行。
接下来执行编译安装:
sudo make
sudo make install
配置过程:
安装完成后进入Python3环境验证是否安装成功:
>>>import PyQt5
如果提示不存在PyQt5模块,表示安装的PyQt5没有被python3正确识别。默认的安装路径为python的site-packages目录。通常python3的模块安装路径会分成2个,一个/usr/lib/python3,一个/usr/lib/python3.4,两个路径下的模块都能被python3环境正确调用,但是python3.4的site-packages目录下的模块貌似无法调用。PyQt5偏偏默认安装到此目录了。解决办法是为其创建软连接,保险起见,python3目录和python3.4目录分别创建一个:
sudo ln -s /usr/lib/python3.4/site-packages/PyQt5 /usr/lib/python3.4/PyQt5
sudo ln -s /usr/lib/python3.4/site-packages/PyQt5 /usr/lib/python3/dist-packages/PyQt5
可能不同的计算机上可识别的模块安装目录会存在差异,但是解决原理都差不多,在python3可识别模块的路径下创建PyQt5的软连接即可让Python3成功识别。
另外一个解决办法是在python3 configure.py 时就指定安装目录。如:
python3 configure.py --destdir /usr/lib/python3.4
安装QScintilla2
QScintilla2是连接编译器和Python的接口,因此是Eric的必需前置组件。QScintilla2 中需要单独安装3个模块:本体,Designer和python bingdings。
QScintilla2.8.4下载:http://www.riverbankcomputing.com/software/qscintilla/download
安装过程:
tar -xzvf QScintilla-gpl-2.8.4.tar.gz
cd QScintilla-gpl-2.8.4
A.安装本体:
cd Qt4Qt5
qmake qscintilla.pro
sudo make
make install
B.安装Designer:
cd ../designer-Qt4Qt5
qmake designer.pro
sudo make
sudo make install
C.安装Python bingdings:
cd ../Python以上步骤即可正确安装QScintilla2。需要注意的是Python bingdings安装时需要指定 --pyqt=PyQt5参数,否则默认是为PyQt4安装。或者直接修改其configure.py,将pyqt5_is_default = False改为pyqt5_is_default = True也可。
python3 configure.py --pyqt=PyQt5
sudo make
sudo make install
配置过程:
无需额外配置。
安装Eric6
Eric作为一款强大的开源Python IDE,支持Qt界面设计器的Eric在Python GUI开发中更是首屈一指,Python+PyQt+Eric已经成为一种标准的Python GUI开发平台。其中Eric4支持Python2.6+与PyQt4.6+组合,Eric5支持Python3.0+与PyQt4.8+组合,Eric6支持Python3.0+与PyQt5.0+组合。目前Eric5.4.7为最新稳定版。Eric6.0为snapshot版。上文已有介绍。具体搭配可参考:http://eric-ide.python-projects.org/eric-download.html。这里安装Eric6.0.
Eric6.0下载:http://sourceforge.net/projects/eric-ide/files/eric6/unstable/
下载其中的eric6-6.0-snapshot-20140720.tar.gz主文件和eric6-i18n-zh_CN.GB2312-6.0-snapshot-20140720.tar.gz中文语言包。
安装过程:
tar -zxvf eric6-6.0-snapshot-20140720.tar.gz
tar -zxvf eric6-i18n-zh_CN.GB2312-6.0-snapshot-20140720.tar.gz //语言包文件会自动解压到Eric6.0主文件解压目录中。没有的话手动复制。
cd eric6-6.0-snapshot-20140720
sudo python3 install.py //安装主程序
sudo python3 install-i18n.py //安装中文语言包
应该能够顺利安装完成。
需要注意,由于是以root身份安装(sudo),所以运行时需要执行:
sudo eric6
才不会导致Eric运行或者关闭时写入配置文件出错(sudo安装的Eric6的文件都是root所有,其他用户执行Eric6写入配置文件时权限不足)。为了保证直接执行:
eric6
时不致出错,可以将当前用户的eric6目录权限设置为可读写:
sudo chmod a+w -R ~/.eric6
sudo chmod a+w -R ~/.config/Eric6
或者安装时就直接
python3 install.py
python3 install-i18n.py
就无需sudo执行了。但是不推荐这样做。
配置过程:
终端输入eric6启动:
1、选择Settings -> preference -> Editor -> Autocompation。勾选所有选框;
2、选择Settings -> preference -> Editor -> QScintilla 。勾上左右的两个选框,然后在下面source中,选择from Document and API files;
3、选择Settings -> preference -> Editor -> APIs。勾选Complie APIs Autocompation,在Language中,选择python3。点面下面的Add from installed APIs按钮,选择住需要的.api文件。最后点击Compile APIs;
4、选择Settings -> preference -> Interface -> Interface。右侧Language根据喜好选择中文或者English。重启生效。
配置完成。
Demos
提供2个简单的Demo验证平台是否正确搭建。
A. 非Eric小程序:
#!/usr/bin/env python
from PyQt5.QtWidgets import (QApplication, QLabel)
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
label = QLabel("<center>Hello World with PyQt5!</center>")
label.resize(200, 50)
label.show()
sys.exit(app.exec_())
B. Eric小项目:
此部分转自:http://www.pythoner.com/89.html
1、新建项目。
点击【项目】-【新建】,弹出如下的对话框。创建一个名为demo2的项目。注意,在创建项目时,eric不会自动根据填写的项目名称修改项目文件夹名称!
点击确定之后,可以看到一个源代码树中只有__init__.py的项目。另外,eric还创建了几个文件,但是并不会在这里显示出来,他们分别是项目文件”pyqtdemo.e4p”和”_eric4project”文件夹。
2、新建窗体。
将左侧的【源代码】选项卡切换至【窗体】选项卡(左数第二个)。右键空白区域,选择【新建窗体】。在弹出的对话框中选择【对话框】。在弹出的文件对话框中,选择文件位置,并填写文件名称。这里,我们将其命名为demo2.ui。确定后,就可以看到【窗体】选项卡中,有一个demo2.ui文件了。
3、设计窗体。
右键点击“pyqtdemo.ui”文件,选择【在Qt设计师中打开】,就可以在Qt Designer中设计UI界面了。
从图中可以看到,Qt Designer分为如下几个部分:
- 菜单栏:包括文件、编辑、窗体、视图、设置、窗口和帮助。
- 工具栏:包括文件操作、部件前后置、编辑窗口部件、编辑信号/槽、编辑伙伴、编辑Tab顺序、布局方式、调整大小等。
- 部件栏:包括各种可用部件。
- 窗体设计区域
- 对象查看器:可以查看各部件对象关系树及其所属的类
- 属性编辑器
- 信号/槽编辑器
- 动作编辑器
- 资源编辑器
3.1、修改窗体属性
默认的窗体属性中,objectName(部件名称,其他程序引用时使用)默认为Dialog,windowTitle(窗体标题)默认也是Dialog。我们可以根据自己的需要,对对话框的各个属性进行修改。这里,我只修改了windowTitle为“PyQt Demo”,并改变了其大小。
3.2、添加部件
从左侧的widget box中拖出3个PushButton,1个label。修改它们的objectName、text等属性。其中3个PushButton的ObjectName分别为btn1、btn2、btnClose。
添加后的效果图,如下图所示:
4、信号与槽
4.1、概念
在PyQt5中,事件处理的相关术语为“信号(signal)”和“槽(slot)”。
信号的含义就是我们常说的事件,比如按钮被按下、复选框勾选状态变更、可输入文本框文本变更等等。
槽的含义则是事件处理函数,比如关闭窗体、隐藏窗体、最大/小化、设置焦点、重绘等。
4.2、使用一个自带的槽
我们从工具栏中,选择【编辑信号/槽】。
拖动要编辑的部件,会出现一个类似于电路中接地符号的标志,并弹出对话框。
这里,我们选择clicked(),即按钮被按下,此时看到右侧可选的槽并不多,并且没有我们希望使用到的关闭功能。
勾选【显示从QWidget继承的信号和槽】,这时可以发现,右侧的槽多了很多。在其中找到close(),点击确定。此时,点击【关闭】按钮执行对话框关闭的功能就已经实现了。
下图是已经创建了【关闭】按钮槽之后的窗体设计图。
4.3、第一次运行
虽然只实现了一个关闭功能,但是还是让我们先来看看如何运行这个到目前为止一行代码都没有写过的程序吧。
现在回到eric的界面,右键“demo2.ui”,选择【编译窗体】。
短暂的时间过后,可以看到编译成功提示。这时,我们切换到【源代码】选项卡,可以看到一个名为Ui_demo2.py的文件,这就是根据刚才那个ui文件自动编译而成的,我们不需要对其进行任何修改,也不应当对其进行任何修改,因为,任何对这种文件,在下次编译后,之前的修改会全部不存在。
看,下图,就是我们第一次运行时的场景。在eric里,我们可以F2直接运行,或F5进行调试。当按下【关闭】的时候,窗体就会被关闭。
4.4、创建自定义槽
使用自带槽的方式很简单,然而,它所能实现的功能也是有限的,在我们的开发中,绝大多数信号发生时,不会使用默认的槽。因此,这一小节将通过按钮1、2的实现来介绍如何创建一个自定义槽。
自定义槽,就要求自己写其中的槽函数,而之前的操作中,我们还没有动手写过一次代码,那么这个槽的代码写在哪里呢?
我们再切换回【窗体】选项卡,右键demo2.ui,选择【生成对话框代码】。
首先,点击【新建】,新建一个类,在这里可以修改类名、文件名和路径。
然后在下面的选框中,选择自己需要使用到的信号。比如,我的选择如下图所示,是两个按钮被按下时的信号:
这时,就生成了一个默认的代码。对这个代码进行修改,实现预期的内容。
5、完成
修改之后代码和运行界面如下: