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

发布于 2022-04-19 00:00:08
QMdiArea会在任何新的QMdiSubWindow上自动安装它的事件过滤器,这样您就可以覆盖eventFilter(),检查几何图形更改,并确保几何图形总是在视图矩形内。
在下面的示例中,我创建了一个帮助函数来执行此操作,只要mdi区域的大小调整,也可以调用该函数,以确保即使将该区域的大小调整到可能隐藏窗口的大小,也始终可以看到窗口。
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()注意:必须保留if在fixGeometry()中,没有任何elif,按照这个顺序,如果窗口的大小大于视图端口,您将面临递归风险。
https://stackoverflow.com/questions/71917926
复制相似问题