0

QTableWidgetItema を子クラスにキャストしようとしています。次のようなクラス階層があります。

(Parent -> Child)
QTableWidgetItem -> SortableTableWidgetItem -> EnhancedTableWidgetItem

また

class SortableTableWidgetItem : public QTableWidgetItem

class EnhancedTableWidgetItem : public SortableTableWidgetItem

ほとんどの場合、アイテムをQTableWidgetItems として使用します。そのコードは既に記述されており、変更すべきではないからです。ただし、場合によってはEnhancedTableWidgetItem、ポインターが与えられた後にデータにアクセスする必要がありますQTableWidgetItem(これはEnhancedTableWidgetItem、オブジェクトを作成して呼び出し元のコードに最初に渡したためです)。私はこのようにキャストしようとしました:

QTableWidgetItem item = getItem();

// This fails to compile saying "error: no matching function for call to ‘qobject_cast(QTableWidgetItem*)’"
EnhancedTableWidgetItem *eItem = qobject_cast<EnhancedTableWidgetItem*>( item );

// This also fails to compile and says: "error: invalid conversion from ‘QTableWidgetItem*’ to ‘EnhancedTableWidgetItem*’"
EnhancedTableWidgetItem *eItem = dynamic_cast<EnhancedTableWidgetItem*>( item );

私は、これが完全に合法であり、常に行われている Java の世界から来ました。基本クラスのポインターを子クラスのポインターにキャストできないのはなぜですか? どうすればこれを達成できますか?

4

3 に答える 3

1

QTableWidgetItem は QObject から派生したものではないため、qobject_cast<> を使用できません。

于 2013-05-09T18:18:11.273 に答える
1

qobject_castから継承するクラス専用ですQObjectitemが本当にカスタム タイプである場合は、動的キャストを使用します

EnhancedTableWidgetItem* eItem = dynamic_cast<EnhancedTableWidgetItem*>( item );

どうでも。オブジェクトをポインターにキャストしています。効果がないでしょう。それでも、私が前に言ったことはまだ適用されます

于 2013-05-09T17:37:33.460 に答える