单击时发送 QCheckBox 的状态和数字
Send state of a QCheckBox and a number when clicked
我正在尝试通过 QCheckBox
单击信号传递两个单独的变量:它的 post 按下状态,以及它在列表中的索引。
例如,这是我的代码:
# pip install pyqt5
from PyQt5.QtMultimediaWidgets import *
from PyQt5.QtMultimedia import *
from functools import partial
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import *
import sys
batch_name = ['Test1', 'test2', 'test']
total_batches = 0
unfinished_batches = 0
class MainMenu(QWidget):
def __init__(self, parent = None):
global total_batches, unfinished_batches, batch_name
super(MainMenu, self).__init__(parent)
self.scroll = QScrollArea(self)
self.scroll.setWidgetResizable(True)
self.content = QWidget()
self.scroll.setWidget(self.content)
self.lay = QGridLayout(self.content)
for i, j in enumerate(batch_name):
self.btnName = QPushButton(j, self)
self.btnName.setFlat(True)
self.lay.addWidget(self.btnName, i, 1)
self.check_box = QCheckBox(self)
checkbox_index = partial(self.clickBox, i, i)
self.check_box.stateChanged.connect(checkbox_index)
self.lay.addWidget(self.check_box, i, 0)
total_batches += 1
def clickBox(self, state, index):
print(index)
print(state)
global unfinished_batches, total_batches
if state == Qt.Checked:
unfinished_batches += 1
else:
unfinished_batches -= 1
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainMenu()
main.show()
sys.exit(app.exec_())
(是的,我知道我通过了两次抛出的指数。)
所以可以说,我按第一个 QCheckBox
(Test1
):我应该为状态获得 True
,为索引获得 0
。如果我再次按 Test1
,我希望状态得到 False
,索引再次得到 0
。再举一个例子,如果我按test
(最后一个QCheckBox
),我应该期望得到状态True
,索引得到2
,然后再次按下,我应该为州获得 False
,再次为索引获得 2
。
上面的代码给了我索引,但没有给我它的状态——这就是我坚持的地方。如果按下 QCheckBox
我期望发生的事情,那么我应该得到 True
而我没有。
您没有正确使用 partial
。如果在 partial
中指定了两个参数,则 clickBox
的两个参数都将被 i
的值覆盖。您需要做的只是指定 index
参数的值,并让信号提供 state
参数的值。这可以使用关键字参数来完成,如下所示:
# checkbox_index = partial(self.clickBox, i, i)
checkbox_index = partial(self.clickBox, index=i)
但请注意,state
将是 CheckState enum 中的一个值,因此如果您特别想要获得 True/False
,您可以使用 lambda
代替:
checkbox_index = lambda state, index=i: self.clickBox(state == Qt.Checked, index)
和 clickState
需要看起来像这样:
def clickBox(self, state, index):
print(index)
print(state)
global unfinished_batches, total_batches
if state == True:
unfinished_batches += 1
else:
unfinished_batches -= 1
试一试:
import sys
from functools import partial
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MainMenu(QWidget):
def __init__(self, parent = None):
super(MainMenu, self).__init__(parent)
batch_name = ['Test1', 'test2', 'test']
lay = QGridLayout(self)
for i, j in enumerate(batch_name):
check_box = QCheckBox()
lay.addWidget(check_box, i, 0)
btnName = QPushButton(j)
btnName.setFlat(True)
btnName.setCheckable(True)
btnName.clicked.connect(partial(self.btnCliced, i, j, check_box))
lay.addWidget(btnName, i, 1)
check_box.stateChanged.connect(partial(self.clickBox, i, j, btnName))
def clickBox(self, i, j, btnName, state):
print(f'clickBox: i={i}, j={j}, state={state} : {bool(state)};')
if state: btnName.setChecked(True)
else: btnName.setChecked(False)
def btnCliced(self, i, j, check_box, state):
print(f'btnCliced: i={i}, j={j}, state={state};')
if state: check_box.setChecked(True)
else: check_box.setChecked(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainMenu()
main.show()
sys.exit(app.exec_())
我正在尝试通过 QCheckBox
单击信号传递两个单独的变量:它的 post 按下状态,以及它在列表中的索引。
例如,这是我的代码:
# pip install pyqt5
from PyQt5.QtMultimediaWidgets import *
from PyQt5.QtMultimedia import *
from functools import partial
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import *
import sys
batch_name = ['Test1', 'test2', 'test']
total_batches = 0
unfinished_batches = 0
class MainMenu(QWidget):
def __init__(self, parent = None):
global total_batches, unfinished_batches, batch_name
super(MainMenu, self).__init__(parent)
self.scroll = QScrollArea(self)
self.scroll.setWidgetResizable(True)
self.content = QWidget()
self.scroll.setWidget(self.content)
self.lay = QGridLayout(self.content)
for i, j in enumerate(batch_name):
self.btnName = QPushButton(j, self)
self.btnName.setFlat(True)
self.lay.addWidget(self.btnName, i, 1)
self.check_box = QCheckBox(self)
checkbox_index = partial(self.clickBox, i, i)
self.check_box.stateChanged.connect(checkbox_index)
self.lay.addWidget(self.check_box, i, 0)
total_batches += 1
def clickBox(self, state, index):
print(index)
print(state)
global unfinished_batches, total_batches
if state == Qt.Checked:
unfinished_batches += 1
else:
unfinished_batches -= 1
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainMenu()
main.show()
sys.exit(app.exec_())
(是的,我知道我通过了两次抛出的指数。)
所以可以说,我按第一个 QCheckBox
(Test1
):我应该为状态获得 True
,为索引获得 0
。如果我再次按 Test1
,我希望状态得到 False
,索引再次得到 0
。再举一个例子,如果我按test
(最后一个QCheckBox
),我应该期望得到状态True
,索引得到2
,然后再次按下,我应该为州获得 False
,再次为索引获得 2
。
上面的代码给了我索引,但没有给我它的状态——这就是我坚持的地方。如果按下 QCheckBox
我期望发生的事情,那么我应该得到 True
而我没有。
您没有正确使用 partial
。如果在 partial
中指定了两个参数,则 clickBox
的两个参数都将被 i
的值覆盖。您需要做的只是指定 index
参数的值,并让信号提供 state
参数的值。这可以使用关键字参数来完成,如下所示:
# checkbox_index = partial(self.clickBox, i, i)
checkbox_index = partial(self.clickBox, index=i)
但请注意,state
将是 CheckState enum 中的一个值,因此如果您特别想要获得 True/False
,您可以使用 lambda
代替:
checkbox_index = lambda state, index=i: self.clickBox(state == Qt.Checked, index)
和 clickState
需要看起来像这样:
def clickBox(self, state, index):
print(index)
print(state)
global unfinished_batches, total_batches
if state == True:
unfinished_batches += 1
else:
unfinished_batches -= 1
试一试:
import sys
from functools import partial
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MainMenu(QWidget):
def __init__(self, parent = None):
super(MainMenu, self).__init__(parent)
batch_name = ['Test1', 'test2', 'test']
lay = QGridLayout(self)
for i, j in enumerate(batch_name):
check_box = QCheckBox()
lay.addWidget(check_box, i, 0)
btnName = QPushButton(j)
btnName.setFlat(True)
btnName.setCheckable(True)
btnName.clicked.connect(partial(self.btnCliced, i, j, check_box))
lay.addWidget(btnName, i, 1)
check_box.stateChanged.connect(partial(self.clickBox, i, j, btnName))
def clickBox(self, i, j, btnName, state):
print(f'clickBox: i={i}, j={j}, state={state} : {bool(state)};')
if state: btnName.setChecked(True)
else: btnName.setChecked(False)
def btnCliced(self, i, j, check_box, state):
print(f'btnCliced: i={i}, j={j}, state={state};')
if state: check_box.setChecked(True)
else: check_box.setChecked(False)
if __name__ == '__main__':
app = QApplication(sys.argv)
main = MainMenu()
main.show()
sys.exit(app.exec_())