在PyQt5对话框ButtonBox中使用3个按钮

2024-10-02 10:20:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个登录系统类型对话框,以便使用PyQt5进行练习(我对该模块非常陌生),并且我正在尝试让用户能够单击(确定、取消、应用)作为用户名/密码输入框下面的按钮,但我不确定如何实际使应用按钮工作。我有buttons.accepted.connect(*method*)buttons.rejected.connect(*method*),但我不知道如何指定按下accept按钮。我尝试过使用buttons.clicked(dlgButtons[0](按钮存储的地方),但它只是给了我一个错误

下面的代码是我对按钮的声明,如果有帮助的话。谢谢

buttons = qt.QDialogButtonBox()
        dlgButtons = (qt.QDialogButtonBox.Apply, qt.QDialogButtonBox.Ok, qt.QDialogButtonBox.Cancel)
        buttons.setStandardButtons(
        dlgButtons[0] | dlgButtons[1] | dlgButtons[2]
        )

Tags: 模块用户类型系统connectqt按钮method
2条回答

一种可能的解决方案可能如下所示:

from PyQt5.QtWidgets 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
        
        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()            
        layout.addWidget(label)
        layout.addWidget(self.label2)
        layout.addWidget(self.spinBox)
        layout.addWidget(buttonBox)
        self.resize(300, 200)  
        self.setLayout(layout)                                 

        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')    

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

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

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

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

enter image description here

dlgButtons中存储的只是一个枚举列表,特别是^{}枚举,它是按钮的标识符列表,它们不是“实际”按钮

此外,不能像这样使用clicked信号:

 buttons.clicked(dlgButtons[0])

这将导致崩溃,因为信号不可调用。clicked()信号的参数是从插槽接收的,这意味着如果将函数连接到该信号,该函数将接收单击的按钮:

        buttons.clicked.connect(self.buttonsClicked)

    def buttonsClicked(self, button):
        print(button.text())

上面将打印单击按钮的文本(确定、应用、取消或其等效的本地化文本)

您正在寻找的是连接到实际按钮的单击信号,您可以使用^{}函数获得每个按钮的单独引用:

applyButton = buttons.button(qt.QDialogButtonBox.Apply)
applyButton.clicked.connect(self.applyFunction)

相关问题 更多 >

    热门问题