当前位置: 首页 > 知识库问答 >
问题:

Qt设计器PyQt5覆盖关闭事件子窗口不工作

柳羽
2023-03-14

我在QtDesigner中设计了三个窗口。主窗口使用按钮调用两个Childs窗口。如果我关闭主窗口,孩子的窗口也会关闭,我通过覆盖主窗口中的近事件来做到这一点。我需要在子窗口的近事件中实现一些东西,所以我覆盖了子类的近事件,但它什么也不做。请帮忙。

Qt Designer中主窗口的类

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_ventanaPrincipal(object):
    def setupUi(self, ventanaPrincipal):
        ventanaPrincipal.setObjectName("ventanaPrincipal")
        ventanaPrincipal.resize(267, 238)
        self.centralWidget = QtWidgets.QWidget(ventanaPrincipal)
        self.centralWidget.setObjectName("centralWidget")
        self.buttonVentana1 = QtWidgets.QPushButton(self.centralWidget)
        self.buttonVentana1.setGeometry(QtCore.QRect(60, 30, 141, 25))
        self.buttonVentana1.setObjectName("buttonVentana1")
        self.buttonVentana2 = QtWidgets.QPushButton(self.centralWidget)
        self.buttonVentana2.setGeometry(QtCore.QRect(60, 80, 141, 25))
        self.buttonVentana2.setObjectName("buttonVentana2")
        ventanaPrincipal.setCentralWidget(self.centralWidget)
        self.menuBar = QtWidgets.QMenuBar(ventanaPrincipal)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 267, 22))
        self.menuBar.setObjectName("menuBar")
        ventanaPrincipal.setMenuBar(self.menuBar)
        self.mainToolBar = QtWidgets.QToolBar(ventanaPrincipal)
        self.mainToolBar.setObjectName("mainToolBar")
        ventanaPrincipal.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
        self.statusBar = QtWidgets.QStatusBar(ventanaPrincipal)
        self.statusBar.setObjectName("statusBar")
        ventanaPrincipal.setStatusBar(self.statusBar)

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

    def retranslateUi(self, ventanaPrincipal):
        _translate = QtCore.QCoreApplication.translate
        ventanaPrincipal.setWindowTitle(_translate("ventanaPrincipal", "ventanaPrincipal"))
        self.buttonVentana1.setText(_translate("ventanaPrincipal", "Ventana 1"))
        self.buttonVentana2.setText(_translate("ventanaPrincipal", "Ventana 2"))

第一个子窗口的类

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_subVen1(object):
    def setupUi(self, subVen1):
        subVen1.setObjectName("subVen1")
        subVen1.resize(320, 347)
        self.label = QtWidgets.QLabel(subVen1)
        self.label.setGeometry(QtCore.QRect(40, 20, 141, 17))
        self.label.setObjectName("label")
        self.listWidget = QtWidgets.QListWidget(subVen1)
        self.listWidget.setGeometry(QtCore.QRect(20, 60, 256, 192))
        self.listWidget.setObjectName("listWidget")

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

    def retranslateUi(self, subVen1):
        _translate = QtCore.QCoreApplication.translate
        subVen1.setWindowTitle(_translate("subVen1", "Form"))
        self.label.setText(_translate("subVen1", "MIAU MIAU"))

第二个子窗口类

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_subVen2(object):
    def setupUi(self, subVen2):
        subVen2.setObjectName("subVen2")
        subVen2.resize(320, 304)
        self.listView = QtWidgets.QListView(subVen2)
        self.listView.setGeometry(QtCore.QRect(40, 60, 256, 192))
        self.listView.setObjectName("listView")
        self.label = QtWidgets.QLabel(subVen2)
        self.label.setGeometry(QtCore.QRect(80, 20, 121, 17))
        self.label.setObjectName("label")

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

    def retranslateUi(self, subVen2):
        _translate = QtCore.QCoreApplication.translate
        subVen2.setWindowTitle(_translate("subVen2", "Form"))
        self.label.setText(_translate("subVen2", "Guau Guau"))

调用其他三个的文件

import sys
#import classes-----------------------
from HMIs.ventanaprincipal import Ui_ventanaPrincipal, QtWidgets
from HMIs.subventana1 import Ui_subVen1
from HMIs.subventana2 import Ui_subVen2
# hijaSub1 inherits the first child window class made by the QtDesigner
#override child closeEvent
class hijaSub1(Ui_subVen1):
   def closeEvent(self, event):
      print("X is clicked")


