020.PyQt5_QWidget_层级控制

层级控制

  • 说明
    • 层级控制:调整控件Z轴的顺序(设置控件最顶层、最底层、哪个控件在哪个控件下面)
    • 系统默认后添加的控件在上层
  • 层级控制API
    控件.lower()             # 将控件降低到最底层
    控件.raise_()             # 将控件提升到最上层
    a.stackUnder(b)          # 设置a控件放在b控件下面
    
  • 示例代码
    from PyQt5.Qt import *
    import sys
    
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(500, 500)
    window.setWindowTitle('控件层级控制')
    
    label1 = QLabel(window)
    label1.setText('标签1')
    label1.resize(200, 200)
    label1.setStyleSheet('background-color: red;font-size:40px;')
    
    label2 = QLabel(window)
    label2.setText('标签1')
    label2.resize(200, 200)
    label2.move(100, 100)
    label2.setStyleSheet('background-color: green;font-size:40px;')
    
    # 设置label2降低为最底层
    # label2.lower()
    
    # 设置label1提升为最上层
    # label1.raise_()
    
    # 设置label2放在label1下面
    label2.stackUnder(label1)
    
    
    window.show()
    sys.exit(app.exec_())
    

  • 案例:创建一个窗口,有两个label控件,部分区域重叠,设置鼠标点击哪个标签,哪个标签就显示在上层
  • 方法一:通过子控件的鼠标点击事件设置
    from PyQt5.Qt import *
    import sys
    
    
    class MyLabel(QLabel):
        def mousePressEvent(self, ev: QMouseEvent) -> None:
            self.raise_()
    
    
    app = QApplication(sys.argv)
    window = QWidget()
    window.resize(500, 500)
    window.setWindowTitle('控件层级控制')
    
    label1 = MyLabel(window)
    label1.setText('标签1')
    label1.resize(200, 200)
    label1.setStyleSheet('background-color: red;font-size:40px;')
    
    label2 = MyLabel(window)
    label2.setText('标签1')
    label2.resize(200, 200)
    label2.move(100, 100)
    label2.setStyleSheet('background-color: green;font-size:40px;')
    
    window.show()
    sys.exit(app.exec_())
    
    • 缺点:当子控件多的时候,需要替换所有子控件的类
  • 方法二:通过父控件获取子控件的方式设置
    from PyQt5.Qt import *
    import sys
    
    
    class MyWidget(QWidget):
        def mousePressEvent(self, ev: QMouseEvent) -> None:
            mouse_x = ev.x()
            mouse_y = ev.y()
            lab = self.childAt(mouse_x, mouse_y)
            if lab is not None:
                lab.raise_()
    
    app = QApplication(sys.argv)
    window = MyWidget()
    window.resize(500, 500)
    window.setWindowTitle('控件层级控制')
    
    label1 = QLabel(window)
    label1.setText('标签1')
    label1.resize(200, 200)
    label1.setStyleSheet('background-color: red;font-size:40px;')
    
    label2 = QLabel(window)
    label2.setText('标签1')
    label2.resize(200, 200)
    label2.move(100, 100)
    label2.setStyleSheet('background-color: green;font-size:40px;')
    
    window.show()
    sys.exit(app.exec_())
    
    • 通过这种方式,只需要修改父控件的类
  • 案例3:创建一个窗口,有两个label控件,部分区域重叠,当鼠标移动到哪个标签上,哪个标签就显示在上层
  • 知识点:
    • 控件开启鼠标跟踪
    • 控件捕获鼠标事件
    • 鼠标移动事件
    • 控件层级控制
    from PyQt5.Qt import *
    import sys
    
    
    class MyWidget(QWidget):
        def mouseMoveEvent(self, ev: QMouseEvent) -> None:
            mouse_x = ev.x()
            mouse_y = ev.y()
            lab = self.childAt(mouse_x, mouse_y)
            if lab is not None:
                lab.raise_()
    
    app = QApplication(sys.argv)
    window = MyWidget()
    window.resize(500, 500)
    window.setWindowTitle('控件层级控制')
    # 设置窗口开启鼠标跟踪
    window.setMouseTracking(True)
    # 设置窗口捕获鼠标事件
    window.grabMouse()
    
    label1 = QLabel(window)
    label1.setText('标签1')
    label1.resize(200, 200)
    label1.setStyleSheet('background-color: red;font-size:40px;')
    
    label2 = QLabel(window)
    label2.setText('标签1')
    label2.resize(200, 200)
    label2.move(100, 100)
    label2.setStyleSheet('background-color: green;font-size:40px;')
    
    window.show()
    sys.exit(app.exec_())

你可能感兴趣的:(PyQt5,qt,python,pyqt,qt5,ui)