单击时发送QCheckBox的状态和数字

2024-04-19 03:38:50 发布

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

我试图通过一个QCheckBox点击的信号传递两个独立的变量:它的post pressed状态和它在列表中的索引

例如,这是我的代码:

# 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_())

(是的,我知道我两次通过了索引。)

比如说,我按下第一个QCheckBoxTest1):我应该得到True作为状态,0作为索引。如果我再次按Test1,我希望得到状态的False,以及索引的0。再举一个例子,如果我按test(最后一个QCheckBox),我应该得到状态的True,索引的2,再按一次,状态的False,索引的2

上面的代码给了我索引,但它没有给我它的状态-这就是我一直坚持的。如果QCheckBox被按下,我期望发生什么,那么我应该得到True我没有得到的地方


Tags: namefromimportselftrueindex状态batch
2条回答

你没有正确使用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_())

enter image description here

相关问题 更多 >