Mike
Mike

Reputation: 37

how to work signals from QTableWidget cell with cellWidget

I have worked on QTableWidget,the question is if cell was set by QTableWidgetItem the signal 'itemChanged' works well which easily get row/column/text, but if the cell was set by cellWidget like QLineEdit then singal 'itemChanged' doesn't work, singal 'textChanged' or else from QLineEdit itself works, but it's too hard if hundreds of QLineEdit, is it possible to work like itemChanged? please help, thank you.

Code as below:

import sys
from PyQt5.QtWidgets import *

class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()
    def initUI(self):
        self.setWindowTitle("QTableWidget Example")
        self.resize(400,300)
        self.layout=QHBoxLayout()
        self.TableWidget=QTableWidget(4,3)


        self.TableWidget.setHorizontalHeaderLabels(['Nmae','Sex','Weight(kG)'])

        # self.newItem=QTableWidgetItem('Jack')
        # self.TableWidget.setItem(0,0,self.newItem)

        # self.newItem=QTableWidgetItem('Male')
        # self.TableWidget.setItem(0,1,self.newItem)

        # self.newItem=QTableWidgetItem('160')
        # self.TableWidget.setItem(0,2,self.newItem)

        self.newItem=QLineEdit('Jack')        
        self.TableWidget.setCellWidget(0,0,self.newItem)        
        self.newItem.textChanged.connect(self.txtChange)

        self.newItem=QLineEdit('Male')        
        self.TableWidget.setCellWidget(0,1,self.newItem)        

        self.newItem=QLineEdit('160')        
        self.TableWidget.setCellWidget(0,2,self.newItem)        

        self.layout.addWidget(self.TableWidget)

        self.setLayout(self.layout)
        self.TableWidget.itemChanged.connect(self.changeTest)

    def changeTest(self,item):
        # print('test')
        print(item.text())

    def txtChange(self,txt):
        print(txt)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    win=Table()
    win.show()
    sys.exit(app.exec_())

Upvotes: 1

Views: 799

Answers (1)

eyllanesc
eyllanesc

Reputation: 244282

One possible solution is not to use cellWidget but to permanently open the delegate editors:

class StyledItemDelegate(QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        return QLineEdit(parent)


class Table(QWidget):
    def __init__(self):
        super(Table, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle("QTableWidget Example")
        self.resize(400, 300)

        self.tableWidget = QTableWidget(4, 3)
        delegate = StyledItemDelegate(self)
        self.tableWidget.setItemDelegate(delegate)

        self.tableWidget.setHorizontalHeaderLabels(["Nmae", "Sex", "Weight(kG)"])
        self.tableWidget.itemChanged.connect(self.changeTest)

        lay = QHBoxLayout(self)
        lay.addWidget(self.tableWidget)

        it = QTableWidgetItem("Jack")
        self.tableWidget.setItem(0, 0, it)
        self.tableWidget.openPersistentEditor(it)

        it = QTableWidgetItem("Male")
        self.tableWidget.setItem(0, 1, it)
        self.tableWidget.openPersistentEditor(it)

        it = QTableWidgetItem("160")
        self.tableWidget.setItem(0, 2, it)
        self.tableWidget.openPersistentEditor(it)

    def changeTest(self, item):
        print(item.text())

Upvotes: 2

Related Questions