• PyQt5快速开发与实战 8.1 窗口风格


    PyQt5快速开发与实战

    8. 第8章 PyQt5 图形和特效

    定制窗口样式,以实现统一的窗口风格和美化窗口界面。

    8.1 窗口风格

    8.1.1 设置窗口风格
    • 可以为每个Widget设置风格

      setStyle(QStyle style)
      
      • 1
    • 获得当前平台支持的原有的QStyle样式

      QStyleFacTory.keys()
      
      • 1
    • 对QApplication设置QStyle样式

      QApplication.setStyle(QStyleFactory.create("WindowsXP"))
      
      • 1

    案例——设置窗口风格

    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import *
    from PyQt5 import QtCore
    from PyQt5.QtGui import *
    
    class AppWidget(QWidget):
        def __init__(self,parent = None):
            super(AppWidget, self).__init__(parent)
            horizontalLayout = QHBoxLayout()
            self.styleLabel = QLabel("设置样式:")
            self.styleComboBox = QComboBox()
            self.styleComboBox.addItems(QStyleFactory.keys())
    
            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__':
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        app = QApplication(sys.argv)
        win = AppWidget()
        win.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    8.1.2 设置窗口样式

    PyQt 使用setWindowFlags(Qt.WindowFlags)函数设置窗口样式,其具体参数如下:

    1. 基本窗口类型
      • Qt.Widget,默认窗口,有最小化、最大化、关闭按钮。
      • Qt.Window,普通窗口,有最小化、最大化、关闭按钮。
      • Qt.Dialog,对话框窗口,有问号和关闭按钮。
      • Qt.Popup,弹出窗口,窗口无边框。
      • Qt.ToolTip,提示窗口,窗口无边框,无任务栏。
      • Qt.SplashScreen,闪屏,窗口无边框,无任务栏。
      • Qt.SubWindow,子窗口,窗口无按钮,但有标题。
    2. 自定义顶层窗口外观标志
      • Qt .MSWindowsFixedsizeDialogHint #窗口无法调整大小
      • Qt .FramelessWindowHint #窗口无边框
      • Qt.CustomizewindowHint #有边框但无标题栏和按钮,不能移动和拖动
      • Qt.WindowTitleHint #添加标题栏和一个关闭按钮
      • Qt.windowSystemMenuHint #添加系统目录和一个关闭按钮
      • Qt.windowMaximizeButtonHint #激活最大化和关闭按钮,禁止最小化按钮
      • Qt.windowMinimizeButtonHint #激活最小化和关闭按钮,禁止最大化按钮
      • Qt.windowMinMaxButtonsHint # 激活最小化、最大化和关闭按钮,相当于Qt.windowMaximizeButtonBintl Qt.WindowMinimizeBute
      • Qt.windowCloseButtonHint #添加一个关闭按钮
      • Qt.windowContextHelpButtonHint # 添加问号和关闭按钮,像对话框一样
      • Qt.windowStaysonTopHint # 窗口始终处于顶层位置
      • Qt.windowStays0nBottomHint # 窗口始终处于底层位置

    案例——使用setWindowFlags函数

    from PyQt5.QtCore import Qt
    import sys
    from PyQt5.QtWidgets import QMainWindow , QApplication
    
    class MainWindow(QMainWindow):
        def __init__(self,parent = None):
            super(MainWindow, self).__init__(parent)
            self.resize(400 , 200)
            self.setWindowTitle("设置窗口样式案例")
    
            self.setWindowFlags(Qt.FramelessWindowHint)
            self.setObjectName("MainWindow")
            self.setStyleSheet("#MainWindow{border-image:url(images/python.jpg);}")
    
    if __name__ == '__main__':
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        app = QApplication(sys.argv)
        win = MainWindow()
        win.show()
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    8.1.3 使用自定义的无边框窗口

    随着互联网的发展,越来越多的软件在初始化时,采用在用户的显示屏幕中全屏展开的形式。在接下来的例子中,开发一个自定义的无边框窗口,它可以占用100%的用户显示屏幕。

    1. 设置窗口标志,实现无边框效果

      self.setWindowFlags(Qt.FramelessWindowHint)
      
      • 1
    2. 覆盖实现最大化函数

      首先,应得到屏幕可显示尺寸,需要用到QDeskWidget类的availableGeometry()函数。

      desktop = QApplication.desktop()
      rect = desktop.availableGeometry()
      
      • 1
      • 2
    3. 设置窗口尺寸为屏幕可显示尺寸并显示

      self.setGeometry(rect)
      self.show()
      
      • 1
      • 2

    案例——全屏显示

    import sys
    from PyQt5.QtWidgets import QMainWindow, QApplication
    from PyQt5.QtCore import Qt
    
    
    ### 自定义窗口类
    class MyWindow(QMainWindow):
        '''自定义窗口类'''
    
        ###  构造函数
        def __init__(self, parent=None):
            '''构造函数'''
            # 调用父类构造函数
            super(MyWindow, self).__init__(parent)
    
            # 设置窗口标记(无边框 )
            self.setWindowFlags(Qt.FramelessWindowHint)
    
            # 便于显示,设置窗口背景颜色(采用QSS)
            self.setStyleSheet('''background-color:red; ''')
    
        ###覆盖函数
        def showMaximized(self):
            '''最大化'''
            # 得到桌面控件
            desktop = QApplication.desktop()
            # 得到屏幕可显示尺寸
            rect = desktop.availableGeometry()
            # 设置窗口尺寸
            self.setGeometry(rect)
            # 设置窗口显示
            self.show()
    
    
    ###  主函数
    if __name__ == "__main__":
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
        '''主函数'''
        # 声明变量
        app = QApplication(sys.argv)
        # 创建窗口
        window = MyWindow()
        # 调用最大化显示
        window.showMaximized()
        # 应用程序事件循环
        sys.exit(app.exec_())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    在这里插入图片描述

  • 相关阅读:
    linux高性能服务器
    Codeforces Beta Round 5
    为mysql添加TCMalloc库,以提升性能!
    智能驾驶汽车虚拟仿真视频数据理解(一)
    如何看待unity新的收费模式
    b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
    termux安装docker
    STM32人脸识别系统设计(程序代码+论文)
    JavaWeb认识+介绍
    7、Instant-ngp
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126067300