首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMdiArea,停止子窗口离开区域

QMdiArea,停止子窗口离开区域
EN

Stack Overflow用户
提问于 2022-04-18 23:05:37
回答 1查看 54关注 0票数 1

是否有可能避免部分遮挡子窗口的影响?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-19 00:00:08

QMdiArea会在任何新的QMdiSubWindow上自动安装它的事件过滤器,这样您就可以覆盖eventFilter(),检查几何图形更改,并确保几何图形总是在视图矩形内。

在下面的示例中,我创建了一个帮助函数来执行此操作,只要mdi区域的大小调整,也可以调用该函数,以确保即使将该区域的大小调整到可能隐藏窗口的大小,也始终可以看到窗口。

代码语言:javascript
复制
class MdiFixBoundaries(QtWidgets.QMdiArea):
    def fixGeometry(self, window, viewGeo):
        winGeo = window.geometry()
        if not viewGeo.contains(winGeo):
            if winGeo.right() > viewGeo.right():
                winGeo.moveRight(viewGeo.right())
            if winGeo.x() < 0:
                winGeo.moveLeft(0)

            if winGeo.bottom() > viewGeo.bottom():
                winGeo.moveBottom(viewGeo.bottom())
            if winGeo.y() < 0:
                winGeo.moveTop(0)
            if winGeo != window.geometry():
                window.setGeometry(winGeo)
                return True
        return False

    def eventFilter(self, obj, event):
        if (event.type() == event.Move and 
            isinstance(obj, QtWidgets.QMdiSubWindow) and
            self.fixGeometry(obj, self.viewport().geometry())):
                return True
        return super().eventFilter(obj, event)

    def resizeEvent(self, event):
        super().resizeEvent(event)
        viewGeo = self.viewport().geometry()
        for win in self.subWindowList():
            self.fixGeometry(win, viewGeo)


app = QtWidgets.QApplication([])
mdi = MdiFixBoundaries()
for i in range(3):
    test = mdi.addSubWindow(QtWidgets.QWidget())
    test.resize(320, 240)
mdi.show()
app.exec()

注意:必须保留iffixGeometry()中,没有任何elif,按照这个顺序,如果窗口的大小大于视图端口,您将面临递归风险。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71917926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档