QMainWindow、QWidge和QDialog三个类都是用来创建窗口的,可以直接使用,也可以继承后再使用。
- QMainWindow窗口可以包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是GUI程序的主窗口。
- QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它也可以是模态的,也可以是非模态的。QDialog窗口没有菜单栏、工具栏、状态栏等。
- 如果是主窗口,就使用QMainWindow类,如果是对话框,就使用QDialog类,如果不确定,或者有可能作为顶层窗口,也有可能嵌入到其他的窗口中,那么就使用QWidge类。
1. 创建主窗口QMainWindow
界面文件代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'MainWindow.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(400, 200)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 400, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
逻辑文件代码
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
from MainWindow import *
from PyQt5.QtGui import QIcon
'''
逻辑文件--业务文件,实现界面与逻辑的分离,该文件继承了界面文件的主窗口类
'''
class MyMainWindow(QMainWindow,Ui_MainWindow):
def __init__(self,parent=None):
super(MyMainWindow,self).__init__(parent)
# 启动主界面
self.setupUi(self)
# 根据需求对界面文件进行调整
self.resize(800, 800)
# 设置状态栏
self.status = self.statusBar()
# 获得状态栏对象后,调用状态栏对象的showMessage(self, p_str, msecs=0)方法,显示状态栏信息,其中第一个参数是要显示的状态栏信息,
# 第二个参数信息停留的时间,单位是毫秒,默认是0,表示一直显示状态栏信息
self.status.showMessage("这是状态栏提示",5000)
self.setWindowTitle("PyQt MainWindow例子")
if __name__=='__main__':
app = QApplication(sys.argv)
app.setWindowIcon(QIcon("./images/cartoon1.ico"))
myWin = MyMainWindow()
myWin.show()
sys.exit(app.exec_())
结果展示:
2. QComboBox(下拉列表框)
界面文件代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'QComboBox.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.comboBox = QtWidgets.QComboBox(Form)
self.comboBox.setGeometry(QtCore.QRect(130, 80, 87, 22))
self.comboBox.setObjectName("comboBox")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(140, 140, 72, 15))
self.label.setText("")
self.label.setObjectName("label")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
逻辑文件代码
import sys
from PyQt5.QtWidgets import *
from QComboBox import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
'''
逻辑文件--业务文件,实现界面与逻辑的分离,该文件继承了界面文件的主窗口类
'''
# 创建一个类使用QComboBox按钮
class ComboxDemo(QWidget,Ui_Form):
def __init__(self,parent=None):
super(ComboxDemo,self).__init__(parent)
self.setupUi(self)
self.setWindowTitle("ComBox例子")
# 重新调整窗口的大小
self.resize(400,400)
layout = QVBoxLayout()
# 获取界面文件里面的label
self.lb1 = self.label
# 获取界面文件里面的comboBox
self.cb = self.comboBox
# 添加单个选项
self.cb.addItem("C")
self.cb.addItem(("C++"))
# 添加多个选项
self.cb.addItems(["Java", "C#", "Python"])
# 当下拉列表框中的选项发生改变时将发射currentIndexChanged信号,连接到自定义的槽函数selectionchange()
self.cb.currentIndexChanged.connect(self.selectionchange)
layout.addWidget(self.cb)
layout.addWidget(self.lb1)
self.setLayout(layout)
# 在方法中,当选中下拉列表框中的一个选项时,将把该项的文本设置为标签的文本,并调整标签的大小
def selectionchange(self, i):
self.lb1.setText(self.cb.currentText())
print("Items in the list are :")
for count in range(self.cb.count()):
print('item' + str(count) + '=' + self.cb.itemText(count))
print("Current index", i, "selextion changed", self.cb.currentText())
if __name__=='__main__':
app = QApplication(sys.argv)
myWin = ComboxDemo()
myWin.show()
sys.exit(app.exec_())
3. QPushButton按钮
界面文件代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'QPushButton.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(120, 40, 92, 28))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(Dialog)
self.pushButton_2.setGeometry(QtCore.QRect(120, 80, 92, 28))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(Dialog)
self.pushButton_3.setGeometry(QtCore.QRect(120, 120, 92, 28))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(Dialog)
self.pushButton_4.setGeometry(QtCore.QRect(120, 160, 92, 28))
self.pushButton_4.setObjectName("pushButton_4")
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "Button1"))
self.pushButton_2.setText(_translate("Dialog", "image"))
self.pushButton_3.setText(_translate("Dialog", "Disabled"))
self.pushButton_4.setText(_translate("Dialog", "& Download"))
逻辑文件代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from QPushButton import *
'''
逻辑文件--业务文件,实现界面与逻辑的分离,该文件继承了界面文件的主窗口类
'''
# 创建一个类使用QPushButton按钮---创建了btn1、btn2、btn3和btn4四个按钮,这四个QpushButton对象被
# 定义为类的实例变量,每个按钮都将clicked信号发送给指定的槽函数,以响应按钮点击事件。
class Form(QDialog,Ui_Dialog):
def __init__(self,parent=None):
super(Form,self).__init__(parent)
self.setupUi(self)
layout = QVBoxLayout()
# 第1个按钮btn1,通过toggle()函数来切换按钮状态
self.btn1 = self.pushButton
# 设置按钮是否已经被选中,如果设置为True,则表示按钮将保持已点击和释放状态
self.btn1.setCheckable(True)
# 在按钮专题之间进行切换
self.btn1.toggle()
# 通过lambda的方式来传递额外的参数btn1,将clicked信号发送给槽函数whichbtn()
self.btn1.clicked.connect(lambda :self.whichbtn(self.btn1))
# 当点击这个按钮时,将clicked信号发送给槽函数btnstate(),通过btn.isChecked来获得按钮是否被点击或释放的状态。
self.btn1.clicked.connect(self.btnstate)
layout.addWidget(self.btn1)
self.btn2 = self.pushButton_2
# 第2个按钮btn2,上面显示一个图标。用setIcon()方法接收一个QPixmap对象的图像文件作为输入参数
self.btn2.setIcon(QIcon(QPixmap("./images/python.png")))
self.btn2.clicked.connect(lambda :self.whichbtn(self.btn2))
layout.addWidget(self.btn2)
self.setLayout(layout)
self.btn3 = self.pushButton_3
# 第3个按钮btn3,使用setEnabled()方法来禁用btn3按钮
self.btn3.setEnabled(False)
layout.addWidget(self.btn3)
self.btn4 = self.pushButton_4
# 第4个按钮btn4,使用setDefault()方法来设置按钮的默认状态。快捷键是“&Download”,通过“ALT+D”快捷键来调用槽函数。
self.btn4.setDefault(True)
self.btn4.clicked.connect(lambda :self.whichbtn(self.btn4))
layout.addWidget(self.btn4)
self.setWindowTitle("Button demo")
def btnstate(self):
if self.btn1.isChecked():
print("button pressed")
else:
print("button released")
def whichbtn(self,btn):
print("clicked button is " + btn.text())
if __name__=='__main__':
app = QApplication(sys.argv)
myWin = Form()
myWin.show()
sys.exit(app.exec_())
结果展示:
4. QMessageBox
界面文件代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'QMessageBox.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(150, 110, 92, 28))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
逻辑文件代码
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from QMessageBox import Ui_Form
class Mywindow(QWidget,Ui_Form):
def __init__(self,parent=None):
super(Mywindow, self).__init__(parent)
self.setupUi(self)
self.setWindowTitle("QMessageBox例子")
self.resize(300,100)
myButton = self.pushButton
myButton.setText("点击弹出消息框")
myButton.clicked.connect(self.msg)
def msg(self):
reply = QMessageBox.warning(self,"标题","消息正文",QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes)
print(reply)
if __name__ == '__main__':
app = QApplication(sys.argv)
myshow = Mywindow()
myshow.show()
sys.exit(app.exec_())
运行结果: