当前位置:   article > 正文

015.PyQt5_QWidget_坐标系统&大小位置_qt 子控件的坐标系是父控件

qt 子控件的坐标系是父控件

控件的坐标系统

  • 左上角为坐标原点,向右为x轴正方向,向下为y轴正方向
  • 子控件位置是参照父控件
  • 顶层控件则参照桌面

大小位置

  • 先了解一下控件的结构:
  • 没有父控件的控件, 称之为窗口。一般会被包装成一个框架

相关API

  • 获取大小和位置的API

    API说明
    x()相对于父控件的x位置,包含窗口框架。
    顶层控件则是相对于桌面的x位置
    y()相对于父控件的y位置,包含窗口框架。
    顶层控件则是相对于桌面的y位置
    pos()x和y的组合,包含窗口框架QPoint(x, y)
    width()控件的宽度,不包含任何窗口框架
    height()控件的高度,不包含任何窗口框架
    size()width和height的组合QSize(width, height)
    geometry()用户区域相对于父控件的位置和尺寸组合QRect(x,y,width,height)
    rect()0,0,width,height的组合Qrect(0,0,width,height)
    frameSize()框架大小
    frameGeometry()框架尺寸
    • 注意:控件显示完毕之后,具体的位置和尺寸数据才会正确
    1. from PyQt5.Qt import *
    2. import sys
    3. app = QApplication(sys.argv)
    4. # 创建一个QWidget控件
    5. w = QWidget()
    6. w.setWindowTitle('WindowTitle')
    7. w.resize(200, 200)
    8. w.move(100, 100)
    9. # geometry获取用户区域到父控件的x、y、width、height
    10. # 控件展示之前,数据不准确
    11. print(w.geometry())
    12. w.show()
    13. # geometry获取用户区域到父控件的x、y、width、height
    14. print(w.geometry())
    15. sys.exit(app.exec_())
    • 输出结果
    1. PyQt5.QtCore.QRect(100, 100, 200, 200)
    2. PyQt5.QtCore.QRect(101, 138, 200, 200)
  • 图解

  • 设置大小和位置的API

    API说明
    move(x, y)设置的是x, y;也就是pos。包括窗口框架
    resize(width, height)设置的是宽和高。不包括窗口框架
    setGeometry(x, y, width, height)同时设置控件用户区域的x、y、width、height。
    顶层控件需要先展示,后设置
    adjustSize()根据内容自适应大小
    setFixedSize()设置固定尺寸大小,不允许拖拉宽度和高度
  • 演示代码

    1. from PyQt5.Qt import *
    2. import sys
    3. app = QApplication(sys.argv)
    4. # 创建一个QWidget控件
    5. w1 = QWidget()
    6. w1.setWindowTitle('WindowTitle1')
    7. w1.move(200100)
    8. w1.resize(500500)
    9. label1 = QLabel(w1)
    10. label1.setText('QLabel1')
    11. label1.move(100,100)
    12. label1.setStyleSheet('background-color: cyan;')
    13. w2 = QWidget()
    14. w2.setWindowTitle('WindowTitle2')
    15. w1.move(200100)
    16. w2.setFixedSize(500500)
    17. label2 = QLabel(w2)
    18. label2.setText('QLabel2')
    19. label2.move(100,100)
    20. label2.setStyleSheet('background-color: red;')
    21. def cao1():
    22.     initial_lab1 = label1.text()
    23.     initial_lab1 = initial_lab1 + 'QLabel1'
    24.     label1.setText(initial_lab1)
    25.     label1.adjustSize()
    26. def cao2():
    27.     initial_lab2 = label2.text()
    28.     initial_lab2 = initial_lab2 + 'QLabel2'
    29.     label2.setText(initial_lab2)
    30. btn1 = QPushButton(w1)
    31. btn1.setText('复制内容')
    32. btn1.clicked.connect(cao1)
    33. btn1.move(100,150)
    34. btn2 = QPushButton(w2)
    35. btn2.setText('复制内容')
    36. btn2.clicked.connect(cao2)
    37. btn2.move(100,150)
    38. w1.show()
    39. w2.show()
    40. sys.exit(app.exec_())

案例

  • 案例1:创建一个窗口, 设置尺寸为500 x 500, 位置为 300, 300
    1. import sys
    2. from PyQt5.Qt import *
    3. app = QApplication(sys.argv)
    4. window1 = QWidget()
    5. # 设置用户区域的位置和大小(写到show()后面能看出来)
    6. window1.setGeometry(300,300, 500, 500)
    7. window2 = QWidget()
    8. window2.resize(500, 500)
    9. # 设置窗体的位置和大小,包含框架
    10. window2.move(300, 300)
    11. window1.show()
    12. window2.show()
    13. sys.exit(app.exec_())
  • 案例2:通过给定的的个数,你负责在一个窗口内创建相应个数的子控件
  • 要求:按照九宫格的布局进行摆放,一行3个
    • 子控件需要在父控件展示(show())之前定义才会跟着父控件一起显示
    • 如果子控件在父控件展示之后才定义,那么子控件需要手动展示(show())
  • 代码
    1. import sys
    2. from PyQt5.Qt import *
    3. app = QApplication(sys.argv)
    4. window = QWidget()
    5. window.resize(500, 500)
    6. window.show()
    7. # 总的控件个数
    8. widget_count = 20
    9. # 一行有多少个控件(列)
    10. column_count = 3
    11. # 总行数
    12. row_count = (widget_count -1 )// column_count + 1
    13. # 一个控件的宽度(要求是个integer整数类型)
    14. widget_width = int(window.width() / column_count)
    15. # 一个控件的高度(要求是个integer整数类型)
    16. widget_height = int(window.height() / row_count)
    17. for i in range(0, widget_count):
    18. win = QWidget(window)
    19. win.resize(widget_width, widget_height)
    20. # 通过控件所在列号*控件宽度,算出x位置(列号是从0开始)
    21. win_x = i % column_count * widget_width
    22. # 通过控件所在行号*控件高度,算出y位置(行号是从0开始)
    23. win_y = i // column_count * widget_height
    24. win.move(win_x, win_y)
    25. win.setStyleSheet('background-color:red;border: 1px solid yellow;')
    26. win.show()
    27. sys.exit(app.exec_())
  • 图解
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/819487
推荐阅读
相关标签
  

闽ICP备14008679号