📅  最后修改于: 2023-12-03 14:45:50.031000             🧑  作者: Mango
在 PyQt5 中,QWidget 类有一个名为 rect()
的函数,可以获取该 widget 相对于其父级的矩形。但是,如果你想要获取 widget 的子控件的矩形,该怎么办呢?
在 PyQt5 中,每个 QWidget 都有一个 childAt(x: int, y: int)
函数,它可用于获取给定位置下的 widget。返回的 widget 是当前 QWidget 对象的子控件。由于 childAt()
函数返回的是相对坐标,因此我们需要将其转换为全局坐标使用。这可以通过 QWidget 的 mapToGlobal(pos: QPoint)
函数实现。最后,我们可以使用 childWidget.rect()
获取子控件的矩形。
下面是一个简单的 PyQt5 示例程序,演示了如何获取子控件的矩形:
import sys
from PyQt5.QtCore import QPoint
from PyQt5.QtWidgets import QApplication, QMainWindow, QSpinBox
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('PyQt5 QSpinBox – 获取子区域的矩形')
self.setGeometry(100, 100, 300, 200)
spin_box = QSpinBox(self)
spin_box.setValue(42)
spin_box.setGeometry(50, 50, 200, 30)
child_widget = spin_box.findChild(QWidget, 'qt_spinbox_lineedit')
child_rect = child_widget.rect()
child_global_pos = child_widget.mapToGlobal(QPoint(child_rect.x(), child_rect.y()))
print(f'子控件的矩形:{child_widget.rect()}')
print(f'子控件的全局坐标:{child_global_pos.x()}, {child_global_pos.y()}')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
在上面的程序中,我们创建了一个 QMainWindow
,并向其添加了一个 QSpinBox
。我们使用 findChild(QWidget, 'qt_spinbox_lineedit')
函数获取该 spin box 的子控件:一个 QLineEdit。然后,我们使用 rect()
函数获取子控件的矩形,并使用 mapToGlobal(pos: QPoint)
函数将其转换为全局坐标。最后,我们打印了子控件的矩形和全局坐标。
运行程序后,你会看到子控件的矩形和全局坐标被打印出来。如果你希望在 GUI 中显示子控件的矩形,你可以在 paintEvent
中使用 QPainter
绘制矩形。
希望本示例能够帮助你在 PyQt5 中获取子控件的矩形。