childAt(x, y)
- 作用:获取在指定坐标的子控件
- 说明:如在一个窗口上有多个子标签,对该窗口使用 childAt(x, y) 方法即可获取在该处坐标的子控件;当该处无子控件时,返回None
parentWidget()
childrenRect()
- 作用:获取该控件的所有子控件组成的边界矩形,返回四个边角的坐标
应用实例
- 要求:在一窗口上有多个标签,要求在不重写 QLabel 子类的情况下,点击标签时可以使标签背景颜色改变
- 分析:
- 要求不能重写子控件的类,那么需要使用上文提到的子控件操作的方法
- 鼠标点击时会触发鼠标点击事件,当点击在父控件上触发父控件的鼠标点击事件;当点击在子控件上,由于子控件的鼠标点击事件没有重写,将会将鼠标点击事件传递到父控件的鼠标点击事件
- 所以只需要重写父控件的鼠标点击事件函数,获取该函数触发时的鼠标位置,尝试查找该处鼠标位置的子控件(childAt(x, y)),不为 None 时即为点击到了子控件,此时改变该处子控件颜色即可
- 代码:
import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
class Window(QWidget):
def mousePressEvent(self, evt) -> None:
print("鼠标点击")
print(evt)
print(self.childAt(evt.x(), evt.y()))
if self.childAt(evt.x(), evt.y()) is not None:
subWidget = self.childAt(evt.x(), evt.y())
subWidget.setStyleSheet("background-color:blue")
window = Window()
window.setWindowTitle("子控件操作")
window.resize(500, 500)
window.move(400, 200)
for i in range(10):
label = QLabel(window)
label.setText("标签{:}".format(i))
label.move(40*i, 40*i)
window.show()
sys.exit(app.exec_())