【问题标题】:How to check if a QWidget is closed in QMainWindow?如何检查 QWidget 是否在 QMainWindow 中关闭?
【发布时间】:2021-11-26 17:44:08
【问题描述】:

我有两个文件:

main.py

from un import Ui_Form
...
class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
   def __init__(self):
     super().__init__()
     self.show_btn.clicked.connect(self.show_btn_fun)
     ...
   def double_opening(self):
     #this method passes data for my requests to self.window 
     for idx in self.tableView.selectionModel().selectedIndexes():
        row_number = idx.row()
        column_number = idx.column()
        self.window = QtWidgets.QWidget()
        self.text_to_change = format(self.tableView.model().index(row_number, 2).data())
        self.ui = Ui_Form(self.text_to_change)
        self.ui.setupUi(self.window)
        self.window.setWindowModality(QtCore.Qt.ApplicationModal)
        self.window.show()

    def show_btn_fun(self):  
        #show the entire existing table
...
def main():
app = QtWidgets.QApplication(sys.argv)  
window = ExampleApp()  
window.show() 
app.exec_()
if __name__ == '__main__':  
main() 

和 un.py:

class Ui_Form(object):
   def setupUi(self, Form):
      Form.setObjectName("Form")
      ...
      self.button_changes_confirm.clicked.connect(self.changes)
      self.button_changes_confirm.clicked.connect(Form.close)
      ...
   def changes(self):
      #makes my update to the database

单击“button_changes_confirm”后,我的数据库中的数据会更新

但是要看到数据已经更新,我需要用“show_btn”按钮调用“show_bug_fun”方法

“self.window”关闭时如何调用“show_btn_fun”方法?

【问题讨论】:

  • 我在double_opening 中看到了一个 for 循环,您确定要为 每个 选定的索引显示一个窗口吗?无论如何,您应该为此使用 QDialog,因为它会使事情变得更容易。此外,您不应编辑 pyuic 生成的文件。阅读using Designer
  • i 显示所选索引的窗口。 “另外,你不应该编辑 pyuic 生成的文件”——为什么?
  • 有多种原因: 1. 每当您必须在设计器中更改 UI 时,您都必须重新构建文件,因此您要么冒着覆盖和丢失修改的风险,要么每次都必须合并更改(这意味着您可能会由于拼写错误、错误的复制/粘贴或忘记的功能而引入错误); 2. 更改这些文件没有任何好处,因为无论如何你迟早需要子类化; 3. 它通常会导致对对象结构的误解和意外行为; 4.它们不是基于Qt的类(QObject),所以它们不能有信号和属性;
  • 5.因为它们不是 Qt 类,所以它们不允许覆盖 Qt 小部件方法,因此无论如何您都需要子类化 Qt 小部件; 6. 他们不保留对其构建的小部件的引用,因此实现需要该引用的功能会使事情变得不必要地复杂。编辑这些文件(或模仿它们的行为,或“合并”它们的功能)被认为是一种不好的做法,因为它没有提供任何真正的好处,只会引入上述问题。您应该将它们视为您的程序使用并按原样使用的“资源文件”,仅此而已。
  • 不确定,但可以重新定义你的 Ui_Form(object) ---> def closeEvent(self, event): 来调用你的方法。请参阅此处作为示例learndataanalysis.org/…

标签: python python-3.x pyqt pyqt5


【解决方案1】:

这是我的尝试,在表单关闭时调用一个按钮:

mainwin.py  (main window) :
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_1 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_1.setGeometry(QtCore.QRect(280, 30, 261, 131))
        self.pushButton_1.setObjectName("pushButton_1")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(280, 220, 261, 131))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 29))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_1.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))

https://gitpress.io/u/1155/pyqt-example-ui_form复制的表格

