这个特定的难题很难解释,所以我会尽我所能。
在Qt框架中,有两个类:QTreeWidget和QTreeWidgetitem。
我已经将QTreeWidgetitem子类化了:
class MyQTreeWidgetitem : public QObject, public QTreeWidgetitem
{
...
public:
int myCustomVariable;
}
我将此添加到QTreeWidget中,执行以下操作:
MyQTreeWidgetitem *item = new MyQTreeWidgetitem;
item->myCustomVariable = 10;
tree->addTopLevelItem(item);
现在,如果我需要调用tree-> topLevelItem(x),我得到的就是QTreeWidgetitem *。
然而,我所追求的是MyQTreeWidgetitem *所以我:
MyQTreeWidgetItem *theitem = (MyQTreeWidgetItem*)tree->topLevelItem(n);
问题是theitem-> myCustomVariable不再等于10.
有没有办法保持MyQTreeWidgetitem完好无损?
答案 0 :(得分:3)
我不知道Qq,但你可以尝试做一个正确的dynamic_cast<>
,它将验证对象是否实际上是MyQTreeWidgetItem*
(否则返回0),以及正确执行指针转换(我不确定C风格的演员表是否返回了QObject
的地址)。您可以打印指针并更深入地了解这个问题。
答案 1 :(得分:2)
在C ++程序中使用C风格的强制转换通常是一个坏主意。将它用于原始类型可能没问题,但对于类应该避免使用它。虽然在这种特殊情况下它可能没问题,但有一天你会因为它而陷入深深的麻烦。
使用dynamic_cast<>
可能没问题。由于您不使用虚拟继承,您可能也希望使用static_cast<>
,它的优点是不需要RTTI(某些平台可能支持不好)并且速度稍快。我还听说dynamic_cast有时在共享库边界上无法正常工作。
对于QObject子类之间的向下转换,Qt中还有qobject_cast<>
可用。在这种情况下它不会帮助你,因为QTreeWidgetItem不是QObject的子类,但可以帮助你在其他地方需要从QObject *转换到MyQTreeWidgetItem *。如果你使用Qt插件机制,它也用于转换为接口。