目录
一.设置窗口中控件的风格
代码:
import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
#窗口可以显示的风格样式
print('窗口可以显示的风格样式:',QStyleFactory.keys())
class WindowStyle(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('设置窗口风格')
horizontalLayout = QHBoxLayout()
self.styleLabel = QLabel('设置窗口风格:')
#下拉框
self.styleComboBox = QComboBox()
self.styleComboBox.addItems(QStyleFactory.keys())
# 获取当前窗口的风格
print('当前窗口的风格:',QApplication.style().objectName())
#获取当前窗口的风格的索引
index = self.styleComboBox.findText(QApplication.style().objectName(),QtCore.Qt.MatchFixedString)
#将下拉框初始设置为当前窗口的风格的名字
self.styleComboBox.setCurrentIndex(index)
self.styleComboBox.activated[str].connect(self.handleStyleChanged)
horizontalLayout.addWidget(self.styleLabel)
horizontalLayout.addWidget(self.styleComboBox)
self.setLayout(horizontalLayout)
def handleStyleChanged(self,style):
#设置风格
QApplication.setStyle(style)
if __name__ == "__main__":
app = QApplication(sys.argv)
form = WindowStyle()
form.show()
sys.exit(app.exec_())
运行结果:
会看到空间的风格会有所改变。
二.设置窗口样式
setWindowFlags ( Qt::WindowFlags type )
Qt::FrameWindowHint:没有边框的bai窗口du
Qt::WindowStaysOnTopHint://总在最zhi上面的窗口
Qt::CustomizeWindowHint://自定义窗口标题栏,以下标dao志必须与这个标志一zhuan起使用才有效shu,否则窗口将有默认的标题栏
Qt::WindowTitleHint:显示窗口标题栏
Qt::WindowSystemMenuHint://显示系统菜单
Qt::WindowMinimizeButtonHint://显示最小化按钮
Qt::WindowMaximizeButtonHint://显示最大化按钮
Qt::WindowMinMaxButtonsHint://显示最小化按钮和最大化按钮
Qt::WindowCloseButtonHint://显示关闭按钮
setWindowFlags(Qt::FramelessWindowHint);直接隐藏掉
代码:
'''
设置窗口样式(主要是窗口边框、标题栏以及窗口本身的样式)
'''
from PyQt5.QtCore import *
import sys
from PyQt5.QtWidgets import *
class WindowPattern(QMainWindow):
def __init__(self):
super().__init__()
self.resize(500,260)
self.setWindowTitle('设置窗口的样式')
#设置窗口的样式 (hint暗示,示意)
self.setWindowFlags(Qt.WindowMaximizeButtonHint | Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)#显示最大化按钮,窗口永远在最前端且无边框
#设置窗口的名字
self.setObjectName("MainWindow")
#背景图,后面会讲,设置语法类似CSS
self.setStyleSheet("#MainWindow{border-image:url(../picture/fairy.jpg);}")
if __name__ == "__main__":
app = QApplication(sys.argv)
form = WindowPattern()
form.show()
sys.exit(app.exec_())
运行结果:
三.用代码设置窗口的最大化和最小化
代码:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
### 自定义窗口类
class WindowMaxMin(QWidget):
# 构造函数
def __init__(self, parent=None):
'''构造函数'''
# 调用父类构造函数
super(WindowMaxMin, self).__init__(parent)
self.resize(300,400)
self.setWindowTitle("用代码控制窗口的最大化和最小化")
self.setWindowFlags(Qt.WindowMaximizeButtonHint)
layout = QVBoxLayout()
maxButton1 = QPushButton()
maxButton1.setText('窗口最大化1')
maxButton1.clicked.connect(self.maximized1)
maxButton2 = QPushButton()
maxButton2.setText('窗口最大化2')
maxButton2.clicked.connect(self.showMaximized)
minButton = QPushButton()
minButton.setText('窗口最小化')
minButton.clicked.connect(self.showMinimized)
layout.addWidget(maxButton1)
layout.addWidget(maxButton2)
layout.addWidget(minButton)
self.setLayout(layout)
def maximized1(self):
#获得桌面
desktop = QApplication.desktop()
# 获取桌面可用尺寸
rect = desktop.availableGeometry()
self.setGeometry(rect)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = WindowMaxMin()
window.show()
# 应用程序事件循环
sys.exit(app.exec_())
运行结果:
自己试一试吧!
四.项目实战:实现绘图应用
需要解决3个核心内容
1. 如何绘图
在paintEvent方法中绘图,通过调用update方法触发painEvent的调用
2. 在哪里绘图
在白色背景的QPixmap对象中绘图
3. 如何通过移动鼠标进行绘图
鼠标拥有3个事件:
(1)鼠标按下:mousePressEvent
(2)鼠标移动:mouseMoveEvent
(3)鼠标抬起:mouseReleaseEvent
代码:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QPixmap
from PyQt5.QtCore import Qt, QPoint
class Drawing(QWidget):
def __init__(self, parent=None):
super(Drawing, self).__init__(parent)
self.setWindowTitle("绘图应用")
self.pix = QPixmap()
self.lastPoint = QPoint()
self.endPoint = QPoint()
self.initUi()
def initUi(self):
self.resize(600, 600)
'''
QPixmap 类用于绘图设备的图像显示,可作为一个 QPaintDevice 对象,也可以加载到一个控件中。
QPixmap 可以读取的图像文件类型有:BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM 等。
'''
# 画布大小为600*600,背景为白色
self.pix = QPixmap(600, 600)
self.pix.fill(Qt.white)
#下面的方法都是自动调用的
def paintEvent(self, event):
#画笔
pp = QPainter(self.pix)
# 根据鼠标指针前后两个位置绘制直线
pp.drawLine(self.lastPoint, self.endPoint)
# 让前一个坐标值等于后一个坐标值,
# 这样就能实现画出连续的线
self.lastPoint = self.endPoint
painter = QPainter(self)
#pixmap (n.)像素映射,象图
#即先画在QPixmap上,再从图像文件中提取 Pixmap 并将其显示在指定位置
painter.drawPixmap(0,0,self.pix)
#鼠标按下
def mousePressEvent(self, event):
#如果鼠标左键按下
if event.button() == Qt.LeftButton:
# 获得当前坐标
self.lastPoint = event.pos()
#鼠标移动
def mouseMoveEvent(self, event):
#如果鼠标左键一直按着
if event.buttons() and Qt.LeftButton:
self.endPoint = event.pos()
self.update()#触发paintEvent
# 鼠标抬起
def mouseReleaseEvent(self, event):
# 鼠标左键释放
if event.button() == Qt.LeftButton:
self.endPoint = event.pos()
# 进行重新绘制
self.update()#每次调用paintEvent都会重新触发一次
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Drawing()
form.show()
sys.exit(app.exec_())
运行结果:
随手画的,献丑了。
五.创建透明和半透明窗口
代码:
from PyQt5.Qt import *
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
win = QMainWindow()
win.setWindowTitle('窗口的透明度设置')
# 0到1,1表示不透明,0表示完全透明
win.setWindowOpacity(0.6)
button = QPushButton('我的按钮',win)
win.resize(400,200)
win.show()
sys.exit(app.exec())
运行结果:
因为透明,可以看到窗口后面的代码。