form3      :
"""

copied from https://gitpress.io/u/1155/pyqt-example-ui_form

"""

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        
        Form.setWindowModality(QtCore.Qt.ApplicationModal)
        
        Form.setObjectName("Form")
        Form.resize(545, 471)
        self.gridLayout = QtWidgets.QGridLayout(Form)
        self.gridLayout.setObjectName("gridLayout")
        self.easingCurvePicker = QtWidgets.QListWidget(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.easingCurvePicker.sizePolicy().hasHeightForWidth())
        self.easingCurvePicker.setSizePolicy(sizePolicy)
        self.easingCurvePicker.setMaximumSize(QtCore.QSize(16777215, 120))
        self.easingCurvePicker.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.easingCurvePicker.setMovement(QtWidgets.QListView.Static)
        self.easingCurvePicker.setProperty("isWrapping", False)
        self.easingCurvePicker.setViewMode(QtWidgets.QListView.IconMode)
        self.easingCurvePicker.setSelectionRectVisible(False)
        self.easingCurvePicker.setObjectName("easingCurvePicker")
        self.gridLayout.addWidget(self.easingCurvePicker, 0, 0, 1, 2)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox_2 = QtWidgets.QGroupBox(Form)
        self.groupBox_2.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.groupBox_2.setObjectName("groupBox_2")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_2)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.lineRadio = QtWidgets.QRadioButton(self.groupBox_2)
        self.lineRadio.setMaximumSize(QtCore.QSize(16777215, 40))
        self.lineRadio.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.lineRadio.setChecked(True)
        self.lineRadio.setObjectName("lineRadio")
        self.buttonGroup = QtWidgets.QButtonGroup(Form)
        self.buttonGroup.setObjectName("buttonGroup")
        self.buttonGroup.addButton(self.lineRadio)
        self.gridLayout_2.addWidget(self.lineRadio, 0, 0, 1, 1)
        self.circleRadio = QtWidgets.QRadioButton(self.groupBox_2)
        self.circleRadio.setMaximumSize(QtCore.QSize(16777215, 40))
        self.circleRadio.setObjectName("circleRadio")
        self.buttonGroup.addButton(self.circleRadio)
        self.gridLayout_2.addWidget(self.circleRadio, 1, 0, 1, 1)
        self.verticalLayout.addWidget(self.groupBox_2)
        self.groupBox = QtWidgets.QGroupBox(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
        self.groupBox.setSizePolicy(sizePolicy)
        self.groupBox.setObjectName("groupBox")
        self.formLayout = QtWidgets.QFormLayout(self.groupBox)
        self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.AllNonFixedFieldsGrow)
        self.formLayout.setObjectName("formLayout")
        self.label = QtWidgets.QLabel(self.groupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        self.label.setMinimumSize(QtCore.QSize(0, 30))
        self.label.setObjectName("label")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
        self.periodSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
        self.periodSpinBox.setEnabled(False)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.periodSpinBox.sizePolicy().hasHeightForWidth())
        self.periodSpinBox.setSizePolicy(sizePolicy)
        self.periodSpinBox.setMinimumSize(QtCore.QSize(0, 30))
        self.periodSpinBox.setMinimum(-1.0)
        self.periodSpinBox.setSingleStep(0.1)
        self.periodSpinBox.setProperty("value", -1.0)
        self.periodSpinBox.setObjectName("periodSpinBox")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.periodSpinBox)
        self.amplitudeSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
        self.amplitudeSpinBox.setEnabled(False)
        self.amplitudeSpinBox.setMinimumSize(QtCore.QSize(0, 30))
        self.amplitudeSpinBox.setMinimum(-1.0)
        self.amplitudeSpinBox.setSingleStep(0.1)
        self.amplitudeSpinBox.setProperty("value", -1.0)
        self.amplitudeSpinBox.setObjectName("amplitudeSpinBox")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.amplitudeSpinBox)
        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setMinimumSize(QtCore.QSize(0, 30))
        self.label_3.setObjectName("label_3")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_3)
        self.overshootSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
        self.overshootSpinBox.setEnabled(False)
        self.overshootSpinBox.setMinimumSize(QtCore.QSize(0, 30))
        self.overshootSpinBox.setMinimum(-1.0)
        self.overshootSpinBox.setSingleStep(0.1)
        self.overshootSpinBox.setProperty("value", -1.0)
        self.overshootSpinBox.setObjectName("overshootSpinBox")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.overshootSpinBox)
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setMinimumSize(QtCore.QSize(0, 30))
        self.label_2.setObjectName("label_2")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_2)
        self.verticalLayout.addWidget(self.groupBox)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.gridLayout.addLayout(self.verticalLayout, 1, 0, 1, 1)
        self.graphicsView = QtWidgets.QGraphicsView(Form)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.graphicsView.sizePolicy().hasHeightForWidth())
        self.graphicsView.setSizePolicy(sizePolicy)
        self.graphicsView.setObjectName("graphicsView")
        self.gridLayout.addWidget(self.graphicsView, 1, 1, 1, 1)


        self.pushButton_1 = QtWidgets.QPushButton(self)
        self.pushButton_1.setObjectName("pushButton_1") 
        self.pushButton_1.setMinimumSize(QtCore.QSize(0, 30))
        self.pushButton_1.setGeometry(QtCore.QRect(20, 390, 120, 60))
        self.pushButton_1.setObjectName("pushButton_1")
 
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Easing curves"))
        self.groupBox_2.setTitle(_translate("Form", "Path type"))
        self.lineRadio.setText(_translate("Form", "Line"))
        self.circleRadio.setText(_translate("Form", "Circle"))
        self.groupBox.setTitle(_translate("Form", "Properties"))
        self.label.setText(_translate("Form", "Period"))
        self.label_3.setText(_translate("Form", "Overshoot"))
        self.label_2.setText(_translate("Form", "Amplitude"))
        
        self.pushButton_1.setText(_translate("Form", "Close Here"))


我的代码,main.py

import sys 

from mainwin import Ui_MainWindow

from form3b import Ui_Form

from PyQt5 import QtWidgets



class Form(QtWidgets.QWidget, Ui_Form):
    def __init__(self, *args, **kwargs):
        super(Form, self).__init__(*args, **kwargs)
        self.setupUi(self)
        
        self.show()   
        
        self.pushButton_1.clicked.connect(self.pushButton_1_Pressed)
        
    def pushButton_1_Pressed(self):
        
        self.close()
        
    def closeEvent(self, event):
        
        MainWindow.pushButton_2_Pressed(self)
        
        print('closing')
        

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setupUi(self)
        
        self.pushButton_1.clicked.connect(self.pushButton_1_Pressed)
        
        self.pushButton_2.clicked.connect(self.pushButton_2_Pressed)
        
        

        
    def pushButton_1_Pressed(self):
        
        self.x = Form()
        
        # self.x.show() # its in Form init already
    
    
    def pushButton_2_Pressed(self):
        
        print('button 2 pressed')
        

                
if __name__ == "__main__":
    
    app = QtWidgets.QApplication(sys.argv)

    window = MainWindow()
    window.show()
    
    sys.exit(app.exec_())

按上PushButton打开表单,关闭表单时(右上角X)得到print('closing')和MainWindow下PushButtonprint('button 2 pressed'),在表单上按PushButton(“Close Here”)就像关闭表单.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多