Introducción a la ventana PyQt5 (veintitrés), dibujo y efectos especiales

Tabla de contenido

1. Establece el estilo de los controles en la ventana.

2. Establecer el estilo de la ventana

Tres. Utilice el código para configurar la ventana para maximizar y minimizar

4. Proyecto de combate real: realizar la aplicación de dibujo.

Cinco. Crea ventanas transparentes y semitransparentes


1. Establece el estilo de los controles en la ventana.

Código:

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

resultado de la operación:

Verás que el estilo del espacio cambiará.

 

2. Establecer el estilo de la ventana

setWindowFlags (tipo Qt :: WindowFlags)
Qt :: FrameWindowHint: una ventana bai sin borde du
Qt :: WindowStaysOnTopHint: // siempre en la parte superior de la ventana
Qt :: CustomizeWindowHint: // personaliza la barra de título de la ventana, la siguiente marca Debe usarse junto con este indicador para que sea válido; de lo contrario, la ventana tendrá una barra de título predeterminada
Qt :: WindowTitleHint: mostrar la barra de título de la ventana
Qt :: WindowSystemMenuHint: // mostrar el menú del sistema
Qt :: WindowMinimizeButtonHint: // mostrar el botón minimizar
Qt :: WindowMaximizeButtonHint: // mostrar el botón maximizar
Qt :: WindowMinMaxButtonsHint: // mostrar el botón minimizar y maximizar el botón
Qt :: WindowCloseButtonHint: // mostrar el botón cerrar
setWindowFlags (Qt :: FramelessWindowHint); ocultarlo directamente

Código:

'''
设置窗口样式(主要是窗口边框、标题栏以及窗口本身的样式)
'''

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

resultado de la operación:

 

Tres. Utilice el código para configurar la ventana para maximizar y minimizar

Código:

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

resultado de la operación:

¡Inténtalo tú mismo!

 

4. Proyecto de combate real: realizar la aplicación de dibujo.

Necesito resolver 3 contenidos básicos
1. Cómo dibujar

Dibujando en el método paintEvent, active la llamada de painEvent llamando al método de actualización

2. Dónde dibujar

Dibuje el objeto QPixmap sobre un fondo blanco

3. Cómo dibujar moviendo el mouse

El mouse tiene 3 eventos:
(1) Pulsación del mouse: mousePressEvent
(2) Movimiento del mouse: mouseMoveEvent
(3) Mouse hacia arriba: mouseReleaseEvent

 

Código:

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


resultado de la operación:

Lo dibujé fácilmente, mostrando mi fealdad.

 

Cinco. Crea ventanas transparentes y semitransparentes

Código:

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

resultado de la operación:

Debido a que es transparente, puede ver el código detrás de la ventana.

Supongo que te gusta

Origin blog.csdn.net/weixin_44593822/article/details/113819077
Recomendado
Clasificación