QT铸造新工艺
我想将我的代码从旧样式转换更新为新样式。我在理解不同类型的强制类型时遇到一些问题 1例QT铸造新工艺,qt,Qt,我想将我的代码从旧样式转换更新为新样式。我在理解不同类型的强制类型时遇到一些问题 1例 if (((QDataItem*)(*it))->GetType()==QDataItem::AudioTrack){ 这里我有一个类“QDataItem”。这包含曲目类型的枚举,如AudioTrack。基于QTreeWidget,我迭代了QTreeWidget项。每个项目代表一个QDataItem。现在有了新的演员阵容,我想做: if ((static_cast<QDataItem*>(
if (((QDataItem*)(*it))->GetType()==QDataItem::AudioTrack){
这里我有一个类“QDataItem”。这包含曲目类型的枚举,如AudioTrack。基于QTreeWidget,我迭代了QTreeWidget项。每个项目代表一个QDataItem。现在有了新的演员阵容,我想做:
if ((static_cast<QDataItem*>(*it))->GetType()==QDataItem::AudioTrack){
QAudioTrackItem类似于QDataItem类。我想在这里做:
QAudioTrackItem *audio_track = reinterpret_cast<QAudioTrackItem*>(*it)
QAudioTrackItem*audio\u track=reinterpret\u cast(*it)
但我不确定在缺少QDataItem的情况下这是否正确
我的结果正常还是有错误
这样做对吗
是的,(QDataItem*)(*it)
和静态转换(*it)
应该与您的代码相同
但是如果您的类具有这样的继承结构:
class QDataItem : QObject {};
class QAudioTrackItem : QDataItem {};
<>你应该考虑使用:
reinterpret\u cast
可能会狠狠揍你一顿:
auto item = new QAudioTrackItem;
auto p1 = reinterpret_cast<QObject *>(item); // OK
auto p2 = reinterpret_cast<QAudioTrackItem *>(p1); // OK
auto p3 = reinterpret_cast<QDataItem *>(item); // Undefined Behavior
auto p4 = reinterpret_cast<QDataItem *>(p1); // Undefined Behavior
auto item=新的QAudioTrackItem;
自动p1=重新解释铸件(项目);//好啊
自动p2=重新解释铸件(p1);//好啊
自动p3=重新解释铸件(项目);//未定义的行为
自动p4=重新解释铸件(p1);//未定义的行为
你为什么需要在这里施放?*it
的类型是什么?所有这些类型在类层次结构中是如何关联的?而且,reinterpret\u cast
几乎总是错误的,它只有很少的有效用例。这可能不是其中之一。。。取决于您正在强制转换的内容和原因。顺便说一句,QObject\u cast
可以降低QObject的后代的成本。@hyde我用QDataItems迭代了一个QTreeWidget。但是要访问QDataItem“GetType”,我需要告诉代码它不是QTReeWidget项,而是QDataItem。但是如果reinerpret是错误的,我必须用什么来代替(QAudioTrackItem*)(QDataItem*)(*it);?我认为重新解释演员阵容是一种“强制”演员阵容。是否需要替换为两个静态类型?是的,QAudioTrackItem为:class QAudioTrackItem:public QDataItem。那么对象投射是正确的选择吗?@ingo你是说QTreeWidgetItem?如果QDataItem是QTreeWidgetItem的别名或子类,则no.QTreeWidgetItem不会继承QObject,因此在这种情况下不能使用QObject_cast()。
if (auto item = qobject_cast<QAudioTrackItem *>(*it)) {
....
}
class QDataItem {};
class QAudioTrackItem : QObject, QDataItem {};
auto item = new QAudioTrackItem;
auto p1 = reinterpret_cast<QObject *>(item); // OK
auto p2 = reinterpret_cast<QAudioTrackItem *>(p1); // OK
auto p3 = reinterpret_cast<QDataItem *>(item); // Undefined Behavior
auto p4 = reinterpret_cast<QDataItem *>(p1); // Undefined Behavior