pyqt问题:当form2设为setWindowState(Qt.WindowFullScreen)后,调用close()关闭form2显黑屏?

为什么pyqt中当form2设为全屏后关闭显示黑屏?当我在form2中加入self.setWindowState(Qt.WindowFullScreen)代码后,调用form2的close()方法,form2关闭后黑屏?

main.py代码

from PyQt5.QtWidgets import QWidget,QApplication
from form1 import Form1
import sys


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWin = Form1()
    mainWin.show()
    sys.exit(app.exec())

form1ui.py代码

rom PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow1(object):
    def setupUi(self, MainWindow1):
        MainWindow1.setObjectName("MainWindow1")
        MainWindow1.resize(378, 162)
        self.centralwidget = QtWidgets.QWidget(MainWindow1)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(130, 40, 113, 32))
        self.pushButton.setObjectName("pushButton")
        MainWindow1.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow1)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 378, 22))
        self.menubar.setObjectName("menubar")
        MainWindow1.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow1)
        self.statusbar.setObjectName("statusbar")
        MainWindow1.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow1)

    def retranslateUi(self, MainWindow1):
        _translate = QtCore.QCoreApplication.translate
        MainWindow1.setWindowTitle(_translate("MainWindow1", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow1", "打开form2"))

form1.py代码

from PyQt5.QtWidgets import QMainWindow
from form1ui import Ui_MainWindow1
from form2 import Form2

class Form1(QMainWindow,Ui_MainWindow1):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.form2 = Form2()
        self.pushButton.clicked.connect(self.showForm2)

    def showForm2(self):
        self.showMinimized()
        self.form2.show()

form2ui.py代码

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow2(object):
    def setupUi(self, MainWindow2):
        MainWindow2.setObjectName("MainWindow2")
        MainWindow2.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow2)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(340, 360, 113, 32))
        self.pushButton.setObjectName("pushButton")
        MainWindow2.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow2)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        MainWindow2.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow2)
        self.statusbar.setObjectName("statusbar")
        MainWindow2.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow2)

    def retranslateUi(self, MainWindow2):
        _translate = QtCore.QCoreApplication.translate
        MainWindow2.setWindowTitle(_translate("MainWindow2", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow2", "关闭"))

form2.py代码

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import Qt
from form2ui import Ui_MainWindow2

class Form2(QMainWindow,Ui_MainWindow2):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.setWindowState(Qt.WindowFullScreen)
        self.pushButton.clicked.connect(self.closeWin)

    def closeWin(self):
        self.close()


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    问题描述: 我在使用pyqt编写程序时,在form2中使用了self.setWindowState(Qt.WindowFullScreen)设置全屏后,再调用close()关闭form2时,会出现黑屏的情况。我使用了main.py、form1ui.py、form1.py、form2ui.py、form2.py这些文件作为代码。请问如何解决这个问题?

    解决方案: 这个问题可能是因为程序在窗口全屏时,没有正确地退出全屏模式,导致在关闭窗口时出现黑屏。您可以尝试在调用close()方法前,先将窗口恢复到正常模式,再关闭窗口。具体的代码实现如下:

    # 在form2.py中重写closeEvent()方法
    def closeEvent(self, event):
        # 添加以下代码,将窗口恢复到正常模式
        self.setWindowState(Qt.WindowNoState)
        event.accept()
    

    这个方法会在窗口关闭时被自动调用,它会将窗口恢复到正常模式,然后再关闭窗口。这样就可以避免出现黑屏的情况了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^