62 lines
2.1 KiB
Python
Raw Normal View History

2022-06-08 17:43:21 +08:00
import sys
from pprint import pprint
2022-06-14 23:27:53 +08:00
from PySide6 import QtGui, QtWidgets
2022-06-08 17:43:21 +08:00
"""
QWidget 提供了多种API来获取访问其父子控件
.setParent() 指定本控件的父控件
.parentWidget() 获取父控件
.children() 获取所有子控件返回一个列表
.childAt() 获取在指定坐标的子控件
.childrenRect() 所有子控件被隐藏的除外构成的矩形
.childrenRegion() 所有子控件被隐藏的除外构成的范围
"""
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QWidget-父子关系")
self.resize(400, 300)
self.setup_ui()
self.test_01()
self.test_02()
def setup_ui(self) -> None:
"""设置界面"""
self.button = QtWidgets.QPushButton("点击我!", self)
self.button.clicked.connect(lambda: print("按钮被点击了")) # type: ignore
2022-06-08 17:43:21 +08:00
self.button.move(50, 200)
self.label_1 = QtWidgets.QLabel("PySide", self)
self.label_1.move(150, 50)
self.label_2 = QtWidgets.QLabel() # 创建时未指定父控件
self.label_2.setPixmap(QtGui.QPixmap("../../Resources/Icons/Python_128px.png"))
2022-06-08 17:43:21 +08:00
self.label_2.setParent(self) # 指定父控件
def test_01(self) -> None:
"""测试访问子控件功能"""
pprint(self.children()) # 打印所有子控件,以列表返回,顺序同添加顺序
# 获取处于制定坐标的子控件
# 注意若该坐标无子控件则返回None、似乎对布局管理器无效
print(self.childAt(150, 55))
# 以上方法返回的子控件都可以被操作
self.childAt(150, 55).setStyleSheet("background-color: cyan;")
print(self.childrenRect()) # 打印所有子控件(被隐藏的除外)构成的矩形
print(self.childrenRegion())
def test_02(self) -> None:
"""测试访问父控件功能"""
print(self.label_2.parentWidget())
if __name__ == "__main__":
app = QtWidgets.QApplication([])
window = MyWidget()
window.show()
sys.exit(app.exec())