2013-07-11 105 views
0

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

void myCellUndoFunc(int row, int col) 
    { 
     table->item(row, col)->undo(); //table is my QTableWidget 
    } 

的问题是,有没有这样的撤销()。 所以我的问题是,可以有一个解决这个问题的方法,也许一些foo-doo组合SIGNAL的& SLOT的?

谢谢! PS:请不要建议使用Model/View框架,因为我在我的应用程序中广泛使用了QTableWidget。对不起,相同。

+0

这可能会占用过多的内存,但也许会创建一个存储最后一个一个细胞的状态。如果你想撤消,只需弹出堆栈顶部的值,并将单元格设置为现在的顶层。 –

+0

@Muckle_ewe,这是我目前正在做的事情,并不满意。这就是为什么我问这个问题:) –

+0

我明白了。那么在那种情况下,我并不完全确定你是如何做到的。也许你已经知道了这一点,但如果你决定采用堆栈方法,那么就有一个QUODStack类。它也有一个撤销插槽,所以你可以使用一个信号插槽的方法,最小的额外编码。 http://qt-project.org/doc/qt-4.8/qundostack.html –

回答

1

也许你应该使用Qt的:: UserRole的您可以指定一个值使用

void QTableWidgetItem::setData (int role, const QVariant & value) [virtual] 

。在你的方法中,你可以通过data()方法访问之前设置的值。你必须做的唯一事情就是始终保持旧的价值。

之前你设定的QTableWidgetItem

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

新的价值和撤消ü可以比

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

检索数据,其中, “TW” 是使用当前QTableWidgetItem contextmenu事件,点击事件或任何你想要的。你也可以创建一个QTableWidgetItem的子类并在你的类的内部处理这个事件,创建一个undo()方法,存储旧值等。

+0

我不明白你的意思。也许你可以显示一些代码? –

+0

@Cool_Coder增加了一个例子。希望能帮助到你。 – Trashed

+0

你能解释哪个信号应该用于连接到你的SLOT?当cellchanged()发出时,该项目的文本已被修改,所以我无法获得以前的文本。 –

相关问题