PyQt中如何结合Qt设计师进行开发
t设计师是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。如图所示:

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

双击按钮修改文字为"Say Hello",选中对象在属性编辑器中修改属性:
Label的objectName为lHello
Push Button的objectName属性为pbHello。
完成后的界面如下:

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

转换界面文件为python代码
通过pyuic4命令转换代码,把widget.ui转换成ui_widget.py文件。
$ pyuic4 -o ui_widget.py widget.ui
转换后代码如下:
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.verticalLayout = QtGui.QVBoxLayout(Form)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
spacerItem = QtGui.QSpacerItem(20, 98, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.lHello = QtGui.QLabel(Form)
self.lHello.setObjectName(_fromUtf8("lHello"))
self.verticalLayout.addWidget(self.lHello)
self.pbHello = QtGui.QPushButton(Form)
self.pbHello.setObjectName(_fromUtf8("pbHello"))
self.verticalLayout.addWidget(self.pbHello)
spacerItem1 = QtGui.QSpacerItem(20, 98, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
self.lHello.setText(QtGui.QApplication.translate("Form", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
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的方式来调用界面组件。
# -*- coding: utf-8 -*-
from PyQt4 import QtGui
from ui_widget import Ui_Form
class Widget(QtGui.QWidget, Ui_Form):
"""QtGui.QWidget和界面设计时选择的类型一致"""
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self) # Ui_Form.setupUi
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec_())
处理按钮点击事件
PyQt支持使用QtCore.pyqtSignature()装饰器来连接信号和槽,不需要通过手工连接。具体方法名为on_objectName_信号,代码如下:
# -*- coding: utf-8 -*-
from PyQt4 import QtGui, QtCore
from ui_widget import Ui_Form
class Widget(QtGui.QWidget, Ui_Form):
"""QtGui.QWidget和界面设计时选择的类型一致"""
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setupUi(self) # Ui_Form.setupUi
@QtCore.pyqtSignature("")
def on_pbHello_clicked(self):
"""pbHello和界面设计时的objectName一致"""
self.lHello.setText('Hello PyQt4') # lHello和界面设计的objectName一致
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec_())
PyQt中如何结合Qt设计师进行开发的更多相关文章
- 使用Qt设计师文件的3种方式
使用Qt设计师设计的.ui界面文件是XML文件,有3种方式在PyQt中使用,本文将通过实例进行讲解. 使用PyQt中如何结合Qt设计师进行开发中的例子.点击按钮修改标签的内容. 1. 直接使用ui文件 ...
- Qt与PyQT中设置ToolBar在AllowedArea的显示
因为个人对传统的软件GUI界面不是太喜欢,最近又在学习Qt和PyQt5,所以就有了设置ToolBar在窗口的不同地方的想法,经过浪里淘沙,最终在Qt官网里找到了,原来再添加toolBar的时候是由设置 ...
- PyQt学习随笔:Qt中Model/View中的怎么构造View匹配的Model
老猿Python博文目录 老猿Python博客地址 在<PyQt学习随笔:Qt中Model/View相关的主要类及继承关系>介绍了Model/View架构的主要类,在实际使用时,view相 ...
- 第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用
老猿Python博文目录 老猿Python博客地址 一.引言 前面一些章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重要核心特性,还是非常有必要单独介绍. 二.信 ...
- pyqt 调用QT设计师创建的对话框
一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.实验步骤 2.1 ...
- PyQt(Python+Qt)学习随笔:Qt中的部分类型QString、QList和指针、引用在PyQt中的实现方式
老猿Python博文目录 老猿Python博客地址 在我们查阅Qt的文档资料时,可以看到Qt中的链表使用的是QList,字符串使用的是QString,但老猿在测试时发现这两个类型PyQt不支持,无法找 ...
- 痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术 ...
- pyqt、webkit和qt之间的关系
前言 最近在维护一个PYQT的项目,有很多不明白的地方,总结一下,共其他直接使用pyqt的人参考一下.PyQT是一个生成图形应用程序的工具包.是python语言和成功的Qt库的绑定.Qt库是这个世界上 ...
- Python GUI教程(六):使用Qt设计师进行窗口布局
本篇介绍使用qt设计师进行GUI窗口的布局管理,主要包含以下内容: 使用Qt设计师布局我们的窗口部件: 垂直布局: 水平布局: 网格布局: 使用间隔: 使用“伙伴”将label标签与窗口部件进行连接. ...
随机推荐
- Zencart先生成订单后付款,类似淘宝后台修改订单价格
Zencart 使用 Paypal 付款,会出现漏单的情况,即 paypal 已经收到客户的付款,但是网站后台没有客户的订单.导致 paypal 漏单的原因大致会是当客户跳转到Paypal 网站付款完 ...
- ASP.NET jQuery 随笔 显示RadioButtonList成员选中的内容和值
通过jQuery来获取RadioButtonList成员内容. <%@ Page Language="C#" AutoEventWireup="true" ...
- 国内外主流BI厂商对比
BI(Business Intelligence),即商业智能或者商务智能,它是一套完整的解决方案,用来将企业中现有的数据进行有效的整合,快速准确的提供报表并提出决策依据,帮助企业做出明智的业务经营决 ...
- android studio recent projects
android studio正常的删除项目的方法是可以点击右键,选择project structure,进入到界面时,选择你要删除的工程,点击减号,接着就可以右键工程有一个delete. 另外一种方法 ...
- 高性能Mysql主从架构的复制原理及配置详解(转)
温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...
- Spring Boot Logback应用日志
e Spring Boot Logback应用日志 2015-09-08 19:57 7673人阅读 评论(0) 收藏 举报 . 分类: Spring Boot(51) . 目录(?)[+] 日志对于 ...
- 网页中获取网络mp3文件的时常
<html> <audio id="audio" controls> <source src="http://cdn.kaishuhezi. ...
- C语言参数传递
//--------------------单向值传递------------------------ // swap这个方法在被调用时,给形参a,b分配了空间 // 主调函数将[数值]传递给[形参] ...
- 开始QT+OpenCV学问
最近一个月.由于超声造影软件工具做.因此,开始接触OpenCV.使用OpenCV的话.除了图像处理,其它功能都非常弱.所以又開始学习MFC. 从原先的.net C#编程环境一下变成MFC还真有点不习惯 ...
- HDU1325 &&poj1308 基础并查集
和上一道小希的迷宫差点儿相同,可是在HDU上提交一直WA,POJ过了 HDU的数据太强了吧,强的我感觉数据有问题 题意:输入若干对点,推断是否是一颗树,转化过来也就是是否存在环 点数-边数=1,还要推 ...