关于eric4和pyqt的入门学习(转)
在Eric4下用PyQt4编写Python的图形界面程序
转载请注明作者RunningOn
本文是PyQt4的入门教程。网上能搜到其它教程,但我觉得讲得不是很清楚,希望这篇文章对入门者更加有帮助。
先介绍一下PyQt4。Qt4图形库一经发布就好评不断,它在Python下的绑定PyQt4更是让我眼前一亮,不但漂亮,而且开发程序非常方便。
在我看来,PyQt4最大的改进之一是它不再拘泥与各种布局控件了,也就是说,现在写图形界面程序,和VB一样可以直接拖控件到窗口上并随便改变大小和位置了,不再像以前那样要先放上布局控件,再在布局控件里放其它控件。
对PyQt4的介绍就限于此,我也不准备把它与其它Python图形库进行比较了,因为经验表明这些东西的比较,特别是Qt与Gtk的比较总是会引起不必要的争吵。
IDE我使用Eric4。Eric4本身是用PyQt4写的,在使用Eric4时就能体会到用PyQt4能写出多棒的图形界面程序。Eric4的详细介绍与安装请见我的其它文章。
操作系统是Windows,在Linux下的操作完全一样。
寒喧结束,进入正题。假设我们要用Python写一个图形界面程序,一个对话框,里面两个button一个label。点击其中一个button能改变label的内容,点击另一个button就退出。
1. 新建工程。
打开Eric4,选择菜单Project->New新建一个工程,名字我们取为HelloPyQt,填好各项并选择工程所在文件夹之后点OK,一个新的不含任何文件的工程就建好了。
2. 新建对话框。
在左侧的ProjectViewer中切换到Forms选项卡(左数第二个),右键点空白位置,选New Form,在弹出的对话框中选择Form类型为Dialog,然后会问你保存到哪。我设定为保存为DlgHello.ui文件。点OK之后就会新建这个文件并自动打开QtDesigner。
3. 设计界面。
先修改主对话框的属性。选中对话框,在右侧的属性编辑器中就可以查看/修改对话框的属性。将windowTitle改为"Hello, PyQt",将objectName改为"DlgHello”,前者是对话框标题,后者在以后生成代码时有用,不建议使用默认值。
我们拖动一个Label(在DisplayWidgets分类中)到对话框中,将属性text改为"Hello, PyQt",objectName改为lblHello。
再拖动两个PushButton(在Buttons分类中)到对话框,分别将属性text改为"你好"和"退出"。将属性objectName分别改为btnHello和btnExit。
界面大概是这个样子:

4. 处理事件。
在PyQt4下,事件处理方面的术语为“信号”和“槽”,即signal和slot。事件对应信号signal,而事件的处理函数则为slot槽。
PyQt4有一些预定义的slot,我们可以直接用,比如“退出”按钮的slot,其实就是关闭对话框,这个slot已经在PyQt4中有定义了。对于这样的slot,我们不用单独写代码,在QtDesigner中就可以完成。而对于“你好”按钮,我们需要自己写代码。对于这样的slot,我们在QtDesigner中不做任何处理,甚至不做定义。
那么在这个例子中,在QtDesigner里我们只处理退出按钮的单击事件。
单击“编辑信号/槽”按钮进入信号/槽编辑模式。点中退出按钮并拖动,会出现一个像是电路图中的接地图示一样的东西,如下:

松开鼠标,就会弹出“配置连接”对话框。勾上“显示从QWidget继承的信号和槽”,左侧选择clicked(),右侧选择close(),点确定,就OK了。
如果要继续调整对话框外观,点击“编辑窗口部件”按钮返回窗口编辑模式。
5. 生成界面代码
保存之后关闭QtDesigner,会发现Eric4的ProjectViewer的Forms选项卡中已经多出DlgHello.ui了。右击它选择Compile Form,就能生成Ui_DlgHello.py文件,并自动加入到工程中。在Sources选项卡中可以看到。
双击Ui_DlgHello.py可以看它的内容,其实是生成了一个Ui_DlgHello类。Ui_DlgHello.py是可以单独运行的,在Eric4中直接按F2可以运行,看看初步的效果。发现单击退出按钮果然能直接退出程序。
不建议手动修改Ui_DlgHello.py,因为每次改动界面并生成代码后会将手动进行的修改给覆盖掉。
6. 添加额外的代码。
“你好”按钮的单击处理代码还需要手写。
在PyQt4中,界面代码与事件代码是分开的,这一点很赞,这样每次改界面就不会影响到事件处理的代码了。而wxPython这一点就做得不好。
事件处理要新建一个类并继承DlgHello类,然后在这个新类里写事件处理函数。新建类的工作可以交给Eric4来完成。右键点DlgHello.ui,选择Generate Dialog Code,在弹出的对话框中设定ClassName为DlgHello,同时,在这个对话框中可以选择我们感兴趣的事件,Eric4会一并生成事件处理函数的定义。如下图:

