作者:zhang时代小窝 | 来源:互联网 | 2023-10-10 12:01
我正试图通过QCheckBox
单击信号传递两个单独的变量:其按下后的状态以及其在列表中的索引。
例如,这是我的代码:
# 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)
self.check_box.stateChanged.connect(checkbox_index)
self.lay.addWidget(self.check_box,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,0)
btnName = QPushButton(j)
btnName.setFlat(True)
btnName.setCheckable(True)
btnName.clicked.connect(partial(self.btnCliced,j,check_box))
lay.addWidget(btnName,1)
check_box.stateChanged.connect(partial(self.clickBox,btnName))
def clickBox(self,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,check_box,state):
print(f'btnCliced: i={i},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_())