#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
#这里我们进行了一些必要模块的导入。最基础的widget组件位于PyQt5.QtWidget模块中
from PyQt5.QtWidgets import (QApplication, QWidget, QToolTip, QAction, qApp,
QPushButton, QMessageBox, QDesktopWidget, QMainWindow, QTextEdit, QGridLayout)
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QCoreApplication # 引入QtCore的对象模块
# 新窗口
class SecondWindow(QWidget):
def __init__(self):
super(SecondWindow, self).__init__()
self.resize(200, 200)
self.setStyleSheet("background: black") # 背景色改为黑色
#类
class Example(QMainWindow): #QWidget,QMainWindow
def __init__(self):
'''
在面向对象编程中有三个重要的东西,分别是类,数据和方法。
这里我们创建了一个新类叫做Example。Example类继承自QWidget类。
这意味着我们调用了两个构造方法:第一个是Example类的构造方法,第二个是被继承类的构造方法。
super()方法返回了Example类的父类对象,并且我们调用了父类的构造方法。
__init__()方法是Python语言中的构造方法。
'''
super().__init__()
#Qwidget组件是PyQt5中所有用户界面类的基础类。
#我们给QWidget提供了默认的构造方法。默认构造方法没有父类。
#没有父类的widget组件将被作为窗口使用。
#w = QWidget()
self.setFont(QFont('SansSerif', 10)) # 设置提示框字体:10px大小的SansSerif字体
self.setToolTip('This is a QWidget widget啊') # 创建窗体提示框
self.resize(600, 600) # 调整了widget组件的大小。它现在是250px宽,150px高
#self.move(300, 300) # 这个位置是屏幕上x=300,y=300的坐标
#self.setGeometry(300, 300, 300, 220) #(X轴,Y轴,窗口宽度,窗口高度);将resize()和move()方法融合在一个方法内
self.setWindowTitle('Main window') # 对话框标题
self.setWindowIcon(QIcon('48X48(1).ico')) # 图标
self.initUI()
self.center() # 调用窗口居中方法
self.show() # show()方法在屏幕上显示出widget
def initUI(self):
# 定义状态栏,在窗口最后一行
self.statusBar().showMessage('Ready') # 显示状态栏默认文字Ready
# exitAction定义按钮及按钮事件
exitAction = QAction(QIcon('48X48.ico'), '&Exit', self) # 设置菜单按钮图标及文字
exitAction.setShortcut('Ctrl+Q') # 设置快捷键
exitAction.setStatusTip('Exit application') # 鼠标浮于菜单项之上就会显示的一个状态提示
exitAction.triggered.connect(qApp.quit) # 当我们选中特定的动作,一个触发信号会被发射。信号连接到QApplication组件的quit()方法。这样就中断了应用。
# 定义菜单栏
menubar = self.menuBar() # menuBar()方法创建了一个菜单栏。
fileMenu = menubar.addMenu('&File') # 我们创建一个file菜单
fileMenu.addAction(exitAction) # 将退出动作添加到file菜单中。
# 新建工具栏,并绑定事件
toolbar = self.addToolBar('Exit')
toolbar.addAction(exitAction)
qbtn = QPushButton('退出', self) # 定义退出按钮
'''
在PyQt5中,事件处理系统由信号&槽机制建立。如果我们点击了按钮,信号clicked被发送。
槽可以是Qt内置的槽或Python 的一个方法调用。
QCoreApplication类包含了主事件循环;它处理和转发所有事件。instance()方法给我们返回一个实例化对象。
注意QCoreAppli类由QApplication创建。点击信号连接到quit()方法,将结束应用。
事件通信在两个对象之间进行:发送者和接受者。发送者是按钮,接受者是应用对象。
'''
qbtn.clicked.connect(QCoreApplication.instance().quit) # 按钮点击事件
qbtn.setToolTip('点击按钮后 本窗口关闭') # 创建按钮提示框
qbtn.resize(qbtn.sizeHint())
#qbtn.move(100, 100) # 按钮绝对定位
nbtn = QPushButton('弹出新窗口', self)
nbtn.setToolTip('弹出新窗口') # 创建按钮提示框
nbtn.clicked.connect(self.onclick)
nbtn.resize(nbtn.sizeHint())
# 定义文本框组件。
textEdit = QTextEdit()
#self.setCentralWidget(textEdit) #我们将它设置成QMainWindow的中心组件。中心组件占据了所有剩下的空间。
grid = QGridLayout()
grid.setSpacing(10) # 网格间的距离为10
#grid.addWidget(fileMenu, 1, 0)
#grid.addWidget(toolbar, 2, 1)
grid.addWidget(qbtn, 1, 0)
grid.addWidget(nbtn, 1, 1)
grid.addWidget(textEdit, 2, 0, 1,2)
widget= QWidget() #加一个wiget布局设为中心,就能在QMainWindow 窗口实现布局了
widget.setLayout(grid)
self.setCentralWidget(widget)
# 按钮事件
def onclick(self):
self.newWindow = SecondWindow()
self.newWindow.show()
#newWindow.exec_()
# 设置窗口居中
def center(self):
qr = self.frameGeometry() # 获得主窗口的一个矩形特定几何图形。这包含了窗口的框架。
# QtGui.QDesktopWidget类提供了我们桌面窗口的信息,包含了屏幕尺寸。
cp = QDesktopWidget().availableGeometry().center() #算出相对于显示器的绝对值。并且从这个绝对值中,我们获得了屏幕中心点。
qr.moveCenter(cp) #矩形已经设置好了它的宽和高。现在我们把矩形的中心设置到屏幕的中间去。矩形的大小并不会改变。
self.move(qr.topLeft()) # 移动了应用窗口的左上方的点到qr矩形的左上方的点,因此居中显示在我们的屏幕上。
# 窗口关闭事件,如果我们关闭一个QWidget,QCloseEvent类事件将被生成。
# 要修改组件动作我们需要重新实现closeEvent()事件处理方法。
def closeEvent(self, event):
#代码中第一个字符串的内容被显示在标题栏上。第二个字符串是对话框上显示的文本。
#第三个参数指定了显示在对话框上的按钮集合。最后一个参数是默认选中的按钮。
#这个按钮一开始就获得焦点。返回值被储存在reply变量中。(标题,文本,按钮集合,默认选择按钮)
reply = QMessageBox.question(self, 'Message标题',"Are you sure to quit?你确定要退出吗?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
'''
所有的PyQt5应用必须创建一个应用(Application)对象。
sys.argv参数是一个来自命令行的参数列表。Python脚本可以在shell中运行。
这是我们用来控制我们应用启动的一种方法。
'''
app = QApplication(sys.argv)
ex = Example() # 应用和example对象被创建。主循环被启动。
'''
最后,应用进入主循环。在这个地方,事件处理开始执行。
主循环用于接收来自窗口触发的事件,并且转发他们到widget应用上处理。
如果我们调用exit()方法或主widget组件被销毁,主循环将退出。
sys.exit()方法确保一个不留垃圾的退出。系统环境将会被通知应用是怎样被结束的。
exec_()方法有一个下划线。因为exec是Python保留关键字。因此,用exec_()来代替。
'''
sys.exit(app.exec_())