Python Forum
QTableWidget - Retrieve content from a cell
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
QTableWidget - Retrieve content from a cell
#1
Hi, guys...

I have a qtablewidget with 3 columns that shows registers from my database.
Each row has a checkbox in the 3rd column.
Im trying to retrieve the content in the first cell that has the checkbox checked.
Here is the code :
items = []
for i in range(self.tblparc.rowCount()):
  item = self.tblparc.item(i,2)
  if item.checkState() == QtCore.Qt.Checked:
    items.append(self.tblparc.itemAt(i,0))
Is it right ? How can I retrieve the contents ?
Thanks
Reply
#2
Do you want the text?

items.append(self.tblparc.itemAt(i,0).text())
Reply
#3
Yes...I want the text. Tried here and don't understand why the reply repeats the first one that he find.
Reply
#4
An Example

from PyQt5.QtWidgets import (QMainWindow, QApplication, QCheckBox, 
                              QTableWidget, QTableWidgetItem)

from PyQt5.QtCore import Qt


class mainWin(QMainWindow):
    def __init__(self, parent=None):
        super(mainWin, self).__init__(parent)
        self.setupUI()

    def setupUI(self):
        self.setGeometry(0, 0, 800, 600)
        self.setContentsMargins(10, 5, 10, 5)
        self.lb = QTableWidget(20, 2)
        self.setCentralWidget(self.lb)
        self.make_table()
        self.get_checked_items()

    def make_table(self):
        for row in range(self.lb.rowCount()):
            self.lb.setItem(row, 0, QTableWidgetItem(f"cell {row}"))
            self.lb.setCellWidget(row, 1, QCheckBox())
        ### check every 3rd for testing
        for row in range(0, 19, 3):
            self.lb.cellWidget(row, 1).setChecked(True)
            
            
    def get_checked_items(self):
        items = []
        for row in range(self.lb.rowCount()):
            if self.lb.cellWidget(row, 1).checkState() == Qt.Checked:
                items.append(self.lb.item(row, 0).text())
                
        print(f"checked items: {items}")


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = mainWin()
    win.setWindowTitle("Example")
    win.show()

    sys.exit(app.exec_())
Output:
checked items: ['cell 0', 'cell 3', 'cell 6', 'cell 9', 'cell 12', 'cell 15', 'cell 18']
Reply
#5
You've got right to the point...my code was:
checkbox_item = QTableWidgetItem()
checkbox_item.setFlags(checkbox_item.flags() | Qt.ItemIsUserCheckable) 
checkbox_item.setCheckState(Qt.Unchecked)
 self.tblparc.setItem(row,2,checkbox_item)
And I was getting "AttributeError: 'NoneType' object has no attribute 'checkState'"

Danke schon...
Reply
#6
Use QTableWidgetItem for text and QCheckBox as CellWidget
Reply
#7
But it can also work with a checkable QTableWidgetItem

from PyQt5.QtWidgets import (QMainWindow, QApplication, QPushButton, 
                              QTableWidget, QTableWidgetItem, QMessageBox)
  
from PyQt5.QtCore import Qt
  
  
class mainWin(QMainWindow):
    def __init__(self, parent=None):
        super(mainWin, self).__init__(parent)
        self.setupUI()
  
    def setupUI(self):
        self.setGeometry(0, 0, 800, 600)
        self.setContentsMargins(10, 5, 10, 5)
        
        tbar = self.addToolBar("Toolbar")
        btn = QPushButton("check selected", clicked=self.get_checked_items)
        tbar.addWidget(btn)
        
        self.lb = QTableWidget(20, 2)
        self.setCentralWidget(self.lb)
        self.make_table()
  
    def make_table(self):
        for row in range(self.lb.rowCount()):
            self.lb.setItem(row, 0, QTableWidgetItem(f"cell {row}"))
            checkbox_item = QTableWidgetItem()
            checkbox_item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable) 
            checkbox_item.setCheckState(Qt.Unchecked)
            self.lb.setItem(row, 1, checkbox_item)
        ### check every 3rd for testing
        for row in range(0, 19, 3):
            self.lb.item(row, 1).setCheckState(Qt.Checked)
              
              
    def get_checked_items(self):
        items = []
        for row in range(self.lb.rowCount()):
            if self.lb.item(row, 1).checkState() == Qt.Checked:
                items.append(self.lb.item(row, 0).text())
                  
        message = f"checked items: {items}"
        print(message)
        msg = QMessageBox(1, "checked items", '\n'.join(items), QMessageBox.Ok)
        msg.exec()
  
  
if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    win = mainWin()
    win.setWindowTitle("Example")
    win.show()
  
    sys.exit(app.exec_())
Reply
#8
All right...thanks.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  PyQt5 QTableWidget duplicates rows number Ninja2112 6 650 Apr-03-2025, 01:26 AM
Last Post: Ninja2112
  [PyQt] QTableWidget print problem JokerSob 8 6,887 Jan-28-2022, 06:08 PM
Last Post: Axel_Erfurt
  [PyQt] How do I display the DB table I will choose from the QComboBox in QTableWidget JokerSob 2 3,141 Aug-05-2021, 03:00 PM
Last Post: JokerSob
  Displaying database info in QTableWidget thewolf 6 8,257 Apr-03-2021, 02:49 PM
Last Post: thewolf
  [PyQt] Help: check content of combobox in horizontal header of QTableWidget mart79 1 4,549 Jul-26-2020, 06:18 PM
Last Post: deanhystad
  [PyQt] Add validation (regex) to QTableWidget cells mart79 0 3,556 May-05-2020, 12:51 PM
Last Post: mart79
  [PyQt] QTableWidget stylesheet error mart79 3 8,793 Feb-26-2020, 04:54 PM
Last Post: Denni
  [PyQt] Pyqt5: How do you make a button that adds new row with data to a Qtablewidget YoshikageKira 6 9,401 Jan-02-2020, 04:32 PM
Last Post: Denni
  [PyQt] QTableWidget cell validation littleGreenDude 1 9,186 Jan-18-2019, 07:44 PM
Last Post: littleGreenDude
  Printing QTableWidget to an DIN A4 page Mady 2 8,405 Dec-18-2018, 06:56 PM
Last Post: Axel_Erfurt

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020