首页 > 解决方案 > QMdiArea 离开窗口

问题描述

是否可以防止在 QMdiArea 中创建的窗口向下或侧向出窗口?就像阻塞一样,要把它向上拿出来。目前可以拉出 QMdiArea 的整个窗口。

编辑:是否可以检测窗口冲突?

不一定要防止它重叠,而是它以某种方式被另一个窗口吸引。

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()

标签: pythonpython-3.xpyqtpyqt5qmdiarea

解决方案


您可以拦截moveEventonQMdiSubWindow并检查窗口的位置与QMdiArea. 如果超出范围,请将窗口移回范围内。

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

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

推荐阅读