Какой сигнал у кнопки Apply в QDialogButtonBox?

Как запустить функцию по нажатию на кнопку Apply в QDialogButtonBox?

QDialogButtonBox


В QDialogButtonBox для того, чтобы выполнить функцию, нажав на кнопку Ok надо написать:

def button_action_ok():
    ...

buttonBox.accepted.connect(button_action_ok)

Для клавиши Close:

def button_action_close():
    ...

buttonBox.rejected.connect(button_action_close)

А какой код надо написать чтобы запускать функцию, нажимая на кнопку Apply?


Ответы (1 шт):

Автор решения: S. Nick

enum QDialogButtonBox::ButtonRole

Это перечисление описывает роли, которые можно использовать для описания кнопок в блоке кнопок. Комбинации этих ролей используются как флаги для описания различных аспектов их поведения.

QDialogButtonBox::Appl - кнопка "Apply", определенная с помощью ApplyRole.

from PyQt5.Qt import *


class ModelessDialog(QDialog):
    def __init__(self, part, threshold, parent=None):
        super().__init__(parent)
        
        self.setWindowTitle("Baseline")
        self.setGeometry(800, 275, 300, 200)
        self.part = part
        self.threshold = threshold
        self.threshNew = 4.4
        self.parent = parent
        
        label = QLabel("Part            : {}\nThreshold   : {}".format(
            self.part, self.threshold))
        self.label2 = QLabel("ThreshNew : {:,.2f}".format(self.threshNew))
        
        self.spinBox = QDoubleSpinBox()
        self.spinBox.setMinimum(-2.3)
        self.spinBox.setMaximum(99)
        self.spinBox.setValue(self.threshNew)
        self.spinBox.setSingleStep(0.02)
        self.spinBox.valueChanged.connect(self.valueChang)
        
        buttonBox = QDialogButtonBox(
            QDialogButtonBox.Ok     | 
            QDialogButtonBox.Cancel | 
            QDialogButtonBox.Apply
        )

        layout = QVBoxLayout(self)            
        layout.addWidget(label)
        layout.addWidget(self.label2)
        layout.addWidget(self.spinBox)
        layout.addWidget(buttonBox)

        okBtn = buttonBox.button(QDialogButtonBox.Ok) 
        okBtn.clicked.connect(self._okBtn)

        cancelBtn = buttonBox.button(QDialogButtonBox.Cancel)
        cancelBtn.clicked.connect(self.reject)   

        applyBtn = buttonBox.button(QDialogButtonBox.Apply)       # +++
        applyBtn.clicked.connect(self._apply)                     # +++

    def _apply(self):                                             # +++
        print('Hello Apply')    
        self.parent.label.setText('Hello Apply')

    def _okBtn(self):
        text = """
            Part      : {}
            Threshold : {}
            ThreshNew : {:,.2f}""".format(
                self.part, self.threshold, self.spinBox.value()
            )
        print(f'{text}') 
        self.parent.label.setText(text)
        
    def valueChang(self):
        self.label2.setText("ThreshNew : {:,.2f}".format(self.spinBox.value()))
        

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        
        self.label  = QLabel('Hello Dialog')
        
        button = QPushButton('Open Dialog')
        button.clicked.connect(self.showDialog)
        
        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(button)

    def showDialog(self):
        self.dialog = ModelessDialog(2, 55.77, self)
        self.dialog.show()
        

if __name__ == '__main__':
    import sys
    
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(300, 200)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка