非本人原创,仅为笔记,与诸君共勉(`・ω・´)PyQt5教程,来自网易云课堂_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com
课程链接:
此处为23讲之后的笔记,之前为Qt Designer可视化开发的入门教学
主窗口类型
QMainWindow
:可以包含菜单栏、工具栏、状态栏和标题栏,是最常见的窗口形式。QDialog
:是对话窗口的基类。没有菜单栏、工具栏、状态栏。QWidget
:不确定窗口的用途,就使用QWidget。
推荐使用面向对象的方式创建
下面尝试用代码来创建一个QMainWOndow
类型的主窗口。
开始一般必须导入的第三方库:
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QIcon
然后定义代表窗口的类,这个类继承自QMainWindow
。
class FirstMainWin(QMainWindow):
def __init__(self):
# 使用父类的构造函数,即初始化列表
super(FirstMainWin, self).__init__()
# 设置主窗口的标题
self.setWindowTitle("第一个主窗口应用")
# 设置窗口的尺寸
self.resize(400, 300)
# 获得并显示当前的状态栏
self.status = self.statusBar()
# 在状态栏上增加一个只显示5000ms的消息
self.status.showMessage("只存在5秒的消息", 5000)
if __name__ == '__main__':
# 获取系统参数列表
app = QApplication(sys.argv)
# 设置窗口图标
app.setWindowIcon(QIcon('./image/pic.ico'))
# 创建实体对象
main = FirstMainWin()
# 显示窗体
main.show()
# 进入主循环,安全退出程序
sys.exit(app.exec_())
运行结果如下:
其中__name__ == '__main__'
这个判断是代表当前打开的窗体是否为这个程序的窗体。也就是说只有在当前窗口启动运行该程序,才会判对;如果使用import
等手段在其他的程序或者窗口调用运行这个程序,则会判错,后续的主函数不会被执行。其中__name__
代表系统当前运行的窗口名称,'__main__'
代表这个程序的文件的窗口名称。
进入主函数后,app = QApplication(sys.argv)
和sys.exit(app.exec_())
这两句话是必写的,具体意思可以在后面慢慢体会。
窗口居中显示
PyQt5
本身没有让窗体居中的函数,我们需要自己写,不过也很简单。让窗口显示只需要获取系统屏幕大小的参数和我们的窗口的大小的参数,计算出窗口左上角的位置。再通过move
方法移动至那个位置即可。
主体代码和上面那个一样(毕竟上面那个基本就是一个裸的框架)。不过我们需要多import一个子类QDesktopWidget
import sys
from PyQt5.QtWidgets import QDesktopWidget, QMainWindow, QApplication
from PyQt5.QtGui import QIcon
class CenterForm(QMainWindow):
def __init__(self):
# 使用父类的构造函数,即初始化列表
super(CenterForm, self).__init__()
# 设置主窗口的标题
self.setWindowTitle("窗口居中")
# 设置窗口的尺寸
self.resize(400, 300)
# 调用center方法
self.center()
def center(self):
# 得到屏幕的尺寸
screen = QDesktopWidget().screenGeometry()
# 获取窗口尺寸
size = self.geometry()
# 计算居中窗口的左上角到屏幕左侧坐标的距离
newLeft = (screen.width() - size.width()) / 2
# 计算居中窗口的左上角到屏幕上边坐标的距离
newTop = (screen.height() - size.height()) / 2
# 移动窗口, 因为move方法只接受整数,所以我们类型转换一下
self.move(int(newLeft), int(newTop))
if __name__ == '__main__':
# 获取系统参数列表
app = QApplication(sys.argv)
# 创建实体对象
main = CenterForm()
# 显示窗体
main.show()
# 进入主循环,安全退出程序
sys.exit(app.exec_())
此处用到了move()
方法,这个方法对坐标系的建立和turtle
库很像,它移动的对象是窗口的左上角。第一个参数代表移动后的窗口,左上角离屏幕左侧的距离;第二个参数代表移动后的窗口左上角离屏幕上方的距离。
其实windows系统下,我们的窗口默认是居中的
退出应用程序
之前可以在Qt Designer中通过将button的click()
信号和close()
槽函数关联来达到,只要点击button就可以直接退出程序。此处我们换一种思路,尝试通过Python代码来实现,退出应用程序。
import sys
from PyQt5.QtWidgets import QHBoxLayout, QMainWindow, QApplication, QPushButton, QWidget
class QuitApplication(QMainWindow):
def __init__(self):
super(QuitApplication, self).__init__()
self.resize(300, 120)
self.setWindowTitle("退出应用程序")
# 添加Button
self.button1 = QPushButton("退出应用程序")
# 将信号与槽关联
self.button1.clicked.connect(self.onClick_Button)
# 创建水平布局
layout = QHBoxLayout()
layout.addWidget(self.button1)
mainFrame = QWidget()
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
# 按钮单机事件的方法(自定义的槽)
def onClick_Button(self):
print("按钮被按下")
app = QApplication.instance()
# 退出应用程序
app.quit()
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QuitApplication()
main.show()
sys.exit(app.exec_())
运行结果:
点击便退出
设置窗口和应用程序图标
import ...
class IconForm(QMainWindow):
def __init__(self):
super(IconForm, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("设置窗口图标")
self.resize(400, 300)
# 设置窗口图标
self.setWindowIcon(QIcon("./image/pic.ico"))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = IconForm()
main.show()
sys.exit(app.exec_())
运行结果:
这个结果与操作系统有关,在windows环境下,结果如图所示,这个方法只能设置窗口图标;在Mac环境下,这个方法只显示了应用程序的图标(就是任务栏上的那个启动的程序的图标)。
所以这个方法只在windows中凑效。
显示控件的提示信息
什么叫控件的提示信息呢?每当我们将光标移动到一个按钮或者一个程序时,过一小会儿,光标会显示出一个小白框来显示这个按钮或者这个程序的名称或更多信息。
import sys
from PyQt5.QtWidgets import QHBoxLayout, QMainWindow, QApplication, QToolTip, QPushButton, QWidget
from PyQt5.QtGui import QFont
class ToolTipForm(QMainWindow):
def __init__(self):
super(ToolTipForm, self).__init__()
self.initUI()
def initUI(self):
# 设置字体及其大小
QToolTip.setFont(QFont("SanSerif", 12))
# 设置当前对象即窗口的提示信息,给“星期五”加一个代表加粗的HTML标签
self.setToolTip("今天是<b>星期五</b>")
# 设置窗口大小,四个参数代表x,y,width,height,相当于move和resize两个函数的作用
self.setGeometry(300, 300, 300, 300)
self.setWindowTitle("设置控件提示信息")
# 创建并设置按钮的提示信息
self.button1 = QPushButton("我的按钮")
self.button1.setToolTip("这是一个按钮")
layout = QHBoxLayout()
layout.addWidget(self.button1)
mainFrame = QWidget()
mainFrame.setLayout(layout)
self.setCentralWidget(mainFrame)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = ToolTipForm()
main.show()
sys.exit(app.exec_())
运行结果