📜  PyQt5 QSpinBox – 获取子区域的矩形(1)

📅  最后修改于: 2023-12-03 14:45:50.031000             🧑  作者: Mango

PyQt5 QSpinBox – 获取子区域的矩形

在 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 中获取子控件的矩形。