【问题标题】:How to hide the Main window(parent) from pop up window in PyQt5.?如何在 PyQt5 的弹出窗口中隐藏主窗口(父窗口)?
【发布时间】:2020-07-01 16:30:34
【问题描述】:

我有一个主窗口,我从中调用豁免窗口(弹出窗口)。单击“放弃”弹出窗口上的“确定”后,我想关闭“放弃”弹出窗口并隐藏主窗口。我已将 self.parent().hide 包含在豁免弹出窗口中,但其抛出错误 "Process finished with exit code 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()

ma​​in.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()

【问题讨论】:

  • 什么是waiverClicked
  • def waiverClicked(self): '''它是 Waiver 类中的一个函数,我在单击按钮时从主窗口调用它来实例化 popup_on_waiver 类''' self.p = popup_on_waiver()
  • 我在您的代码中没有看到,请编辑您的问题并将其添加到那里。如果还有其他此类错误,也请花时间。请阅读How to Ask 并查看tour
  • 由于某种原因,它不允许我在编辑后提交。它给出了错误,你的问题充满了代码,没有描述。有点消息
  • 加个更详细的解释就不会有这个问题了(更多描述)。

标签: python pyqt pyqt5


【解决方案1】:

您没有使用父级创建弹出窗口,因此self.parent() 返回 None,然后您尝试在不存在的对象上调用 hide()。您调用弹出窗口的方式,您在其中创建popup_on_waiver 类的实例在类本身内,有点奇怪。此外,弹出窗口从 QDialog 继承而不是 QMainWindow 更有意义。现在在Main 类中构造弹出小部件与父self,并将放弃按钮连接到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()

【讨论】:

  • 非常感谢您的回复。但随着这一变化,主窗口和弹出对话框同时打开。 popup = popup_on_waiver(self) (这本身就是打开弹出窗口) self.Waiver.clicked.connect(popup.exec_)。为了可读性,我想将弹出对话框放在单独的文件中并将其导入主文件中。应该没问题吧?
  • 它们不会同时打开。单击按钮时会打开弹出对话框。
猜你喜欢
  • 2022-12-31
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多