【问题标题】:Send state of a QCheckBox and a number when clicked单击时发送 QCheckBox 的状态和数字
【发布时间】:2019-11-22 15:27:48
【问题描述】:

我试图通过QCheckBox clicked 信号传递两个单独的变量:它的按下后状态,以及它在列表中的索引。

例如,这是我的代码:

# 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,而我没有。

【问题讨论】:

    标签: python pyqt5 signals-slots qcheckbox


    【解决方案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_())
    

    【讨论】:

    • 这也非常好用!!!哇!非常感谢你做的这些!这对我来说会更好,即使我有不同的解决方案,但这使它更容易,因为我得到了它对应的名称!谢谢!
    【解决方案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
    

    【讨论】:

    • 这确实有效,但不像我预期的那样,但我认为我可以使用它。非常感谢!
    • @JareBear 你期待什么?
    • 一个TrueFalse 的值,如果可以的话,这很有意义,但没什么大不了的。
    • @JareBear 我添加了另一个解决方案。
    • 它对我不起作用..但没关系,第一个解决方案有效。
    猜你喜欢
    • 2017-06-07
    • 1970-01-01
    • 2020-06-07
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2021-11-14
    相关资源
    最近更新 更多