首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PyQt中如何结合Qt设计师进行开发

PyQt中如何结合Qt设计师进行开发

作者头像
bear_fish
发布2018-09-20 14:42:13
7690
发布2018-09-20 14:42:13
举报

PyQt中如何结合Qt设计师进行开发

2013-03-08 PyQt4 Designer 3条评论

Qt设计师是Qt的所见即所得的界面设计工具,通过拖拉方式设计界面,但它并不能产生任何代码。

Qt设计师使用.ui后缀的XML文件来存储界面内容。通过pyuic4命令可以编译成.py文件,.py文件的内容就和我们手写界面的类似。

当然直接使用.ui文件也是可以的,但是有两个问题,一个是效率不高,需要在运行时做动态转换创建界面;二是不方便打包发布。这里只讲最佳实践,不讲这种方式,感兴趣的可以自己研究。我后面会写文章讲解。

下面通过一个例子,讲述如何创建界面,并编译,以及如何使用信号和槽。该例子上有一个QLabel和一个QPushButton。点击按钮,修改标签的文字为“Hello PyQt4”。

环境:

  • OS X 10.8.2
  • Python2.7.3
  • PyQt4.9.4

创建界面

打开Qt设计师,在templates/forms中选择Widget,点击【创建】。进入设计状态,从窗口部件盒中拖出两个Vertical Spacer、一个Label,一个Push Button。如图所示:

http://jimmykuu.qiniudn.com/blog/widget-designer-0.png
http://jimmykuu.qiniudn.com/blog/widget-designer-0.png

在空白处点击右键,选择垂直布局。

http://jimmykuu.qiniudn.com/blog/layout.png
http://jimmykuu.qiniudn.com/blog/layout.png

双击按钮修改文字为"Say Hello",选中对象在属性编辑器中修改属性:

  • Label的objectName为lHello
  • Push Button的objectName属性为pbHello。

完成后的界面如下:

http://jimmykuu.qiniudn.com/blog/widget-designer-1.png
http://jimmykuu.qiniudn.com/blog/widget-designer-1.png

打开widget.ui,你会发现是个XML文件。

http://jimmykuu.qiniudn.com/blog/ui-code.png
http://jimmykuu.qiniudn.com/blog/ui-code.png

转换界面文件为python代码

通过pyuic4命令转换代码,把widget.ui转换成ui_widget.py文件。

  1. $ pyuic4 -o ui_widget.py widget.ui

转换后代码如下:

  1. from PyQt4 import QtCore, QtGui
  2. try:
  3. _fromUtf8 = QtCore.QString.fromUtf8
  4. except AttributeError:
  5. _fromUtf8 = lambda s: s
  6. class Ui_Form(object):
  7. def setupUi(self, Form):
  8. Form.setObjectName(_fromUtf8("Form"))
  9. Form.resize(400, 300)
  10. self.verticalLayout = QtGui.QVBoxLayout(Form)
  11. self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
  12. spacerItem = QtGui.QSpacerItem(20, 98, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
  13. self.verticalLayout.addItem(spacerItem)
  14. self.lHello = QtGui.QLabel(Form)
  15. self.lHello.setObjectName(_fromUtf8("lHello"))
  16. self.verticalLayout.addWidget(self.lHello)
  17. self.pbHello = QtGui.QPushButton(Form)
  18. self.pbHello.setObjectName(_fromUtf8("pbHello"))
  19. self.verticalLayout.addWidget(self.pbHello)
  20. spacerItem1 = QtGui.QSpacerItem(20, 98, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
  21. self.verticalLayout.addItem(spacerItem1)
  22. self.retranslateUi(Form)
  23. QtCore.QMetaObject.connectSlotsByName(Form)
  24. def retranslateUi(self, Form):
  25. Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
  26. self.lHello.setText(QtGui.QApplication.translate("Form", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
  27. self.pbHello.setText(QtGui.QApplication.translate("Form", "Say Hello", None, QtGui.QApplication.UnicodeUTF8))

注意到代码中self.lHello和self.pbHello变量,他们的名字是和我们前面界面设计的objectName是一一对应的。

注意

不要把业务代码写在ui_widget.py文件中,下次使用pyuic4命令的时候将会覆盖该文件,你所做的一切工作将白费。

使用转换后的界面代码

这里只介绍使用Python的多重继承方式。这种方式有个好处是代码编写方便,而且可以通过self. + objectName的方式来调用界面组件。

  1. # -*- coding: utf-8 -*-
  2. from PyQt4 import QtGui
  3. from ui_widget import Ui_Form
  4. class Widget(QtGui.QWidget, Ui_Form):
  5. """QtGui.QWidget和界面设计时选择的类型一致"""
  6. def __init__(self, parent=None):
  7. QtGui.QWidget.__init__(self, parent)
  8. self.setupUi(self) # Ui_Form.setupUi
  9. if __name__ == '__main__':
  10. import sys
  11. app = QtGui.QApplication(sys.argv)
  12. widget = Widget()
  13. widget.show()
  14. sys.exit(app.exec_())

处理按钮点击事件

PyQt支持使用QtCore.pyqtSignature()装饰器来连接信号和槽,不需要通过手工连接。具体方法名为on_objectName_信号,代码如下:

  1. # -*- coding: utf-8 -*-
  2. from PyQt4 import QtGui, QtCore
  3. from ui_widget import Ui_Form
  4. class Widget(QtGui.QWidget, Ui_Form):
  5. """QtGui.QWidget和界面设计时选择的类型一致"""
  6. def __init__(self, parent=None):
  7. QtGui.QWidget.__init__(self, parent)
  8. self.setupUi(self) # Ui_Form.setupUi
  9. @QtCore.pyqtSignature("")
  10. def on_pbHello_clicked(self):
  11. """pbHello和界面设计时的objectName一致"""
  12. self.lHello.setText('Hello PyQt4') # lHello和界面设计的objectName一致
  13. if __name__ == '__main__':
  14. import sys
  15. app = QtGui.QApplication(sys.argv)
  16. widget = Widget()
  17. widget.show()
  18. sys.exit(app.exec_())
http://jimmykuu.qiniudn.com/blog/hello-pyqt.png
http://jimmykuu.qiniudn.com/blog/hello-pyqt.png

完整代码下载:hellopyqt.zip

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年04月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PyQt中如何结合Qt设计师进行开发
  • 创建界面
  • 转换界面文件为python代码
  • 使用转换后的界面代码
  • 处理按钮点击事件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档