2013-07-11 104 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()發出時,該項目的文本已被修改,所以我無法獲得以前的文本。 –

相關問題