2011-05-05 54 views
1

我正在使用QTableWidget来显示和编辑数据矩阵。为了验证目的,我使用QLineEdit作为此表中的项目。作为继,何时在QTableWidget中触发cellChanged信号?

 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); 

因为我想知道,如果在某小区的数据已经改变,所以我尝试cellChanged(INT,INT)信号,并将它与我自己的插槽cellEdited(INT,INT)连接,如同这

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

但是,当我编辑单元格中的QLineEdit,我无法捕捉到这个信号。这个信号何时会被解雇?或者我可以使用另一个信号或以其他方式来做到这一点? 谢谢!

+1

不知道这个问题的原因。考虑另一种方法。您可以捕获'QLineEdit'信号'textChanged'并使用[QSignalMapper](http://doc.trolltech.com/latest/qsignalmapper.html)将每个'QLineEdit'触发的信号绑定到特定的信元编号。也许它不是最好的解决办法,但是如果这个问题不能解决,你可以使用它。 – beduin 2011-05-05 04:30:37

+0

谢谢beduin,我使用了QSignalMapper,它效果很好。 – 2011-05-05 19:09:56

+0

不客气。我已经发布了它作为答案 - 你可以接受它) – beduin 2011-05-05 19:49:00

回答

0

不知道这个问题的原因。考虑另一种方法。您可以捕获QLineEdit信号textChanged并使用QSignalMapper绑定信号,由每个QLineEdit发射到特定的蜂窝号码。也许它不是最好的解决办法,但是如果这个问题不能解决,你可以使用它。

0

问题是仅当表格模型是setData()方法(通常来自代表的QLineEdit)发出cellChanged()信号时才会发射信号。由于您通过设置单元格窗口小部件而拥有自己的机制,因此模型的setData()方法将永远不会被调用。这意味着您必须连接到放置在单元中的QLineEdit对象的textChanged()textEdited()信号。

另一个有效的选择是beduin在评论中提到的方法。

也有可能:您可以继承使用的委托并使其与验证器一起创建QLineEdit对象。这将是最干净的方法,因为您不会干扰模型/视图体系结构,并可以依赖表对象发送的信号。

问候 d

+0

非常感谢。似乎我没有遵循模型/视图框架。由于我不想子类化,我会先尝试beduin的方法。 – 2011-05-05 07:55:29

相关问题