PyQt5-02-关于窗口
目录
窗口类型介绍
- 三个类都可以用来创建窗口,可以直接使用,也可以继承后使用
- QMainWindow:GUI程序的主窗口,包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式
- QWidget:所有用户界面对象的基类,所有窗口或者控件都直接或间接继承自QWidget类,有可能作为顶层窗口,也有可能嵌入到其他窗口
- QDialog:对话框窗口的基类,主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的
窗口的显示状态
.showFullScreen()
全屏显示.showMaximized()
最大化显示.showMinimized()
最小化显示.hide()
隐藏窗口,也适合与大多数组件.show()
显示窗口,也适合与大多数组件.windowState()
返回窗口状态isMinimized()
如果窗口最小化,返回值为True;否则,为False;isMaximized()
如果窗口最大化,返回值为True;否则,为False;isFullScreen()
如果窗口全屏显示,返回值为True;否则,为False;isActiveWindow()
如果是活动窗口,返回值为True;否则,为False;;
QMainWindow
- QMainWindow是QWidget的子类
- 包含
状态栏
、工具栏
和菜单栏
的经典应用程序框架 - 如果是根窗口一般继承此类
- 可以使用绝对布局,不可以使用箱式布局
状态栏
- 用来显示状态信息的串口部件,在窗口的最下左侧显示
菜单栏
- 下拉菜单
工具栏
- 工具栏则提供了快速执行最常用命令的方法
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp
from PyQt5.QtGui import QIcon
class FirstWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.setGeometry(300, 300, 200, 200)
self.setWindowTitle("第一个窗口")
#给生成的二级菜单添加一个内容,绑定图标,文本,绑定类(这个按钮属于哪个控件)
exit_menu = QAction(QIcon(r"1.ico"), "退出", self)
#绑定一个快捷键
exit_menu.setShortcut("Ctrl+Q")
#生成一个菜单按钮链接事件,执行退出命令
exit_menu.triggered.connect(qApp.quit)
copy_menu = QAction(QIcon(r"2.ico"), "复制", self)
copy_menu.setShortcut("Ctrl+C")
version_menu = QAction(QIcon(r"3.ico"), "版本", self)
#生成菜单栏
menubar = self.menuBar()
#生成一个二级菜单,并命名
file_bar = menubar.addMenu("文件")
#给生成的二级菜单添加上面代码生成的二级内容
file_bar.addAction(exit_menu)
edit_bar = menubar.addMenu("编辑")
edit_bar.addAction(copy_menu)
help_bar = menubar.addMenu("帮助")
help_bar.addAction(version_menu)
#生成一个工具
exit_tool = QAction(QIcon(r"4.ico"), "退出", self)
exit_tool.triggered.connect(qApp.quit)
#生成一个工具栏,并给整个工具栏命名
toolbar = self.addToolBar("工具栏")
#添加工具
toolbar.addAction(exit_tool)
#生成每个按钮的状态栏信息
exit_menu.setStatusTip("退出程序")
copy_menu.setStatusTip("复制")
version_menu.setStatusTip("版本")
exit_tool.setStatusTip("退出程序")
#生成状态栏
self.statusBar()
def mainGui():
app = QApplication(sys.argv)
#设置显示风格Fusion及windows
app.setStyle('Fusion')
firstwindow = FirstWindow()
firstwindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
mainGui()
QWidget
- 在PyQt5里所有能显示的都是QWidget的子类
1. 控件.setToolTip("气泡显示的内容")
- 可以设置一个控件的气泡显示内容
- 过
from PyQt5.QtWidgets import QToolTip
导入 - 通过
QToolTip.setFont(QFont('SansSerif', 30))
设置气泡文字的字体和字号
2. 获得屏幕尺寸
from PyQt5.QtWidgets import QDesktopWidget
#获得屏幕尺寸
screen = QDesktopWidget().screenGeometry()
#获得屏幕的宽度
width = screen.width()
#获得屏幕的高度
height = screen.height()
3. 获得窗口的属性
from PyQt5.QtWidgets import QWidget
app = QApplication(sys.argv)
firstwindow = QWidget()
print(firstwindow.width()) #获取窗口宽度
print(firstwindow.height()) #获取窗口高度
print(firstwindow.x()) #获取窗口左上角的X坐标
print(firstwindow.y()) #获取窗口左上角的Y坐标
4. 给窗口添加小图标
from PyQt5.QtGui import QIcon
firstwindow = QWidget()
firstwindow.setWindowIcon(QIcon(r"图标路径"))
5. 消息窗口
#关闭窗口时弹出确认窗口
from PyQt5.QtWidgets import QMessageBox
def closeEvent(self, event):
reply = QMessageBox.question(self,"确认退出","你确定要退出么?",QMessageBoxYes,
QMessageBoxNo)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
定位方式
- 定位方式分为绝对布局、箱式布局、网格式布局
1. 绝对定位方式
- QMainWindow()和QWidget()的类窗口都可以用绝对定位方式
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
class FirstWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.setWindowTitle("第一窗口")
self.setGeometry(300, 300, 400, 400)
QLabel('Couldn\'t', self).move(15, 10)
QLabel('care', self).move(35, 40)
QLabel('less', self).move(55, 65)
QLabel('and', self).move(115, 65)
QLabel('then', self).move(135, 45)
QLabel('you', self).move(115, 25)
QLabel('kiss', self).move(145, 10)
QLabel('me', self).move(215, 10)
def guiMainLoop():
app = QApplication(sys.argv)
firstwindow = FirstWindow()
firstwindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
guiMainLoop()
2. 箱式布局
- QMainWindow()类窗口不可以使用箱式布局,QWidget()类窗口可以使用箱式布局
- 可以在QMainWindow()类窗口的中心部件,通过setCentralWidget方法,添加QWidget()类窗口后,使用箱式布局
- QHBoxLayout() 水平布局
- QVBoxLayout() 垂直布局
- .addWidget() 添加部件
- .addStretch() 添加间隔元素
- .setLayout() 生成总体布局
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
class FirstWindow(QWidget):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.setWindowTitle("第一窗口")
self.setGeometry(300, 300, 400, 400)
self.b1 = QPushButton("按钮1")
self.b2 = QPushButton("按钮2")
#建立一个水平布局
self.h_box = QHBoxLayout()
#从左往右添加一个间隔,两个按钮
self.h_box.addStretch(1)
self.h_box.addWidget(self.b1)
self.h_box.addWidget(self.b2)
#建立一个垂直布局
self.v_box = QVBoxLayout()
#从上往下添加一个间隔,上面的水平布局
self.v_box.addStretch(1)
self.v_box.addLayout(self.h_box)
#生成总体布局
self.setLayout(self.v_box)
def guiMainLoop():
app = QApplication(sys.argv)
firstwindow = FirstWindow()
firstwindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
guiMainLoop()
3. 网格布局
- QMainWindow()类窗口不可以使用箱式布局,QWidget()类窗口可以使用箱式布局
- 可以在QMainWindow()类窗口的中心部件,通过setCentralWidget方法,添加QWidget()类窗口后,使用网格布局
- 该布局方式将窗口空间划分为许多行和列
- QGridLayout() 创建一个网格布局
- .addWidget() 在网格中添加部件
- .setLayout() 生成总体布局
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QMainWindow
class FirstWindow(QWidget):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.setWindowTitle("第一窗口")
self.setGeometry(300, 300, 400, 400)
self.b1 = QPushButton("按钮1")
self.b2 = QPushButton("按钮2")
self.b3 = QPushButton("按钮3")
self.b4 = QPushButton("按钮4")
self.b5 = QPushButton("按钮5")
self.b6 = QPushButton("按钮6")
self.b7 = QPushButton("按钮7")
self.b8 = QPushButton("按钮8")
self.b9 = QPushButton("按钮9")
#实例化一个网格布局
self.grid = QGridLayout()
#给网格布局添加部件
self.grid.addWidget(self.b1, 0, 0)
self.grid.addWidget(self.b2, 0, 1)
self.grid.addWidget(self.b3, 0, 2)
self.grid.addWidget(self.b4, 0, 3)
self.grid.addWidget(self.b5, 1, 0)
self.grid.addWidget(self.b6, 1, 1)
self.grid.addWidget(self.b7, 1, 2)
self.grid.addWidget(self.b8, 2, 0)
#参数为 行,列,行跨度,列跨度
self.grid.addWidget(self.b9, 2, 1, 5, 2)
#生成总体布局
self.setLayout(self.grid)
def guiMainLoop():
app = QApplication(sys.argv)
firstwindow = FirstWindow()
firstwindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
guiMainLoop()
两个特殊例子
窗口间跳转
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton
class FirstWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.resize(300, 300)
self.move(100, 100)
self.setWindowTitle("第一个窗口")
self.btn = QPushButton('进入第二个窗口', self)
self.btn.setGeometry(10, 10, 100, 100)
self.btn.clicked.connect(self.jumpToSecondWindow)
def jumpToSecondWindow(self):
self.hide()
self.targetwindow = SecondWindow()
self.targetwindow.show()
class SecondWindow(QWidget):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.resize(300, 300)
self.move(100, 100)
self.setWindowTitle("第二个窗口")
self.btn = QPushButton('进入第一个窗口', self)
self.btn.setGeometry(10, 10, 100, 100)
self.btn.clicked.connect(self.jumpToFirstWindow)
def jumpToFirstWindow(self):
self.hide()
self.targetwindow = FirstWindow()
self.targetwindow.show()
def guiMainLoop():
app = QApplication(sys.argv)
firstwindow = FirstWindow()
firstwindow.show()
sys.exit(app.exec_())
if __name__ == "__main__":
guiMainLoop()
窗口内框架隐藏及颜色改变
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QFrame
def frameHide():
firstframe.hide()
app = QApplication(sys.argv)
#显示样式
app.setStyle('Fusion')
rootwindow = QMainWindow()
rootwindow.resize(400, 400)
rootwindow.move(100, 100)
firstframe = QFrame(rootwindow)
firstframe.resize(300, 300)
firstframe.move(0, 0)
#框架改变背景色
firstframe.setStyleSheet('''QFrame{background:#F76677;border-radius:5px;}''')
secondframe = QFrame(rootwindow)
secondframe.resize(40, 40)
secondframe.move(350, 350)
#框架改变背景色
secondframe.setStyleSheet('''QFrame{background:#9AFFB6;border-radius:5px;}''')
btn1 = QPushButton("1",firstframe)
btn1.resize(50, 50)
btn1.move(250, 250)
#部件改变背景色
btn1.setStyleSheet('''QPushButton{background:#818181;border-radius:5px;}''')
btn2 = QPushButton("2",firstframe)
btn2.resize(50, 50)
btn2.move(0, 0)
btn2.clicked.connect(frameHide)
rootwindow.show()
sys.exit(app.exec_())