Как скрыть главное окно (родительское) от всплывающего окна в PyQt5.? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть главное окно, откуда я вызываю окно отказа (всплывающее окно). При нажатии OK во всплывающем окне «Отказ» я хочу закрыть всплывающее окно «Отказ» и скрыть главное окно. Я включил 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()

1 Ответ

0 голосов
/ 21 марта 2020

Вы не создаете всплывающее окно с родителем, поэтому 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...