Я пытаюсь разыграть QTableWidgetItem
в детский класс. У меня есть иерархия классов, как это:
(Parent -> Child)
QTableWidgetItem -> SortableTableWidgetItem -> EnhancedTableWidgetItem
или же
class SortableTableWidgetItem : public QTableWidgetItem
class EnhancedTableWidgetItem : public SortableTableWidgetItem
По большей части я использую предметы как QTableWidgetItem
s потому что этот код уже написан и не должен изменяться. Однако в некоторых случаях мне нужно получить доступ к данным в 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, где это совершенно законно и делается постоянно. Почему я не могу привести указатель базового класса в указатель дочернего класса? Как я могу сделать это?
qobject_cast
только для класса, который наследуется от QObject
, Если item
действительно ваш пользовательский тип, то используйте динамическое приведение
EnhancedTableWidgetItem* eItem = dynamic_cast<EnhancedTableWidgetItem*>( item );
Не берите в голову. вы приводите объект к указателю. Она не будет работать. Тем не менее, то, что я ранее сказал, все еще применимо
Вы путаетесь с указателями и ценностями. Я думаю твой getItem()
не должен возвращать значение (copy), он должен возвращать указатель, поэтому имейте это:
QTableWidgetItem *item = getItem(); // getItem() returns pointer
auto eItem = dynamic_cast<EnhancedTableWidgetItem*>( item );
(С помощью auto
C ++ 11 и выше, что намного лучше, но если вы застряли со старым компилятором, используйте EnhancedTableWidgetItem*
вместо.)
QTableWidgetItem не является производным от QObject, поэтому он не может использовать qobject_cast<>.