当我在QTable
内编辑QDialog
的单元格并按QDialog
的'ok'按钮时,单元格的值为空(如果在编辑之前没有任何内容)。因此,在OkButton
的插槽中(即OkButton->clicked()
),我访问QTable
中每个单元格的值。但是,最后编辑的单元格尚未填充。奇怪!
注意,如果我在按QTable
之前点击OkButton
内的其他位置,它就会正常工作,也就是说,我可以使用QTable->text(row, col)
查看最后编辑过的单元格的值。
有人可以帮助我理解这里导致这种行为的缺失吗?
另一个有趣的行为:在OkButton
的广告位中,由于我没有找到值,我会调用QMessageBox::information()
。在调试期间,当我在此语句中说'next'(在gdb中)时,会发出valueChanged()
信号(我正在捕捉并打印)。我不明白为什么这个信号如此延迟;为什么QTable
没有记录更改的值?
答案 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);
此代码确实解决了这个问题。