0

当我编辑QTable内部的一个单元格QDialog并按下 'ok' 按钮时QDialog,该单元格的值什么都没有(如果在编辑之前它什么都没有)。因此,在OkButton(ie OkButton->clicked()) 的插槽中,我访问QTable. 但是,最后编辑的单元格尚未填充。奇怪的!

QTable请注意,如果我在按下之前单击其他地方OkButton,它工作正常,也就是说,我可以看到最后编辑的单元格的值QTable->text(row, col)。有人可以帮我理解这里缺少什么导致这种行为吗?

另一个有趣的行为:在 的插槽中OkButton,因为我没有找到值,所以我调用QMessageBox::information(). 在调试期间,当我在此语句中说“下一个”(在 gdb 中)时,valueChanged()会发出信号(我正在捕捉它并打印)。我不明白为什么这个信号这么延迟;为什么QTable不早点记录改变的值??

4

2 回答 2

1

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

您可能必须调用函数endEdit(row,col,true,false)

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

当行的单元格就地编辑时调用此函数,请求 col 停止。如果单元格未被编辑或接受为 FALSE,则函数返回并且单元格的内容保持不变。

如果接受为 TRUE,则必须将编辑器的内容传输到相关单元格。如果 replace 为 TRUE,则该单元格的当前内容应替换为编辑器的内容(这意味着删除该单元格的当前 QTableItem 并为该单元格创建一个新的 QTableItem)。否则(如果可能的话)编辑器的内容应该设置为此单元格的现有 QTableItem。

在我的情况下,我不得不调用commitData(),这似乎做了同样的工作。

于 2012-03-29T14:19:34.323 回答
0

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

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

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

于 2012-03-29T15:19:32.300 回答