2012-11-06 62 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

相关问题