点确定之后,DlgHello.py就生成了。打开这个文件,“你好”按钮的事件被定义为:
@pyqtSignature("")
def on_btnHello_clicked(self):
"""
Slot documentation goes here.
"""
# TODO: not implemented yet
raise NotImplementedError
注意这个@pyqtSignature("")自动处理了下面定义的槽slot(事件处理函数)与相对应的信号signal(事件)之间的关联,这里是指,单击btnHello按钮,就会自动执行这个函数。slot的命名规则就是”on_对像名_信号名”,如果想添加新的slot,按这个规则来添加函数就行,并且在函数定义语句之前加上@pyqtSignature(""),不用再重新生成一次DlgHello.py文件。
其实另外一种关联signal与slot之间的方法是在运行里绑定,比如按钮对象btnAbout的clicked信号的槽是about_clicked函数,那么在__init__函数中加入这样一句话:
PyQt4.QtCore.QObject.connect(self.btnAbout, PyQt4.QtCore.SIGNAL("clicked()"), self.about_clicked)
那么单击按钮btnAbout时就会执行about_clicked函数。
两种方法各有长处。第一种方法简单,第二种方法对于多个signal使用同一个slot时很有效。
将on_btnHello_clicked函数改为:
@pyqtSignature("")
def on_btnHello_clicked(self):
self.lblHello.setText("你好,PyQt4")
在文件头部加上:
import PyQt4, PyQt4.QtGui, sys
再在代码最后加上(与Ui_DlgHello.py末的几乎一样):
if __name__ == "__main__":
app = PyQt4.QtGui.QApplication(sys.argv)
dlg = DlgHello()
dlg.show()
sys.exit(app.exec_())
这样就OK了。
7. 最后的收尾工作。
按F2运行脚本,发现点击“你好”按钮后lblHello label中的文字是乱码。
解决办法很简单,把代码中的("你好,PyQt4")改为(u"你好,PyQt4")就行了。PyQt4对中文的支持是很好的。代码统一使用utf8编码,能省去很多麻烦。
关于eric4和pyqt的入门学习(转)的更多相关文章
- 第15.41节、PyQt(Python+Qt)入门学习:输入部件QComboBox组合框功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 Designer中输入工具部件中的Combo Box组合框与 ...
- 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...
- 第15.37节 PyQt(Python+Qt)入门学习:containers容器类部件QMdiArea多文档界面部件详解及编程开发案例
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研 ...
- 第15.36节 PyQt(Python+Qt)入门学习:containers容器类部件QFrame框架部件介绍
一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有如下: 容器中的Frame为一个矩形的框架对象,对应类QFrame,QFrame类是PyQt中带框架 ...
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- 第15.18节 PyQt(Python+Qt)入门学习:Model/View架构中视图Item Views父类详解
老猿Python博文目录 老猿Python博客地址 一.概述 在PyQt图形界面中,支持采用Model/View架构实现数据和界面逻辑分离,其中Model用于处理数据存储,View用于界面数据展现,当 ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- 第15.33节 PyQt(Python+Qt)入门学习:containers容器类部件QTabWidget选项窗部件简介
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
- 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...
随机推荐
- (98)Wangdao.com_第三十天_拖拉事件
拖拉事件 拖拉 drag ,是指用户在某个对象上按下鼠标键不放,拖动它到另一个位置,然后释放鼠标键,将该对象放在那里. 一旦某个元素节点的 draggable 属性设为true,就无法再用鼠标选中该节 ...
- Java课程课后作业190309之连续最大子数组
老师在课堂是提出了这个问题,并且提出了时间复杂度是O(n)的要求,一开始我自己思想简单,在逻辑上出现了十分粗心的错误,后来同学们也在课堂上比较激烈地讨论了一番,也只是将时间复杂度降到了O(n*n),在 ...
- Educational Codeforces Round 6
620A - Professor GukiZ's Robot 20171122 \(ans=max(\left | x2-x1 \right |,\left | y2-y1 \right |)\ ...
- codecademy课程笔记——JavaScript Promise
Promise是一种表示异步操作最终的结果的对象,一个Promise对象有三种状态 Pending: 初始状态 ,操作还未完成 Fullfilled:操作成功完成,且这个promise现在有一个r ...
- raycast 一小段距离碰撞到的poly
dtNavMeshQuery::raycast(dtPolyRef startRef, const float* startPos, const float* endPos, const dtQuer ...
- mysql - Truncated incorrect DOUBLE value: 'undefined'
mysql - Truncated incorrect DOUBLE value: 'undefined' 我是怎么遇到这个问题的? 我要从多个表里,查询统计数据,保存到统计表里,需要执行下面这种结构 ...
- 跨界!Omi 发布多端统一框架 Omip 打通小程序与 Web 腾讯开源 2月28日
https://mp.weixin.qq.com/s/z5qm-2bHk_BCJAwaodrMIg 跨界!Omi 发布多端统一框架 Omip 打通小程序与 Web 腾讯开源 2月28日
- WinForm控件Dock属性设置会遮盖其他控件的解决
在被遮盖住的控件上,右击弹出快捷菜单,然后选择“置于顶层”.
- Linux使用pam_tally2.so模块限制登录失败锁定时间
关于PAM Linux-PAM (Pluggable Authentication Modules for Linux)可插拔认证模块. https://www.cnblogs.com/klb561/ ...
- Web Application Security(Web应用安全)
Web Application Security 1.web应用面临的主要安全问题 1)黑客入侵:撞库拖库.网页篡改.后门木马.加密勒索.数据泄露 2)恶意内容 2.web应用安全现状 1)网站安全问 ...