PYQT5 的操作–【1】
部分内容参考 来源博主:
https://xiaosongshine.blog.csdn.net/
https://blog.csdn.net/weixin_45961774
"""
from PyQt5.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog
from PyQt5.QtGui import QPixmap
from PyQt5 import QtGui, QtCore
from PyQt5.QtGui import QCursor
"""
# 部分在之后使用
First : Initialize Application
# 初始化应用对象 其中sys.argv是来自命令行的参数列表
# 这是用来控制应用启动的方法
app = QApplication("sys.argv")
# 这是PyQt5所有用户节目面类的基础类,有默认构造方式
# 默认构造方法没有父类,没父类的widget组件被视为窗口使用**
window = QWidget()
# 对此widget组件大小进行调整,宽250像素,高150像素
window.resize(250,150)
# 这是用来设置窗口的标题,显示在标题栏中
window.setWindowTitle("Name")
# 设置宽度
# 视频中是一千像素,自行更改
# window.setFixedWidth(1000)
# 设置背景风格颜色(利用分号结束该语句)
window.setStyleSheet("background: #161219;")
# 展示,创建在内存中
window.show()
# 指定关闭内容
sys.exit(app.exec())
OUTPUT :
Second : Set An Icon
# 在左上角应该有一个图标
# 接下来是展示应用图标,和一些新方法
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class Example(QWidget):
"""
继承QWidget类
"""
def __init__(self):
super().__init__() # 返回父类对象并调用
self.initUI() # 调用一个方法
def initUI(self):
"""
.setGeometry() 前两参数是窗口的x,y轴位置(位置是以左上角为(0,0)向右(x)下(y)为正的)
后两参数是宽度和高度,类似融合了resize()和move()
.setWindowTitle() 设置名
.setWindowIcon(QIcon()) 是左上角应用图标(传入路径)
"""
self.setGeometry(300, 300, 300, 220)
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('传入图片路径'))
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
OUTPUT : ![](https://i-blog.csdnimg.cn/blog_migrate/0331192bc6cd1265e43644ff6485361d.png)
Third : Display A Prompt Text
from PyQt5.QtWidgets import (QWidget, QToolTip,
QPushButton, QApplication)
from PyQt5.QtGui import QFont
......
def initUI(self):
# 这里是静态方法设置文字,使用了SansSerif字体 和 10像素
QToolTip.setFont(QFont('SansSerif', 10))
# 创建提示框,其中使用富文本格式(很明显,使得QWidget变粗体的标签文本)
self.setToolTip('This is a <b>QWidget</b> widget') # 当鼠标指在窗口,就会出现的提示框
# 创建一个按钮,并且把提示框设置在按钮身上
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget') # 当鼠标指在按钮上。就会出现提示框
# 改变按钮大小sizeHint()给了他一个推荐的大小
btn.resize(btn.sizeHint())
# 移动在了窗口上的位置(50,50)
btn.move(50, 50)
# 窗口位置和大小
self.setGeometry(300, 300, 300, 200)
# 窗口名字
self.setWindowTitle('Name')
self.show()
......
OUTPUT : ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bc4b6588bfc5582b59f4d57ceab93416.png)
Forth : .Connect()
该内容在下一章(PYQT5 的操作–【2】)会有比较多的例子
①
除了使用右上角X按键关闭
这里使用程序关闭,有关触及信号和槽机制;信号(理解为事件)由对象发出去的信息,槽:(理解为事件函数)接收信息,其实就是一个方法。
使用方法:在普通的函数声明之前,加上标记,再通过connect函数把信号与槽 连接起来。后续只要调用 信号函数,就可以***触发***连接好的信号或槽函数。(信号也可以当作槽)
QPushButton(string text, QWidget parent ``=
None``)
text是按钮中显示的内容呢,parent参数是放置按钮组件的,这里会是QWidget组件。
大多数组件都有父类,没有父类的组件是顶级窗口******
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication # 用于控制应用程序的运行
......
def initUI(self):
# 创建一个退出按钮
qbtn = QPushButton('Quit', self)
"""
这里一个如果点击了按钮,clicked信号会被发送。槽可以是Qt内置的槽或者是python的一个方法调用。QCoreApplication包含主事件循 环;用来处理和传递所有事件。QCoreAppli由QCoreApplication创建。.instance()方法返回一个实例化对象,使用quit()方法,将程 序结束。
个人理解为:将点击事件关联到退出功能的函数。
事件通信发生在发生者(按钮)和接受者(应用对象)。
"""
qbtn.clicked.connect(QCoreApplication.instance().quit)
# 按键自动调整大小
qbtn.resize(qbtn.sizeHint())
# 按键位置
qbtn.move(50, 50)
# 窗口位置和宽度,高度
self.setGeometry(300, 300, 250, 150)
# 窗口名字
self.setWindowTitle('Quit button')
self.show()
......
OUTPUT : ![](https://i-blog.csdnimg.cn/blog_migrate/23138a1da9cf686d4069bc05842252e7.png)
②
def initUI(self):
self.num = 1
self.label = QLabel("1", self)
self.button = QPushButton("Button", self)
# 实例化一个QVBoxLayout对象(在后边第七节内容会记录到)
self.v_lay = QVBoxLayout()
self.v_lay.addWidget(self.label)
self.v_lay.addWidget(self.button)
# 连接信号和槽
self.button.clicked.connect(self.change_label)
# 调用窗口的setLayout方法将总布局设置为窗口的整体布局
self.setLayout(self.v_lay)
self.show()
def change_label(self):
"""
每次点击加15
"""
self.num += 15
self.label.setText(f"{self.num}") # 改变文本控件的内容
OUTPUT:
Fifth : Message Box
import sys
from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication
......
def initUI(self):
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Message box')
self.show()
def closeEvent(self, event):
"""
在关闭一个QWidget时,QCloseEvent类事件会生成。
这里重新实现处理方法
"""
# 不难看出,参数1是窗口名称,2是内容提示语,3是按钮集合,4是默认按钮
# 将按钮点击结果返回存在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()
......
OUTPUT :
Sixth : Set The On-screen Centred Window
import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication
# QDesktopWidget类提供有关用户桌面的信息,例如其总大小,屏幕数,每个屏幕的几何形状等。
每个屏幕的几何形状
......
def initUI(self):
self.resize(250, 150)
# 调用放置函数
self.center()
self.setWindowTitle('Center')
self.show()
def center(self):
fg = self.frameGeometry() # 获得应用窗口的框架
# 算出相对于显示器的绝对值。并且从这个绝对值中→↓
centre_ = QDesktopWidget().availableGeometry().center() # 获得screen中心点
fg.moveCenter(centre_) # 将框架中心移动到 screen中心点
self.move(fg.topLeft()) # 把应用窗口左上角移动到矩形的左上角的点
......
这是frameGeometry()
图片来源博主.
OUTPUT : ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f96ab492cefccee124777ac098048fe2.png)
Seventh : Add input boxes
① Nested
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout, QLineEdit
......
def initUI(self):
self.resize(250, 150)
self.setWindowTitle('Add input boxes')
# 创建 带有"内容"的标签
self.inputlabel1 = QLabel(" ID:", self)
self.inputlabel2 = QLabel(" pwd:", self)
# 创建 输入控件
self.inputline1 = QLineEdit(self)
self.inputline2 = QLineEdit(self)
# 嵌套布局调整
# 子布局(实例化水平布局管理器)
self.h1_lay = QHBoxLayout()
self.h2_lay = QHBoxLayout()
# 假定这是总布局,在下面的整体布局中表现(实例化垂直布局管理器)
self.v_lay = QVBoxLayout()
# 开始添加组件
self.h1_lay.addWidget(self.inputlabel1) # 水平布局标签和输入框
self.h1_lay.addWidget(self.inputline1)
self.h2_lay.addWidget(self.inputlabel2) # 同上
self.h2_lay.addWidget(self.inputline2)
# 垂直布局(在垂直方向使用addLayout()添加刚才的水平布局)
self.v_lay.addLayout(self.h1_lay)
self.v_lat.addLayout(self.h2_lay)
# 调用窗口的setLayout方法将总布局设置为窗口的整体布局
self.setLayout(self.v_lay)
self.show()
......
"""
这里的镶嵌方式为:
大框架是垂直分布
第一行的小框架是水平分布
当然也有另外一种分布情况(与上相反)
"""
OUTPUT : ![](https://i-blog.csdnimg.cn/blog_migrate/ed9444b3fbc86b8264822f7721a4ee68.png)
② FormLayout (more accessible )
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QFormLayout
......
def initUI(self):
......
# 实例化一个QFormLayout对象
self.f_lay = QFormLayout()
# 第一个参数文本控件,第二个参数输入型控件
self.f_lay.addRow(self.inputlabel1, self.inputline1)
self.f_lay.addRow(self.inputlabel2, self.inputline2)
# 调用窗口的setLayout方法将总布局设置为窗口的整体布局
self.setLayout(self.f_lay)
self.show()
......
OUTPUT : ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b4f5b0f09fa64dc210bc13f54b7e9f36.png)
位置似乎和上边不一样
③ GridLayout
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QGridLayout
......
def initUI(self):
......
login_butn = QPushButton("LOGIN", self)
self.g_layout = QGridLayout()
# 坐标以左上方为零点,符合x→为正,y↓为正
self.g_layout.addWidget(self.inputlabel1, 0, 0) # 前两个参数是坐标
self.g_layout.addWidget(self.inputline1, 0, 1)
self.g_layout.addWidget(self.inputlabel2, 1, 0)
self.g_layout.addWidget(self.inputline2, 1, 1)
self.g_layout.addWidget(login_button, 2, 0, 1, 2) # 后两个参数是高和宽
self.setLayout(self.g_lay)
self.show()
......