首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QMdiArea中打开和关闭QMdiArea In PyQt5?

如何在QMdiArea中打开和关闭QMdiArea In PyQt5?
EN

Stack Overflow用户
提问于 2021-05-21 16:17:02
回答 1查看 640关注 0票数 0

在QMidArea中如何打开一个SubWindow?我的节目如下。我打算在SubWindow中打开/附加我的第二个程序。但什么都不会发生。只能看到空白窗口。如何解决这个问题?

如何将我的文件附加到QMdi子窗口中?工作结束后,如何正确关闭子窗口?

主程序

代码语言:javascript
复制
import sys,os
from PyQt5.QtWidgets import *
from sample_countrypage import Countrypage

class MainPage(QMainWindow):
    def __init__(self):
        super().__init__()
        self.mdi = QMdiArea()
        self.setWindowTitle(" Sample Programme")
        self.setGeometry(100,100,1600,600)
        self.Ui()
        self.show()

    def Ui(self):
        self.btn1=QPushButton("Country")
        self.btn1.setFixedSize(100, 30)
        self.btn1.clicked.connect(self.countrypage)

        self.left_layout = QVBoxLayout()
        self.main_layout = QHBoxLayout()

        self.left_layout.setContentsMargins(3,5,5,3)
        self.left_layout.addWidget(self.btn1)
        self.left_layout.addStretch()

        self.main_layout.setSpacing(5)
        self.main_layout.setContentsMargins(0,0,0,0)
        self.main_layout.addLayout(self.left_layout)
        self.main_layout.addStretch()
        self.setLayout(self.main_layout)

        widget = QWidget()
        widget.setLayout(self.main_layout)
        self.setCentralWidget(widget)

    def countrypage(self):
        print("country page")
        self.countrywindow = Countrypage()
        subwindow = QMdiSubWindow()
        subwindow.setWidget(self.countrywindow)
        self.mdi.addSubWindow(subwindow)
        # subwindow.setFixedSize(500,500)
        subwindow.show()
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainwindow = MainPage()
    app.setStyle("fusion")
    mainwindow.show()
    sys.exit(app.exec_())

第二程序

代码语言:javascript
复制
import sys,os
from PyQt5.QtWidgets import *

class Countrypage(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Country Page")

        self.btn1 = QPushButton("Accept")
        self.btn1.clicked.connect(self.result)
        self.btn2 = QPushButton("Re Enter")

        self.form_layout = QFormLayout()
        self.form_layout.addRow("Country",QLineEdit())
        self.form_layout.addRow("continent",QLineEdit())

        self.layout_btn = QHBoxLayout()
        self.layout_btn.addStretch()
        self.layout_btn.addWidget(self.btn1)
        self.layout_btn.addWidget(self.btn2)

        self.layout_country = QVBoxLayout()
        self.layout_country.addLayout(self.form_layout)
        self.layout_country.addLayout(self.layout_btn)
        self.layout_country.addStretch()

        self.setLayout(self.layout_country)

    def result(self):
        print("bye")
        exec .close()

if __name__=="__main__":
    app = QApplication(sys.argv)
    countrywin = Countrypage()
    countrywin.show()
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-22 18:52:56

首先,您的代码有两个主要问题:

您从未将mdi区域添加到主布局中(您还尝试为forbidden);

  • exec设置布局,即forbidden);

  • exec是python内置的,并且没有close属性;如果要关闭小部件,则必须调用self.close();

然后,setWidget()方法的QMdiSubWindow重新父母小部件:

QMdiSubWindow暂时拥有小部件;

这意味着,如果您想关闭包含来自该小部件的小部件的子窗口,您必须检查父窗口并最终关闭它,只要您验证它是QMdiSubWindow的一个实例。

代码语言:javascript
复制
class Countrypage(QWidget):
    # ...
    def result(self):
        print("bye")
        # ensure that the parent is actually a subwindow
        if isinstance(self.parent(), QMdiSubWindow):
            self.parent().close()
        else:
            self.close()

或者,您可以使用自定义信号并在创建子窗口时连接该信号。

代码语言:javascript
复制
class Countrypage(QWidget):
    closeRequested = pyqtSignal()
    # ...
    def result(self):
        print("bye")
        self.closeRequested.emit()


class MainPage(QMainWindow):
    # ...
    def countrypage(self):
        print("country page")
        self.countrywindow = Countrypage()
        subwindow = QMdiSubWindow()
        subwindow.setWidget(self.countrywindow)
        self.mdi.addSubWindow(subwindow)
        subwindow.show()
        self.countrywindow.closerequested.connect(subwindow.close)

如果您想从mdi区域(或它的外部)关闭活动子窗口,并且不管该子窗口是什么,只需调用self.mdi.closeActiveSubWindow()

注意,如果要创建多个Countrypage实例,就没有必要创建一个实例属性(self.countrywindow),因为一旦创建另一个实例,它总是会被覆盖。将小部件添加到子窗口中,将该子窗口添加到mdi区域将自动创建一个持久引用(由于养育);如果您需要对现有页面进行python引用,则在__init__中创建一个作为实例成员的列表(例如。self.pages = [])并将新实例添加到该列表中。

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

https://stackoverflow.com/questions/67640516

复制
相关文章

相似问题

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