如何获取PyQt中QGroupbox内QCheckbox的状态

6 投票
1 回答
4706 浏览
提问于 2025-04-17 22:40

我的项目里有一个对话框,里面有多个分组框(QGroupBox)。每个分组框里都有一些复选框,而这些复选框在所有分组框里都是一样的。因为我没有太多的声望,所以不能上传图片 :(

用户可以根据自己的需要选择复选框,然后点击确认按钮。一旦点击了确认按钮,我就需要获取用户勾选的复选框列表。

我是在一个循环里创建这些复选框的,下面是代码:

def createGroupBox(self,livename,shotlist):        

    groupBox = QtGui.QGroupBox("Live-"+livename)        
    grpLayout = QtGui.QVBoxLayout()
    i=0
    while  i != (len(shotlist)-2):
        qChkBx_shot = QtGui.QCheckBox("Shot-"+shotlist[i], self)
        qChkBx_shot.stateChanged.connect(lambda: self.groupcheckBoxToggled(livename,qChkBx_shot.text()))
        grpLayout.addWidget(qChkBx_shot,QtCore.Qt.AlignCenter)
        i +=1

    groupBox.setLayout(grpLayout)
    return groupBox

分组框的代码如下:

def InitUi(self,livelist,shotlist):
    scrolllayout = QtGui.QGridLayout()

    scrollwidget = QtGui.QWidget()
    scrollwidget.setLayout(scrolllayout)

    scroll = QtGui.QScrollArea()
    scroll.setWidgetResizable(True)  # Set to make the inner widget resize with scroll area
    scroll.setWidget(scrollwidget)

    i=0
    length = len(livelist)-2
    x,y=0,0 

    while x <=  math.ceil(length/4):
        for y in range(0,4):
            if (i < (length)):
                groupbox=self.createGroupBox(livelist[i],shotlist)
                self.groupboxes.append(groupbox)
                scrolllayout.addWidget(groupbox, x, y)
            y +=1
            i +=1
        x+=1

    self.Okbutton = QtGui.QPushButton('OK',self)
    self.Okbutton.clicked.connect(lambda: self.buttonPressed())
    self.Okbutton.setMaximumWidth(100)
    layout = QtGui.QVBoxLayout()
    layout.addWidget(scroll)

    layout.addWidget(self.Okbutton,QtCore.Qt.AlignRight)
    self.setLayout(layout)        
    self.setWindowTitle("Customized LiveShotLiveSwitching")
    self.resize(1200, 500) 
    self.show()

我想问的是,我可以获取到哪个分组框被激活了,但却无法获取到在那个分组框下被勾选的复选框列表。

有没有人能帮我解决这个问题...

1 个回答

9

把每个复选框的父级设置为这个组框:

    qChkBx_shot = QtGui.QCheckBox("Shot-"+shotlist[i], groupBox)

现在你可以通过以下方式遍历组框里的复选框:

    for checkbox in groupbox.findChildren(QtGui.QCheckBox):
        print('%s: %s' % (checkbox.text(), checkbox.isChecked()))

如果想知道某个复选框属于哪个组框,可以这样做:

    groupbox = checkbox.parent()

撰写回答