QMdiArea 离开 window

QMdiArea Leaving the window

是否可以防止在QMdiArea中创建的windows从window向下或向旁边跑出? 就像阻塞一样,向上取出。 目前可以拉出整个window QMdiArea。

编辑: 是否可以检测到 window 碰撞?

不一定是为了防止它重叠,而是它以某种方式被另一个吸引了window。

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    count = 0
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.mdi = QMdiArea()
        self.setCentralWidget(self.mdi)
        bar = self.menuBar()
        file = bar.addMenu("Subwindow")
        file.addAction("window1")
        file.addAction("text1")
        file.addAction("text2")
        file.triggered[QAction].connect(self.click)
        self.setWindowTitle("Multiple window using MDI")

    def click(self, q):
        print("New sub window")
        if q.text() == "window1":
            MainWindow.count = MainWindow.count + 1
            sub = QMdiSubWindow()
            sub.setWidget(QTextEdit())
            sub.setWindowTitle("subwindow" + str(MainWindow.count))
            self.mdi.addSubWindow(sub)
            sub.show()

        if q.text() == "text1":
            self.mdi.cascadeSubWindows()

        if q.text() == "text2":
            self.mdi.tileSubWindows()

def main():
    app = QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

您可以截取 QMdiSubWindow 上的 moveEvent 并根据 QMdiArea 的大小检查 window 的位置。如果超出范围,请将 window 移回范围内。

一个仅检查右边界的示例(您可以从那里轻松实现其余部分)-

class SubWindow(QtWidgets.QMdiSubWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

    def moveEvent(self, event):
        pos = event.pos()
        right = pos.x() + self.width()
        area = self.mdiArea()
        
        if right > area.width():
            self.move(area.width() - self.width(), pos.y())
            return