简体   繁体   English

如何覆盖 QDialog.accept()?

[英]How to overwrite QDialog.accept()?

I have a Mainwindow that is opening a dialog on the press of a pushbutton.我有一个主窗口,它在按下按钮时打开一个对话框。 I want to override accept function of the dialog so I could implement some custom functionality that should be executed before dialog is accepted.我想覆盖对话框的接受 function 以便我可以实现一些应该在接受对话框之前执行的自定义功能。 Here is the example code of my mainwindow.这是我的主窗口的示例代码。

from PySide2 import QtCore, QtGui, QtWidgets
from add_new import Add_new_dialog
import sys

class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(500, 100)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushNew_Bed = QtWidgets.QPushButton(self.centralwidget)
        self.pushNew_Bed.setObjectName("pushNew_Bed")
        self.pushNew_Bed.resize(QtCore.QSize(500,100))
        self.pushNew_Bed.clicked.connect(self.on_add_new_clicked)



    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushNew_Bed.setText(_translate("MainWindow", "Add New Bed"))



    def on_add_new_clicked(self):
        Dialog = QtWidgets.QDialog()
        Dialog.ui = Add_new_dialog()
        Dialog.ui.setupUi(Dialog)
        #dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        retValue = Dialog.exec_()
        if retValue == 1:
            print("Accepted")#dialog.calendarWidget.selectedDate())



if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

And here is the dialog.这是对话框。

from PySide2 import QtCore, QtGui, QtWidgets
import sys

class Add_new_dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        Dialog.setMinimumSize(QtCore.QSize(400, 300))
        Dialog.setMaximumSize(QtCore.QSize(400, 300))

        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")


        self.retranslateUi(Dialog)
        #self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.accepted.connect(self.custom_func)
        self.buttonBox.rejected.connect(Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)


    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))


    def custom_func(self):
        Dialog.accept()
        print("custom func")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Add_new_dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

If I launch the dialog standalone everything works as expected.如果我独立启动对话框,一切都会按预期工作。 However if I call for it from the mainwindow, I, predictably, get an error.但是,如果我从主窗口调用它,可以预见的是,我会得到一个错误。

    Dialog.accept()
NameError: name 'Dialog' is not defined

I've tried adding the following code to dialog to overwrite the accept function:我尝试将以下代码添加到对话框中以覆盖接受 function:

def accept(self):
    self.custom_func()
    Dialog.done(QtWidgets.QDialog.Accepted)

And binding the button to that function并将按钮绑定到该 function

self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(Dialog.reject)

Again, predictably I get the same result.同样,可以预见的是,我得到了相同的结果。 Reading the documentation didn't help much.阅读文档并没有太大帮助。 Any help is greatly appreciated and I apologize for this noobish question, but I'm a complete beginner with gui.非常感谢任何帮助,我为这个愚蠢的问题道歉,但我是一个完整的 gui 初学者。 Thank you in advance.先感谢您。

You should not modify the class generated by Qt Designer so you must regenerate the.py (for more information read here ) so I will assume that class Ui_MainWindow and Add_new_dialog belong to file mainwindow_ui.py and add_new_dialog_ui.py , respectively. You should not modify the class generated by Qt Designer so you must regenerate the.py (for more information read here ) so I will assume that class Ui_MainWindow and Add_new_dialog belong to file mainwindow_ui.py and add_new_dialog_ui.py , respectively.

Considering the above, you should override the method of the class that inherits QDialog:考虑到上述情况,您应该重写继承QDialog的class的方法:

main.py主文件

from PySide2 import QtCore, QtGui, QtWidgets

from mainwindow_ui import Ui_MainWindow
from add_new_dialog_ui import Add_new_dialog


class AddDialog(QtWidgets.QDialog, Add_new_dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

    def accept(self):
        print("custom func")
        super().accept()


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.pushNew_Bed.clicked.connect(self.on_add_new_clicked)

    def on_add_new_clicked(self):
        dialog = AddDialog()
        retValue = dialog.exec_()
        if retValue == QtWidgets.QDialog.Accepted:
            print("Accepted")


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM