• PyQt5快速开发与实战 4.2 QWidget


    PyQt5快速开发与实战

    4. 第4章 PyQt5 基本窗口控件

    4.2 QWidget

    基础窗口控件 QWidget类是所有用户界面对象的基类,所有的窗口和控件都直接或间接继承自QWidget类。

    窗口控件(Widget,简称“控件”是在PyQt中建立界面的主要元素。在 PyQt中把没有嵌入到其他控件中的控件称为窗口,一般窗口都有边框、标题栏。窗口是指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、最大化按钮等;控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的基本元素。一个程序可以有多个窗口,一个窗口也可以有多个控件。

    4.2.1 窗口坐标系统

    PyQt使用统一的坐标系统来定位窗口控件的位置和大小。

    • 顶层窗口:

      以屏幕的左上角为原点(0,0),从左向右为x轴正向,从上向下为y轴正向,整个屏幕的坐标系统用来定位顶层窗口。

    • 窗口内部:

      以左上角作为原点,从左向右为x轴正向,从上向下为y轴正向,原点、x轴、y轴围成的区域叫作Client Area(客户区),在客户区周围则是标题栏(Window Title)和边框(Frame)。

    img

    QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得客户区的宽度和高度。

    QWidget的 geometry()提供的成员函数:x()、y())获得客户区左上角的坐标,width()、height()获得客户区的宽度和高度。

    QWidget的 frameGeometry()提供的成员函数: x()、y()获得窗口左上角的坐标,width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。

    4.2.2 常用的几何结构

    两种常用的几何结构:

    • 不包含外边各种边框的几何结构
    • 包含外边各种边框的几何结构
    1. QWidget不包含边框的常用函数

    一般情况下,不包含边框的部分是客户区,这里面就是正常操作的地方,可以添加子控件。这部分是一个长方形,会有大小和位置。大小就是指宽度(width)和高度(height);位置就是指这个长方形在屏幕上的位置。在Qt中保存这个长方形使用的是QRect类,这个类也有自己的大小和位置。要改变其大小和位置,可以使用如下几个函数。

    • 改变客户区的面积

      QWidget.resize(width, height)
      QWidget.resize(Qsize)
      
      • 1
      • 2

      也可以用鼠标来改变它的大小

    • 获得客户区的大小

      QWidget.size()
      
      • 1
    • 获得客户区的宽度和高度

      QWidget.width()
      QWidget.height()
      
      • 1
      • 2
    • 设置客户区的宽度和高度

      QWidget.setFixedWidth(int width) # 高度固定
      
      • 1
      QWidget.setFixedHeight(int height) # 宽度固定
      
      • 1
      QWidget.setFixedSize(Qsize size)
      QWidget.setFixedsize(int width, int height) # 高度宽度固定了,不可以通过鼠标来改变窗口的宽度和高度
      
      • 1
      • 2

      同时改变客户区的大小和位置

      QWidget.setGeometry(int x, int y, int width, int height);
      QWidget.setGeometry(QRect rect)
      
      • 1
      • 2
    1. QWidget包含边框的常用函数

    QWidget包含边框,这个边框有大小和位置,是窗口在屏幕上显示的整个区域。这里没有设置这个边框大小的函数,因为通过上面不包含边框函数的设置,就可以设置包含边框的大小了。通过下面的函数,可以获得整个窗口的位置和大小。

    • 获得窗口的大小和位置

      QWidget.frameGeometry()
      
      • 1
    • 设置窗口的位置

      QWidget.move(int x , int y)
      QWidget.move(QPoint point)
      
      • 1
      • 2
    • 获得窗口左上角的坐标

      QWidget.pos()
      
      • 1

    案例

    from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
    import sys
    
    from pyqt5_plugins.examples.exampleqmlitem import QtCore
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
    app = QApplication(sys.argv)
    widget = QWidget()
    btn = QPushButton(widget)
    
    btn.setText("Button")
    
    # 以QWidget左上角为(0,0)点
    
    btn.move(20, 20)
    
    widget.resize(300 , 200)
    
    # 以屏幕左上角为(0,0)点
    widget.move(250 , 200)
    
    widget.setWindowTitle("PyQt 坐标系统例子")
    widget.show()
    
    print("QWidget:")
    print("w.x() = %d" % widget.x())
    print("w.y() = %d" % widget.y())
    
    print("w.width() = %d" % widget.width())
    print("w.height() = %d" % widget.height())
    
    print("QWidget.geometry")
    print("widget.geometry().x() = %d " % widget.geometry().x())
    print("widget.geometry().y() = %d " % widget.geometry().y())
    
    print("widget.geometry().width() = %d " % widget.geometry().width())
    print("widget.geometry().height() = %d " % widget.geometry().height())
    
    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

    在这里插入图片描述

    4.2.3 创建第一个PyQt5 应用
    # -*- coding:UTF-8 -*-  
    # 上面这行代码是为了避免在所生成的PyQt程序中出现中文乱码问题
    import sys
    from PyQt5.QtWidgets import QApplication,QWidget # 载入必需的模块
    
    from pyqt5_plugins.examples.exampleqmlitem import QtCore
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
    app = QApplication(sys.argv) # 每一个PyQt5程序都需要有一个QApplication对象
    window = QWidget() # 所有用户界面类的父类,这里使用了没有参数的默认构造函数,没有继承其他类,称没有父类的控件为窗口。
    window.resize(300 , 200) # 改变窗口控件的大小
    window.move(250 , 150) # 设置窗口初始化的位置(x , y)
    
    window.setWindowTitle("Hello PyQt5") # 设置窗口控件的标题
    window.show() # 将窗口控件显示在屏幕上
    sys.exit(app.exec_()) # 如果是Python3 下,完全可以写成app.exec() ,【向下兼容】
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    4.2.4 为应用设置程序图标
    import sys
    from PyQt5.QtGui import QIcon
    from PyQt5.QtWidgets import QWidget , QApplication
    
    # 创建一个名为Icon的窗口类,继承自QWidget类
    
    class Icon(QWidget):
        def __init__(self,parent = None):
            super(Icon,  self).__init__(parent) # 必须调用两个构造函数
            self.initUI()
    
        # 初始化窗口
        def initUI(self):
            self.setGeometry( 300 , 300 ,250 , 150)
            self.setWindowTitle("程序图标")
            self.setWindowIcon(QIcon('../打包资源文件/pic/cartoon2.ico'))
    
    if __name__ == '__main__':
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
        app = QApplication(sys.argv)
        icon = Icon()
        icon.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

    在这里插入图片描述

    在这里插入图片描述

    Python同时支持面向过程和面向对象编程,PyQt的精髓是面向对象编程。

    4.2.5 显示气泡提示信息
    import sys
    from PyQt5.QtWidgets import QWidget , QToolTip , QApplication
    from PyQt5.QtGui import QFont
    
    class Winform(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            QToolTip.setFont(QFont('SansSerif',10))
            self.setToolTip('这是一个气泡提示')
            self.setGeometry(200 , 300 ,400 ,400)
            self.setWindowTitle("气泡提示demo")
    
    if __name__ == '__main__':
        from pyqt5_plugins.examples.exampleqmlitem import QtCore
        QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
        app = QApplication(sys.argv)
        win = Winform()
        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

    在这里插入图片描述

    当鼠标悬停于主窗口中时,显示气泡提示。

  • 相关阅读:
    dolphinscheduler
    C#多态的实现
    Servlet生命周期
    C#题库(选择题,填空题,判断题,编程题)
    【HMS Core】Android引入Scan Kit导致System.loadLibrary无法使用该如何解决?
    【图论算法】图的表示与拓补排序
    Redis数据结构:HyperLogLog
    go的日志库logrus
    Transformer和ELMo模型、word2vec、独热编码(one-hot编码)之间的关系
    VUE整合Echarts实现简单的数据可视化
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/126007895