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_())

时间: 2024-08-05 19:36:02

PyQt中如何结合Qt设计师进行开发的相关文章

使用Qt设计师文件的3种方式

使用Qt设计师设计的.ui界面文件是XML文件,有3种方式在PyQt中使用,本文将通过实例进行讲解. 使用PyQt中如何结合Qt设计师进行开发中的例子.点击按钮修改标签的内容. 1. 直接使用ui文件 PyQt4的ui模块提供了加载.ui文件的功能,ui.uic.loadUi(uifile[, baseinstance=None])方法会返回一个QWdiget子类的实例. 优点:不用手工转换.ui文件,直接使用.缺点:效率低,多一个在运行中的转换过程:.ui文件暴露在外,不利于发布.代码如下(w

痞子衡嵌入式:超级好用的可视化PyQt GUI构建工具(Qt Designer)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PyQt GUI构建工具Qt Designer. 痞子衡开博客至今已有好几年,一直以嵌入式开发相关主题的文章为主线,偶尔穿插一些其他技术或工具的介绍,前段时间因为要做一个跟恩智浦MCU启动相关的上位机工具 NXP-MCUBootUtility,网上搜索对比了几个Python下的GUI框架,最终选择了wxPython这个成熟稳定的GUI库,从而接触到wxFormBuilder这个配套wxPython使用的GUI构建工具.苦于网上关于该

QT-面向对象的QT编程,QT设计师

一.面向对象的编程 <案例>通过一个按钮更新时间显示,显示格式为xx:xx:xx //主函数文件 #include<QApplication> #include"TimeDialog.h" int main(int argc,char** argv){ QApplication app(argc,argv); TimeDialog time; time.show(); return app.exec(); } //类声明文件 #ifndef __TIMEDIAL

Qt For Android 开发环境配置

想了想,还是再写一篇关于Qt for Android开发环境配置的教程. 准备:Java jdk,Android sdk,Android adb,Android ndk,Android ant,Qt 支持 安卓的版本,比如qt-opensource-windows-x86-android-5.6.2. 前言:在Qt的版本更新中,Qt支持的功能越来越多,安装包也越来越大,在Qt5.9出来之前,Qt的每个版本都对应的编译环境,而在Qt5.9后Qt官方将好多编译环境放到了一起,而在这里我要说的是要配置

Qt的IDE开发环境(KDevelop,MonKey Studio,QDevlop,Dev-cpp,Cobras,Edyuk)

讲到Qt的IDE开发环境,本人一直在Windows下使用VC6.0 + Qt4.3.1开发程序.但转到Linux下,使用Fedora中自带的KDevelop + Qt4.3.1开发程序. 最近一直做Qt程序,今天在网上看见讲述Qt的IDE开发环境的文章,介绍了几款Qt的IDE开发环境.在此加以总结: VC6.0.VS2005 —— Windows下知名开发环境,不多说了~ KDevelop —— Fedora下自带的集成开发环境,支持Qt4.据说是用Qt3开发出来的,不知道真伪~ MonKey

Qt for Android 开发大坑

Qt for Android 开发大坑 作者: qyvlik Qt 5.5.1 这里说一说比较常见的 Qt 开发安卓的大坑.希望同学们不要做无谓的挣扎,跳过这些坑. 输入框 首当其冲的是输入框,Qt 的输入在安卓上表现不佳. 无法支持安卓原生的输入法访问 Qt 的输入框,就是安卓输入法无法复制,粘贴,剪切 Qt 输入框中的文本. 无法支持使用触摸的方式选中 Qt 输入框中的文字. 如果输入框的位置处于应用底部,类似于 IM 那种聊天工具,应当注意. a. 如果应用 Activity 设置为 an

Qt移动应用开发(六):QML与C++互动

Qt移动应用开发(六):QML与C++互动 上一篇文章讲到了在Qt Quick中实现场景切换的一种可能的方法,场景切换是诸如游戏等应用在内必需要面临的技术难点,所以场景切换并没有通行的方法,依据自己的使用习惯进行设计就可以. 本文主要介绍的是怎样使用QML和C++进行交互,难度略微偏大,适合有经验的Qt开发人员进行学习交流. Qt 5吸收了Qt 4的declarative模块的长处,对底层进行了更改,新建了QPA层,隔离了不同操作系统API和上层Qt代码.同一时候QML/QtQuick也能够顺利

Qt移动应用开发(七):QML与Java的交互

上一篇文章讲到了如何实现QML和C++的交互,QML和C++的交互方法有很多,它们分别为使用上下文变量.注册QML类以及注册QML单例.那么这一次我们要了解如何使QML和Java进行交互.这里主要讲的是在Android系统下的实现,不适用于桌面平台J2SE的JVM. 原创文章,反对未声明的引用.原博客地址:http://blog.csdn.net/gamesdev/article/details/37997555 Qt5中针对不同的平台适配并开发了不同的模块,比如说Qt Windows Extr

Qt移动应用开发(一):适配不同的屏幕

Qt移动应用开发(一):适配不同的屏幕 到目前为止,Qt5.3已经出现很长一段时间了,并且已经有一些应用使用Qt进行构建了,我自己也完成了第一款使用Qt构建的手机游戏<吃药了>.那么接下来的几篇文章主要向大家分享我是怎样使用Qt进行移动开发的.Qt移动应用开发分为多篇博客文章,每一篇文章都力求精简不罗嗦,力求为大家提供一个快捷的参考.我在这里也主要将使用Qt制作<吃药了>的方法技巧一一分享给大家. 说到移动应用开发,第一想到的就是Android了,的确.Digia其实在为Qt制定向