在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的入门学习(转)的更多相关文章

  1. 第15.41节、PyQt(Python+Qt)入门学习:输入部件QComboBox组合框功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 Designer中输入工具部件中的Combo Box组合框与 ...

  2. 第15.38节 PyQt(Python+Qt)入门学习:containers容器类部件QDockWidget停靠窗功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...

  3. 第15.37节 PyQt(Python+Qt)入门学习:containers容器类部件QMdiArea多文档界面部件详解及编程开发案例

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 老猿在前期学习PyQt相关知识时,对每个组件的属性及方法都研 ...

  4. 第15.36节 PyQt(Python+Qt)入门学习:containers容器类部件QFrame框架部件介绍

    一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有如下: 容器中的Frame为一个矩形的框架对象,对应类QFrame,QFrame类是PyQt中带框架 ...

  5. 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...

  6. 第15.18节 PyQt(Python+Qt)入门学习:Model/View架构中视图Item Views父类详解

    老猿Python博文目录 老猿Python博客地址 一.概述 在PyQt图形界面中,支持采用Model/View架构实现数据和界面逻辑分离,其中Model用于处理数据存储,View用于界面数据展现,当 ...

  7. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  8. 第15.33节 PyQt(Python+Qt)入门学习:containers容器类部件QTabWidget选项窗部件简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  9. 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

随机推荐

  1. Redhat Linux5.4/5.5/5.8/6.0/6.3 ISO镜像文件下载

    版本有RedHat Enterprise Linux(RHEL)5.4/5.5/5.8/6.0/6.3 ISO镜像文件下载地址: RHEL 5.4 ISO下载http://rhel.ieesee.ne ...

  2. (75)Wangdao.com第十三天_JavaScript 包装对象

    包装对象 所谓“包装对象”,就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象 这三个原生对象可以把原始类型的值变成(包装成)对象 var v1 = new ...

  3. Wireshark简单使用教程2——附视频

    视频链接https://www.bilibili.com/video/av35336089/ 目录 对抓取的流量包进行简单的说明 Wireshark的捕获过滤器和显示过滤器 内容 1.对抓取的流量包进 ...

  4. ubuntu16.04中supervisor安装与简单使用(转载)

    ubuntu16.04中supervisor安装与简单使用 supervisor 进程管理是可以让进程在后台运行,而不占用控制台影响使用 1. 安装 supervisor sudo apt insta ...

  5. python dgango简介 安装 多表查询

    一.socket服务器 import socket sk=socket.socket() sk.bind(("127.0.0.1",8890)) sk.listen() while ...

  6. ThinkPHP5 添加多个文字水印及疑难解答

    public function imageload() { $imgpath = ROOT_PATH . 'public' . DS . 'static' . DS . 'www' . DS . 'i ...

  7. 华大单片机开发板HC32L13X上手入门

    HC32L136开发板(如下图所示)分为板载调试模块(左半部分)和MCU开发电路(右半部分).二者中间通过邮票孔相连,如果将板子从中间掰开,板载调试模块就可以当一个CMSIS-DAP的仿真器来使用.此 ...

  8. odoo 响应下载文件

    odoo中如何实现点击按钮下载文件报告.报表到页面左下角 models.py # -*- coding: utf-8 -*-from openerp import models, fields, ap ...

  9. Android Studio开发快速创建MVP框架插件AndroidMVP

    转载:https://www.jianshu.com/p/60cd98bbc358 Android开发中,我们为了代码的解耦以及后期的维护方便,都会采用一些开发框架,常用的有MVC.MVP.MVVM. ...

  10. Linux shell编程:状态变量

    四大特殊状态变量:$?. $$. $!. $_ $?的作用是:获取执行上一个指令的执行状态返回值,返回0表示上一个命令或者程序执行成功,返回的值为非0则表示上一个命令执行失败. $$的作用是:获取当前 ...