QTable如何处理最后编辑的单元格?

时间:2012-03-29 06:13:35

标签: qt qt3

当我在QTable内编辑QDialog的单元格并按QDialog的'ok'按钮时,单元格的值为空(如果在编辑之前没有任何内容)。因此,在OkButton的插槽中(即OkButton->clicked()),我访问QTable中每个单元格的值。但是,最后编辑的单元格尚未填充。奇怪!

注意,如果我在按QTable之前点击OkButton内的其他位置,它就会正常工作,也就是说,我可以使用QTable->text(row, col)查看最后编辑过的单元格的值。  有人可以帮助我理解这里导致这种行为的缺失吗?

另一个有趣的行为:在OkButton的广告位中,由于我没有找到值,我会调用QMessageBox::information()。在调试期间,当我在此语句中说'next'(在gdb中)时,会发出valueChanged()信号(我正在捕捉并打印)。我不明白为什么这个信号如此延迟;为什么QTable没有记录更改的值?

2 个答案:

答案 0 :(得分:1)

我没有qt3可用,但我在Qt 4.6中遇到了与QTableView类似的问题。

您可能需要调用函数endEdit(row,col,true,false)

  

void QTable :: endEdit(int row,int col,bool accept,bool replace)[虚拟保护]

     

在row,col处的单元格的就地编辑时调用此函数   被要求停止。如果未编辑或接受单元格   FALSE函数返回,单元格的内容保持不变。

     

如果accept为TRUE,则编辑器的内容必须转移到   相关细胞。如果replace为TRUE,则表示此单元格的当前内容   应该由编辑器的内容替换(这意味着删除   单元格的当前QTableItem并为其创建一个新的单元格   细胞)。否则(如果可能的话)编辑器的内容应该是   设置为此单元格的现有QTableItem。

在我的情况下,我不得不打电话给commitData(),这似乎做同样的工作。

答案 1 :(得分:0)

可能的解决方案之一是以某种方式触发endEdit()。我使用的方法是从OkButton的处理程序/槽中获取以下代码。

mTable->setEnabled(false);  // wil trigger endEdit()
mTable->setEnabled(true);
// Access mTable's cells now
QString cell_content = mTable->text(i, j);

此代码确实解决了这个问题。