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编码,能省去很多麻烦
分享到:
相关推荐
Div+CSS布局入门教程,适合初学者,方便设计好的网页...
Python编程:从入门到实践的相关学校资料
[Packt Publishing] KnockoutJS 入门教程 (英文版) [Packt Publishing] KnockoutJS Starter (E-Book) ☆ 出版信息:☆ [作者信息] Eric M. Barnard [出版机构] Packt Publishing [出版日期] 2012年11月23日 ...
python教程答案第三章_python从⼊门到实践课后习题第三章 """ 3-1 姓名: 将⼀些朋友的姓名存储在⼀个列表中,并将其命名为 names 。 依次访问该列表中的每个元素,从⽽将每个朋友的姓名都打印出来。 """ names = ['...
1.此内容是Java 基础教程 pdf 版本,适合你在电脑、手机上查看 2.里面内容很清晰、全面 3.把资源共享给你,很适合想学java入门的同学
如果云计算对企业来说变得越来越重要,那么... Eric Johnson 所说的那样,Sun 已经清楚展现了一 个真实的云计算环境。 第一章 数据库基础 第二章 Oracle 入门 第三章 查询基础 第四章 单行函数 第五章 分组函数 ......
本文主要是使用C++环境调用模型权重文件而需要的开发环境搭建,
Spring入门书籍.pdf 博文链接:https://eric2007.iteye.com/blog/202759
本书不是Scala的入门级教程,而是适合有经验的Scala程序员向专家水平进阶的参考读物。本书适合想要了解Scala语言的底层机制和技术细节的读者阅读参考。 专业书评 “权威并且易于理解”。——Martin Odersky Scala之...
作者:Rich Goluszka,Bryan Gabe,Juan Moncada 上次更新时间:4/9/2021 项目:React的马赛克课程:Eric Pogue教授与应用程序设计语言(CPSC360-1) 独创性 这个项目中几乎所有的代码都是我们自己的,但是其他人写...
Brett 即将出版的新书 Head Rush Ajax ,和畅销书作者 Eric 与 Beth Freeman 一起为 Ajax 带来了获奖的革命性 Head First 方法。最近的著作 Java 1.5 Tiger: A Developer's Notebook 是关于 Java 技术最新版本的第一...
特别是,此程序包实现了本文中描述的方法: 学习具有递归结构的可扩展深核Maruan Al-Shedivat,Andrew Gordon Wilson,Yunus Saatchi,Huzhiting Hu,Eric P.Xing ,2017。入门KGP允许使用功能性API以与Keras相同的...