PyQt5入门(二十三)窗口,绘图与特效

目录

一.设置窗口中控件的风格

二.设置窗口样式

三.用代码设置窗口的最大化和最小化

四.项目实战:实现绘图应用

五.创建透明和半透明窗口


一.设置窗口中控件的风格

代码:

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())

运行结果:

因为透明,可以看到窗口后面的代码。

猜你喜欢

转载自blog.csdn.net/weixin_44593822/article/details/113819077