Search code examples
pythonpython-3.xpyside2

How do I access which QCheckBox is checked in PySide2?


I am developing a GUI in PySide2, in which I am displaying a QCheckBoxes in a QScrollArea using a loop, and I want to access those checkboxes which are checked by the user.

import sys
from PySide2 import QtWidgets, QtCore
from PySide2.QtWidgets import QCheckBox
class MyWindow(QtWidgets.QMainWindow):
    def __init__(self, data):
        super().__init__()

        self.data = data

        self.scrollArea = QtWidgets.QScrollArea()
        self.scrollArea.setWidgetResizable(True)
        self.setCentralWidget(self.scrollArea)
        self.widget = QtWidgets.QWidget()
        self.scrollArea.setWidget(self.widget)

        button = QtWidgets.QPushButton("Click me")
        button.clicked.connect(self.onButton)

        self.grid = QtWidgets.QGridLayout(self.widget)
        self.grid.addWidget(button)

    def onButton(self):
        row = 1
        for item in self.data:
            checkBox_measurement = QCheckBox(item)
            self.grid.addWidget(checkBox_measurement, row, 0)

            line = QtWidgets.QFrame()
            line.setFrameShape(QtWidgets.QFrame.HLine)
            self.grid.addWidget(line, row+1, 0, 1, 2)
            row += 2
data = ['Title 1', 'Title 2', 'Title 3' , 'Title 4', 'Title 5', 'Title 6' ,'Title 7', 'Title 8', 'Title 9' ]
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myWindow = MyWindow(data)
    myWindow.resize(500, 300)
    myWindow.show()
    app.exec_()

This is the code which create checkboxes in my window, how would I know that which checkboxes are checked by user


Solution

  • Try it:

    import sys
    #from PySide2 import QtWidgets, QtCore
    #from PySide2.QtWidgets import QCheckBox
    from PyQt5 import QtWidgets, QtCore
    from PyQt5.QtWidgets import QCheckBox
    
    class MyWindow(QtWidgets.QMainWindow):
        def __init__(self, data):
            super().__init__()
    
            self.data = data
    
            self.scrollArea = QtWidgets.QScrollArea()
            self.scrollArea.setWidgetResizable(True)
            self.setCentralWidget(self.scrollArea)
            self.widget = QtWidgets.QWidget()
            self.scrollArea.setWidget(self.widget)
    
            button = QtWidgets.QPushButton("Click me")
            button.clicked.connect(self.onButton)
    
            self.grid = QtWidgets.QGridLayout(self.widget)
            self.grid.addWidget(button)
    
        def onButton(self):
            row = 1
            for item in self.data:
                checkBox_measurement = QCheckBox(item)
                checkBox_measurement.stateChanged.connect(self.clickBox)     # +
    
                self.grid.addWidget(checkBox_measurement, row, 0)
    
                line = QtWidgets.QFrame()
                line.setFrameShape(QtWidgets.QFrame.HLine)
                self.grid.addWidget(line, row+1, 0, 1, 2)
                row += 2
    
    
        def clickBox(self, state):                                           # +
            print(state, self.sender().text())                               # +
    
    
    data = ['Title 1', 'Title 2', 'Title 3' , 'Title 4', 'Title 5', 'Title 6' ,'Title 7', 'Title 8', 'Title 9' ]
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        myWindow = MyWindow(data)
        myWindow.resize(500, 300)
        myWindow.show()
        app.exec_()
    

    enter image description here