1
votes

I am using a QTableWidget to display and edit a data matrix. For validation purpose, I used the QLineEdit as items in this table. As following,

        pTable=new QTableWidget(N,N,this);
        pItem=new QLineEdit();
        pItem->setText(tr("%1").arg(pInfra->adjacencyM(i,j)));
        rx=new QRegExp("0|1");
        validatorRegexp=new QRegExpValidator(*rx,0);
        pItem->setValidator(validatorRegexp);
        pTable->setCellWidget(i,j,pItem);

Since I want to know if data in certain cell has been changed, so I tried cellChanged(int, int) signal, and connect it with my own slot cellEdited(int,int), like this

connect(pTable,SIGNAL(cellChanged(int,int)),this, SLOT(cellEdited(int,int)));

But, when I edit QLineEdit in the cell, I can not catch this signal. When will this signal be fired? Or can I do this using another signal or in some other way? Thanks!

2
Not aware about causes of this problem. Considering another ways. You can catch QLineEdit signal textChanged and use QSignalMapper to bind signal, fired by each QLineEdit to particular cell number. Maybe itsn't the best qway to do that, but you can use it in case this problem won't be solved. - beduin
Thank you, beduin, I used QSignalMapper, and it works great. - Zhe Duan
You are welcome. I've posted it as an answer - you can accept it then) - beduin

2 Answers

1
votes

The problem is that the cellChanged() signal is emittet only if the table model is issued the setData() method, which normally comes from the QLineEdit of the delegate. Since You have your own mechanism by setting the cell widget the setData() method of the model will never be called. Which means you'll have to connect to the textChanged() or the textEdited() signal of the QLineEdit object you put in the cells.

Another valid option is the approach mentioned by beduin in the comment.

Also possible: You could subclass the used delegate and make it create QLineEdit objects with your validator. Which would be the cleanest approach since you don't interfere with the model/view architecture and can rely on the signals the table object is sending.

Best regards D

0
votes

Not aware about causes of this problem. Considering another ways. You can catch QLineEdit signal textChanged and use QSignalMapper to bind signal, fired by each QLineEdit to particular cell number. Maybe itsn't the best qway to do that, but you can use it in case this problem won't be solved.