class multiVen(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        QtWidgets.QWidget.__init__(self,parent=None)
        self.ui =Ui_ventanaPrincipal()
        self.ui.setupUi(self)
        self.subV1=QtWidgets.QWidget()
        self.subV2=QtWidgets.QWidget()
        #Conect signals whith slots--------------------
        self.ui.buttonVentana1.clicked.connect(self.muestraVentana1)
        self.ui.buttonVentana2.clicked.connect(self.muestraVentana2)
    # slots-----------------------------------------
    def muestraVentana1(self):
        self.wid1=hijaSub1()
        self.wid1.setupUi(self.subV1)
        self.subV1.show() 

    def muestraVentana2(self):
        self.wid2=Ui_subVen2()
        self.wid2.setupUi(self.subV2)
        self.subV2.show()
#Close all windows whith X button of main window
#override main closeEvent        
    def closeEvent(self, event):
        self.subV1.close()
        self.subV2.close()
        event.accept()


if __name__=="__main__":
    app=0
    app=QtWidgets.QApplication(sys.argv)
    myapp=multiVen()
    myapp.show()
    sys.exit(app.exec_())

共有1个答案

汪弘盛
2023-03-14

closeEvent方法具有从QWidget继承的类,在这种情况下,子类Sub1Ui\u subVen1Ui\u subVen2从对象继承,而不是从QWidget继承。

如果要在windows中实现closeEvent,请创建一个使用窗口视图(Ui\u xxx)并从QWidget继承的类。

class hijaSub1(QtWidgets.QWidget, Ui_subVen1):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent=parent)
        self.setupUi(self)

    def closeEvent(self, event):
        print("X is clicked: hijaSub1")

class hijaSub2(QtWidgets.QWidget, Ui_subVen2):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent=parent)
        self.setupUi(self)

    def closeEvent(self, event):
        print("X is clicked: hijaSub2")

class multiVen(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        QtWidgets.QWidget.__init__(self,parent=None)
        self.ui =Ui_ventanaPrincipal()
        self.ui.setupUi(self)
        self.subV1=hijaSub1()
        self.subV2=hijaSub2()
        #Conect signals whith slots--------------------
        self.ui.buttonVentana1.clicked.connect(self.muestraVentana1)
        self.ui.buttonVentana2.clicked.connect(self.muestraVentana2)
    # slots-----------------------------------------
    def muestraVentana1(self):
        self.subV1.show() 

    def muestraVentana2(self):
        self.subV2.show()
#Close all windows whith X button of main window
#override main closeEvent        
    def closeEvent(self, event):
        self.subV1.close()
        self.subV2.close()
        event.accept()


if __name__=="__main__":
    import sys
    app=0
    app=QtWidgets.QApplication(sys.argv)
    myapp=multiVen()
    myapp.show()
    sys.exit(app.exec_())
 类似资料:
  • 我正在寻找一些关于渲染子窗口的信息,特别是关于OpenGL如何与GDI互操作的信息。我的问题是,我基本上有两个窗口,首先,主窗口是在qt中创建的,而在qt内部,子窗口是利用OpenGL渲染器托管的。 现在我想做的是在我的OpenGL窗口顶部托管一个覆盖,所以我用它来覆盖OpenGL窗口。我遇到的问题是,当我使用OpenGL渲染时,OpenGL生成的图形似乎模糊了图形区域,包括并有效地撤消了由qt合

  • 问题内容: 我添加了一个窗口状态侦听器,如下所示: 但是,当我使用X关闭按钮时,不会调用该事件。我认为这与netbean jdesktop框架有关。但是我找不到问题所在。谢谢你的帮助。 问题答案: 是界面的一部分。使用代替。

  • 我试图在我的JavaFX2应用程序中添加一个图标,但是我找到的方法似乎不起作用。 图标的大小是32x32。 当我尝试 我希望这个能修好。

  • 问题内容: 我想捕获浏览器窗口/选项卡关闭事件。我已经尝试使用jQuery以下内容: 但这也适用于表单提交,这不是我想要的。我想要一个仅在用户关闭窗口时才触发的事件。 问题答案: 每当用户出于任何原因离开您的页面时,都会触发该事件。 例如,如果用户提交表单,单击链接,关闭窗口(或选项卡)或使用地址栏,搜索框或书签进入新页面,则将触发该事件。 您可以使用以下代码排除表单提交和超链接(其他框架除外):

  • 本文向大家介绍c# 实现子窗口关闭父窗口也关闭的方法,包括了c# 实现子窗口关闭父窗口也关闭的方法的使用技巧和注意事项,需要的朋友参考一下 其实是窗口间通讯的问题,在form1上打开form2 ,form2 关闭时关闭form1 实现方法: 在子窗口form2中声明事件: 然后在它的关闭事件中触发本事件: 在父窗口form1中(比如登陆窗口中): 然后弹出子form2窗体的地方这样写: 以上这篇c

  • 问题内容: 我正在尝试创建系统覆盖图。但是我一直在“拒绝权限”。我正在使用SDK版本23。 我的清单文件: 我用来创建叠加层的代码: 问题答案: 首先,没有名为的权限。是的。 其次,如果您的年龄为23岁或更高,并且您正在运行Android 6.0+设备,则您的应用一开始将不会获得此权限。致电查看您是否具有权限,如果没有,则用于将用户引导到“设置”。