[英]Using 3 Buttons in PyQt5 DialogButtonBox
我正在嘗試使用 PyQt5 創建一個登錄系統類型對話框以進行練習(我對模塊很陌生),並且我試圖讓用戶能夠單擊(確定、取消、應用)作為下面的按鈕用戶名/密碼的輸入框,但我不確定我如何才能真正讓應用按鈕工作。 我有buttons.accepted.connect(*method*)
和buttons.rejected.connect(*method*)
但我不知道如何指定按下接受按鈕。 我曾嘗試使用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]
)
一種可能的解決方案可能如下所示:
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_())
您在dlgButtons
中存儲的只是枚舉列表,特別是StandardButton
枚舉,它是按鈕標識符的列表,它們不是“實際”按鈕。
此外,您不能像這樣使用clicked
信號:
buttons.clicked(dlgButtons[0])
這將產生崩潰,因為信號不可調用。 clicked()
信號的參數是將從插槽接收的內容,這意味着如果您將 function 連接到該信號,則 function 將接收點擊按鈕:
buttons.clicked.connect(self.buttonsClicked)
def buttonsClicked(self, button):
print(button.text())
以上將打印單擊按鈕的文本(確定、應用、取消或它們等效的本地化文本)。
您正在尋找的是連接到實際按鈕的點擊信號,您可以使用button()
function 獲得對每個按鈕的單獨引用:
applyButton = buttons.button(qt.QDialogButtonBox.Apply)
applyButton.clicked.connect(self.applyFunction)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.