2012-11-06 59 views
0

我認爲這不是一個關於特別是Qt的問題,而是一個缺乏編程經驗的問題。返回派生的QTreeWidgetItem

我從QTreeWidgetItem派生了一個類,並添加了一些布爾標誌。當我初始化QTreeWidget我添加由他們倆

_NewItem1=MyQTreeWidgetItem(_treewidget); 

比後來我通過

_NewItem1_1=MyQTreeWidgetItem(_NewItem1); 
_NewItem1_1->boleanvalue1=true; 

新增一些項目,如果我以後要回這些物品我打電話

(MyQTreeWidgetItem)_NewItem1->child(i) 

但這當然只是返回一個帶有新初始化的布爾標誌的MyQTreeWidgetItem。

我是否必須重寫子函數以重新調用我之前初始化的真實項目?

+0

如果您將創建的元素添加到窗口小部件,並且要求窗口小部件讓您的孩子使用索引i,那麼您當然會獲得與之前放置的相同的對象。孩子們被存儲在一個集合中,通常是指針的集合。你的演員順便說一句,應該是'(MyQTreeWidgetItem *)parent-> child(i)' – dowhilefor

回答

1

_NewItem1->child(i)返回指向QTreeWidgetItem的指針,它是MyQTreeWidgetItem的基類。你已經安全地投到MyQTreeWidgetItem,考慮到它可能也是真實的QTreeWidgetItem。這是通過C++中的dynamic_cast實現的,它在運行時檢查類型。

QTreeWidgetItem *item = _NewItem1->child(i); 
MyQTreeWidgetItem *myItem = dynamic_cast<MyQTreeWidgetItem>(item); 
if (myItem) { 
    qDebug() << myItem->boleanvalue1; 
} else { 
    qDebug() << item << "is not of type MyQTreeWidgetItem"; 
} 

在另一方面,類型轉換操作符()允許任何類型轉換爲任何其他類型沒有任何檢查,如果這種轉換是可能的。例如,您已將指針轉換爲QTreeWidget,並將其轉換爲MyQTreeWidgetItem類型的對象。隨後對變量的訪問將產生運行時錯誤或意外結果。

+0

感謝您的回答。我現在使用動態演員來達到這個目的。但我仍然沒有得到我的物品的正確價值。我初始化布爾值爲true,但是當我得到的項目返回值爲false。 – user1540939

+0

從您提供的代碼位中,爲_NewItem1_1設置boleanvalue1並嘗試檢查_NewItem1的第i個孩子,這顯然不是同一個項目。 – divanov

相關問題