問題描述
我正在嘗試進行一些驗證,例如:
I'm trying to put in some validation such that:
- 選中選擇 A" 或 選擇 B" 時,會自動取消選中 未選擇"
- 選中未選中"時,選擇 A" 和 選擇 B" 都會自動取消選中
- When either "Select A" or "Select B" is checked, "None Selected" is automatically unchecked
- When "None Selected" is checked, both "Select A" and "Select B" are automatically unchecked
但是當我運行此代碼時,單擊任何復選框都會取消選中 所有 3 個復選框.
But when I run this code, clicking any checkbox will uncheck all the 3 checkboxes.
即窗口初始化時選中了"None Selected".但是當我點擊 "Select A" 時,它會取消選中 "None Selected",這是有意的,但沒有得到 "Select A"檢查.
i.e. The window initializes with "None Selected" checked. But when I click "Select A", it unchecks "None Selected", which is intended, but "Select A" doesn't get checked.
我做錯了什么?
import sys
import PyQt5
class Test(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
checkBoxNone = QCheckBox("None Selected")
checkBoxA = QCheckBox("Select A")
checkBoxB = QCheckBox("Select B")
checkBoxNone.setChecked(True)
checkBoxNone.stateChanged.connect(lambda checked: (checkBoxA.setChecked(False), checkBoxB.setChecked(False)))
checkBoxA.stateChanged.connect(lambda checked: checkBoxNone.setChecked(False))
checkBoxB.stateChanged.connect(lambda checked: checkBoxNone.setChecked(False))
grid = QGridLayout()
grid.addWidget(checkBoxNone, 1, 0)
grid.addWidget(checkBoxA, 2, 0)
grid.addWidget(checkBoxB, 3, 0)
self.setLayout(grid)
self.setWindowTitle('Test')
self.show()
if __name__ == '__main__':
if not QApplication.instance():
app = QApplication(sys.argv)
else:
app = QApplication.instance()
ex = Test()
sys.exit(app.exec_())
推薦答案
問題是因為根據您的要求,只有在某些 QCheckBox
被勾選但您不做的情況下才應該做那些選項該驗證,為了能夠正確處理它,創(chuàng)建一個插槽并知道發(fā)出信號的對象,sender()
方法:
The problem is caused because according to your requirements, you should only make those options if some QCheckBox
is checked but you do not do that verification, to be able to handle it properly, create a slot and to know which object the signal was emited, the sender()
method:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Test(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.checkBoxNone = QCheckBox("None Selected")
self.checkBoxA = QCheckBox("Select A")
self.checkBoxB = QCheckBox("Select B")
self.checkBoxNone.setChecked(True)
self.checkBoxNone.stateChanged.connect(self.onStateChange)
self.checkBoxA.stateChanged.connect(self.onStateChange)
self.checkBoxB.stateChanged.connect(self.onStateChange)
grid = QGridLayout(self)
grid.addWidget(self.checkBoxNone, 1, 0)
grid.addWidget(self.checkBoxA, 2, 0)
grid.addWidget(self.checkBoxB, 3, 0)
self.setWindowTitle('Test')
self.show()
@pyqtSlot(int)
def onStateChange(self, state):
if state == Qt.Checked:
if self.sender() == self.checkBoxNone:
self.checkBoxA.setChecked(False)
self.checkBoxB.setChecked(False)
elif self.sender() in (self.checkBoxA, self.checkBoxB):
self.checkBoxNone.setChecked(False)
這篇關于取消選中所有其他復選框的復選框的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!