Qt Desgner可视化设计窗体,窗体模板主要包括以下3种:
1、Dialogm模板,基于QDialog类的窗体,具有一般对话框的特性,如可以模态显示、具有返回值等。
2、Main Window模块,基于QMainWindow类的窗体,具有主窗口的特性,窗口上有主菜单栏、工具栏、状态栏等。
3、Widget模板,基于QWidget类窗体。QWidget类是所有界面组件的基类,如QLabel、QPushButton等界面组件都是从QWidget类继承而来的。QWidget类也是QDialog和QMainWindow的父类,基于QWidget类创建的窗体可以作为独立的窗口运行,也可以嵌入其他界面组件内显示。
Qt Desgner提供基本的编辑信号和槽的方法。本次实例新建Widget模板窗口,保存命名为MainWinSignalSlog.ui,实现单击关闭按钮后关闭窗口。
Buttons模块中找到QPushButton控件拖入到窗体From中,属性区域找到按钮text属性,属性值改为"关闭窗口",将objectname属性值改为"closeWinBtn"。单击工具栏上的"编辑信号与槽",直接在"关闭窗口"按钮上按住鼠标左键不放,拖到弹出配置连接,看出按钮控件会发射很多信号,选择需要的即可。信号选择单击clicked(),槽函数选择close(),点击ok建立连接。
用以上方法建立信号与槽连接后,在UI工具右下侧的信号与槽编辑窗口可对建立的关系进行调整。
使用UI Designer设计好的窗体保存为MainWinSignalSlog.ui后,如要在python中使用这个窗体,需要使用PyQt5的工具pyuic5.exe将界面文件转换为Python文件。
1、在windows的cmd窗口中用cd切换到文件MainWinSignalSlog.ui保存目录位置,直接执行pyuic5 -o ui_MainWinSignalSlog.py MainWinSignalSlog.ui,编译输出的文件名可任意指定。
2、也可以创建一个uic.bat保存到项目文件夹下,bat文件是windows的批处理文件,将以上命令保存到txt文本修改后缀为.bat。
3、也可以在 Pycharm 中配置 External Tools
编译后在MainWinSignalSlog.ui文件所在的目录下输出ui_MainWinSignalSlog.py,内容如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'MainWinSignalSlog.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_closeWinBtn(object):
def setupUi(self, closeWinBtn):
closeWinBtn.setObjectName("closeWinBtn")
closeWinBtn.resize(981, 694)
self.pushButton = QtWidgets.QPushButton(closeWinBtn)
self.pushButton.setGeometry(QtCore.QRect(390, 270, 75, 23))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(closeWinBtn)
self.pushButton.clicked.connect(closeWinBtn.close)
QtCore.QMetaObject.connectSlotsByName(closeWinBtn)
def retranslateUi(self, closeWinBtn):
_translate = QtCore.QCoreApplication.translate
closeWinBtn.setWindowTitle(_translate("closeWinBtn", "Form"))
self.pushButton.setText(_translate("closeWinBtn", "关闭窗口"))
界面文件定义了一个类Ui_closeWinBtn,其父类是object,不是QWidget,定义一个函数setupUi(),传入参数两个,self是函数自己,closeWinBtn是传入的参数,另外retranslateUi()函数设置窗体的标题、标签文字等。
编译转换后,就可以用Ui_closeWinBtn类来创建GUI应用程序。以下代码完成了点击按钮关闭窗口的功能实现。
#0、面向过程版本
from PyQt5 import QtWidgets
import sys
import ui_MainWinSignalSlog
#1、创建一个应用程序对象。
app=QtWidgets.QApplication(sys.argv)
#2、控件的操作
#创建控件
window=QtWidgets.QWidget()
ui=ui_MainWinSignalSlog.Ui_closeWinBtn()
ui.setupUi(window) #调用Ui_closeWinBtn()类中setupUi()函数,创建窗体上其他组件,以window作为传递参数,建完整窗体
#设置控件(大小、位置、样式...)
window.setWindowTitle("")
window.resize(500,500)
window.move(400,200)
#展示控件
window.show()
#3、应用程序的执行,进入到消息循环
sys.exit(app.exec_())
#界面与逻辑分离的GUI程序框架
from PyQt5.Qt import *
from ui_MainWinSignalSlog import Ui_closeWinBtn
class Window(QWidget):
def __init__(self,parent=None):
super().__init__(parent) #调用父类构造函数,创建QWidget窗体
self.__ui=Ui_closeWinBtn() #创建UI对象
self.__ui.setupUi(self) #构造UI
# 设置控件(大小、位置、样式...)
# self.setWindowTitle("")
self.resize(600,400)
self.move(400,200)
self.setup_ui()
def setup_ui(self):
# 子控件设置
label = QLabel(self)
label.setText("Python数据分析实例")
label.move(200,200)
if __name__ == '__main__':
import sys
#1、创建一个应用程序对象
app=QApplication(sys.argv)
#2、控件的操作
#创建控件
window=Window()
#展示控件
window.show()
#3、应用程序的执行,进入到消息循环
sys.exit(app.exec_())
也可以一个信号触发多个槽函数。同理UI 工具设计布局(界面),建立信号与槽关系,转换为.py文件
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(819, 634)
self.checkBox = QtWidgets.QCheckBox(Form)
self.checkBox.setGeometry(QtCore.QRect(100, 240, 71, 16))
self.checkBox.setObjectName("checkBox")
self.lineEdit = QtWidgets.QLineEdit(Form)
self.lineEdit.setGeometry(QtCore.QRect(170, 300, 113, 20))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(100, 300, 54, 12))
self.label.setObjectName("label")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
self.checkBox.clicked.connect(self.label.setVisible)
self.checkBox.clicked.connect(self.lineEdit.setEnabled)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.checkBox.setText(_translate("Form", "选择"))
self.lineEdit.setText(_translate("Form", "显示2"))
self.label.setText(_translate("Form", "显示1"))
再次利用界面与逻辑分离的GUI程序框架,稍微修改,点击即可运行。
from PyQt5.Qt import *
from MainWinSignalSlog01 import Ui_Form
class Window(QWidget):
def __init__(self,parent=None):
super().__init__(parent) #调用父类构造函数,创建QWidget窗体
self.__ui=Ui_Form() #创建UI对象
self.__ui.setupUi(self) #构造UI
# 设置控件(大小、位置、样式...)
# self.setWindowTitle("")
self.resize(600,400)
self.move(400,200)
self.setup_ui()
def setup_ui(self):
# 子控件设置
label = QLabel(self)
label.setText("Python数据分析实例")
label.move(200,200)
if __name__ == '__main__':
import sys
#1、创建一个应用程序对象
app=QApplication(sys.argv)
#2、控件的操作
#创建控件
window=Window()
#展示控件
window.show()
#3、应用程序的执行,进入到消息循环
sys.exit(app.exec_())