C++ 是否撤消Qt中QTableWidget的单个单元格?

C++ 是否撤消Qt中QTableWidget的单个单元格?,c++,qt,C++,Qt,我的主窗口类中有一个QTableWidget。 我找不到可以撤消指定单元格文本更改的功能。 我想做的是: void myCellUndoFunc(int row, int col) { table->item(row, col)->undo(); //table is my QTableWidget } 问题是没有这样的撤销()。 所以我的问题是,是否有一个解决这个问题的方法,使用一些foo-doo组合的信号和插槽 谢谢 PS:请不要建议使用

我的主窗口类中有一个QTableWidget。 我找不到可以撤消指定单元格文本更改的功能。 我想做的是:

    void myCellUndoFunc(int row, int col)
    {
        table->item(row, col)->undo(); //table is my QTableWidget
    }
问题是没有这样的撤销()。 所以我的问题是,是否有一个解决这个问题的方法,使用一些foo-doo组合的信号和插槽

谢谢


PS:请不要建议使用模型/视图框架,因为我在应用程序中广泛使用了QTableWidget。抱歉。也许你应该使用

void QTableWidgetItem::setData ( int role, const QVariant & value ) [virtual]
使用Qt::UserRole可以指定最后一个值。在方法中,u可以使用data()-方法访问以前设置的值。你唯一要做的就是始终保持旧值为最新值

在设置QTableWidgetItem的新值之前

tw->setData(Qt::UserRole,tw->text())

在撤消时,您可以使用

tw->setText(tw->data(Qt::UserRole).toString())


其中“tw”是使用contextmenu事件、clicked事件或您想要的任何内容的当前QTableWidgetItem。您还可以将QTableWidgetItem子类化,并在类内部处理整个问题,创建一个undo()-方法,存储旧值,等等。

这可能会占用太多内存,但可能会创建一个存储单元格最后状态的堆栈。如果要撤消,只需弹出顶部堆栈值并将单元格设置为当前位于顶部的任何值即可。@Muckle_ewe,这就是我目前正在做的事情&我对此不满意。这就是我问这个问题的原因:)我明白了。如果是那样的话,我不完全确定你怎么能做到。也许您已经知道了这一点,但是如果您决定采用堆栈方法,则有一个QUndoStack类。它还有一个撤销槽,因此您可以使用信号槽方法,只需最少的额外编码@酷_编码器Qt中没有魔法可以自动为您实现这一点,所以您总是会在某个地方保留一堆旧值
QUndoStack
是实现这一点的Qt方法,尽管如果为许多单元保留单独的堆栈,这可能会很昂贵。它还取决于您要维护多少撤消/重做历史。@Dan,正如我所提到的,我只希望有上一个值,这样,如果用户输入的值无效(例如:字符串而不是数字),那么我可以重置上一个值,而不是设置一些默认值。我处理的是数百万个单元,因此每个单元的备份副本过载并不总是可行的,无论是处理器方面还是内存方面。我不明白你的意思。也许你可以展示一些代码?@Cool\u Coder添加了一个例子。希望对您有所帮助。您能解释一下连接插槽时应该使用哪个信号吗?发出cellchanged()时,项目的文本已被修改,因此我无法获取以前的文本。用户是否直接编辑单元格?可能会对事件做出反应,例如单击事件并编写自己的编辑方法。或者将QTableWidget子类化,并重写
void QTableWidget::editItem(QTableWidgetItem*item)
方法。需要更多关于用户如何编辑单元格或如何在“表格”窗口小部件中修改数据的信息该表格由用户编辑,就像在MS Excel中一样。目前,我在动态内存中维护一个QList*myCell,它基本上存储每个单元格的最新有效值。我已经创建了自己的插槽,该插槽连接到tw的cellChanged()信号。现在,此插槽所做的是检查QTableWidgetItem中的值是否有效。如果有效,我将把这个值更新到相应的myCell中。如果没有,则放弃此新值,从myCell获取值并将其设置为QTableWidgetItem。所有这些机制都有点像我自己的QDoubleValidator。还有别的吗?