【问题标题】:How to get the intersection of geometry of two QWidgets with different parents?如何获得具有不同父级的两个 QWidget 的几何交集?
【发布时间】:2012-05-21 11:33:32
【问题描述】:

使用 Qt4(这里使用 PyQt4)来获取两个 QWidget 的交集区域——这对于 QRubberband 在进行选择时特别有用——只需这样做:

intersection = rubberband.geometry().intersected(mydocumentwidget.geometry())

现在假设rubberbandmydocumentwidget 具有相同的父小部件,即更准确地说,它们的坐标相对于同一原点。这是因为方法调用是QRect.intersected(),而QRect本身没有父对象,它是一个简单的元组,有4个整数和一些方法调用。

现在在我的情况下,rubberbandmydocumentwidget 具有相同的父级,但我对橡皮筋与 mydocument 的子级(即文档的页面)的交叉感兴趣。 然而,页面会将它们的坐标参考到屏幕上的不同点。

如何计算橡皮筋和我的页面小部件之间的交集?有没有办法将坐标转换为引用父母的父母?我当然可以自己写下数学,但我认为它不是很干净。 Qt4 是否提供任何方法来自动转换它?

【问题讨论】:

    标签: python qt4 pyqt


    【解决方案1】:

    您可以做的是将 QRect 的点映射到父窗口小部件。您可以将 QPoints 映射到各种目标(父、其他、全局),但由于您特别想映射到 mydocumentwidget,因此您可以这样做:

    doc_child = getChildOfDocument() # pseudo
    rect = doc_child.geometry()
    
    mappedPoint = doc_child.mapToParent(rect.topleft())
    # alternative #
    # mappedPoint = doc_child.mapTo(mydocumentwidget, rect.topleft()) 
    
    mappedRect = QtCore.QRect(mappedPoint, rect.size())
    intersection = rubberband.geometry().intersected(mappedRect)
    

    【讨论】:

    • 谢谢,所以我可以在这个 mapToParent() 中传递任何小部件?这很酷。如果有像 QWidget.globalGeometry() 这样的简单方法来获取全局几何体,参考主窗口的原点,那就太好了。
    • @Benjamin:mapTo(other, aPoint) 适用于任何小部件。 mapToParent(aPoint) 将给定点映射到此小部件父级(如果没有,则为全局)。还有QWidget.mapToGlobal(aPoint)。但请记住,全局并不意味着主窗口。全局表示应用程序中的最高根(可能是屏幕坐标)。主窗口只是另一个 QWidget。此外,没有专门针对 QRect 的映射的原因是不需要映射大小。只是点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2011-09-10
    • 2014-10-18
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多