Как переписать QDialog.accept ()? - PullRequest
1 голос
/ 20 апреля 2020

У меня есть 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_())

А вот это диалоговое окно.

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_())

Если я запускаю диалоговое окно автономно, все работает как положено. Однако, если я вызываю это из главного окна, я, как и ожидалось, получаю ошибку.

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

Я попытался добавить следующий код в диалог, чтобы перезаписать функцию принятия:

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

И привязать кнопку к этой функции

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

Опять же, как и ожидалось, я получаю тот же результат. Чтение документации не сильно помогло. Любая помощь очень ценится, и я прошу прощения за этот вопрос noobi sh, но я начинающий с gui. Заранее спасибо.

1 Ответ

2 голосов
/ 20 апреля 2020

Вы не должны изменять класс, сгенерированный Qt Designer, поэтому вы должны заново сгенерировать .py (для более подробной информации читайте здесь ), поэтому я буду считать, что классы Ui_MainWindow и Add_new_dialog принадлежат в файл mainwindow_ui.py и add_new_dialog_ui.py соответственно.

Учитывая вышесказанное, вы должны переопределить метод класса, который наследует QDialog:

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_())
...