在QMidArea中如何打开一个SubWindow?我的节目如下。我打算在SubWindow中打开/附加我的第二个程序。但什么都不会发生。只能看到空白窗口。如何解决这个问题?
如何将我的文件附加到QMdi子窗口中?工作结束后,如何正确关闭子窗口?
主程序
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_())第二程序
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_())发布于 2021-05-22 18:52:56
首先,您的代码有两个主要问题:
您从未将mdi区域添加到主布局中(您还尝试为forbidden);
exec设置布局,即forbidden);
exec是python内置的,并且没有close属性;如果要关闭小部件,则必须调用self.close();。
然后,setWidget()方法的QMdiSubWindow重新父母小部件:
QMdiSubWindow暂时拥有小部件;
这意味着,如果您想关闭包含来自该小部件的小部件的子窗口,您必须检查父窗口并最终关闭它,只要您验证它是QMdiSubWindow的一个实例。
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()或者,您可以使用自定义信号并在创建子窗口时连接该信号。
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 = [])并将新实例添加到该列表中。
https://stackoverflow.com/questions/67640516
复制相似问题