如何从PyQt5中的弹出窗口隐藏主窗口(父窗口)



我有一个主窗口,我从那里调用豁免窗口(弹出窗口(。单击豁免弹出窗口上的确定,我想关闭豁免弹出窗口并隐藏主窗口。我在豁免弹出窗口中包含了self.parent((.hide,但它抛出错误"进程已完成,退出代码为1073741845"。弹出窗口关闭,主窗口突然终止。

waiver_window.py

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QSize, QRect

class popup_on_waiver(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.CustomizeWindowHint)
self.setMinimumSize(QSize(660, 340))
self.setWindowTitle("Waiver")
vbox = QVBoxLayout()
centralWidget = QWidget(self)
self.setCentralWidget(centralWidget)
self.cb = QComboBox(centralWidget)
self.cb.setGeometry(QRect(40, 40, 100, 30))
self.cb.addItem("1")
self.cb.addItem("2")
self.cb.addItem("3")
self.cb.addItem("4")
self.cb.setObjectName("combobox")
self.cb.move(80, 80)
self.OK = QPushButton('OK',self)
self.OK.setStyleSheet('QPushButton {font-size: 14px; font: Bold; font-family: Verdana; background-color: Orange; color: White}')
self.OK.move(400,280)
self.Cancel = QPushButton('Cancel', self)
self.Cancel.setStyleSheet('QPushButton {font-size: 14px; font: Bold; font-family: Verdana; background-color: Orange; color: White}')
self.Cancel.move(520, 280)
vbox.addWidget(self.cb)
vbox.addWidget(self.OK)
vbox.addWidget(self.Cancel)
self.setLayout(vbox)
self.OK.clicked.connect(self.hide_main)
self.Cancel.clicked.connect(self.close)
self.show()
def hide_main(self):
self.close
self.parent().hide()
def waiverClicked(self):
self.p = popup_on_waiver()

main.py

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import QUrl, Qt, QTimer
from gui_package.waiver_window import popup_on_waiver
import sys
class Main(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.initUI()
def initUI(self):
self.centralwidget = QWidget(self)
hbox = QHBoxLayout()
self.Waiver = QPushButton('Waiver', self)
self.Waiver.clicked.connect(lambda: popup_on_waiver.waiverClicked(self))
hbox.addWidget(self.Waiver)
self.centralwidget.setLayout(hbox)
self.setGeometry(50, 50, 1200, 600)
self.setWindowTitle("Timesheet")
self.setWindowIcon(QIcon(""))
self.setStyleSheet("background-color:")
self.setCentralWidget(self.centralwidget)
self.show()

您没有创建带有父级的弹出窗口,因此self.parent()返回None,然后您试图在不存在的对象上调用hide()。调用弹出窗口的方式有点奇怪,在弹出窗口中,在类本身中创建popup_on_waiver的实例。此外,从QDialog而不是QMainWindow继承弹出窗口更有意义。现在用父selfMain类内部构造弹出窗口小部件,并将弃权按钮连接到QDialog.exec_()方法:

popup = popup_on_waiver(self)
self.Waiver.clicked.connect(popup.exec_)

这是经过编辑的代码。

class popup_on_waiver(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setMinimumSize(QSize(660, 340))
self.setWindowTitle("Waiver")
self.cb = QComboBox()
self.cb.setGeometry(QRect(40, 40, 100, 30))
self.cb.addItems(["1", "2", "3", "4"])
self.cb.setObjectName("combobox")
self.cb.move(80, 80)
self.OK = QPushButton('OK')
self.OK.setStyleSheet('QPushButton {font-size: 14px; font: Bold; font-family: Verdana; background-color: Orange; color: White}')
self.OK.move(400, 280)
self.Cancel = QPushButton('Cancel')
self.Cancel.setStyleSheet('QPushButton {font-size: 14px; font: Bold; font-family: Verdana; background-color: Orange; color: White}')
self.Cancel.move(520, 280)
vbox = QVBoxLayout(self)
vbox.addWidget(self.cb)
vbox.addWidget(self.OK)
vbox.addWidget(self.Cancel)
self.OK.clicked.connect(self.hide_main)
self.Cancel.clicked.connect(self.reject)
def hide_main(self):
self.accept()
self.parent().hide()

class Main(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowFlags(Qt.WindowStaysOnTopHint)
self.initUI()
def initUI(self):
self.centralwidget = QWidget(self)
self.Waiver = QPushButton('Waiver')
popup = popup_on_waiver(self)
self.Waiver.clicked.connect(popup.exec_)
hbox = QHBoxLayout()
hbox.addWidget(self.Waiver)
self.centralwidget.setLayout(hbox)
self.setGeometry(50, 50, 1200, 600)
self.setWindowTitle("Timesheet")
self.setWindowIcon(QIcon(""))
self.setStyleSheet("background-color:")
self.setCentralWidget(self.centralwidget)
self.show()

最新更新