Как привести QTableWidgetItem к пользовательскому дочернему классу

Я пытаюсь разыграть QTableWidgetItem в детский класс. У меня есть иерархия классов, как это:

(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, где это совершенно законно и делается постоянно. Почему я не могу привести указатель базового класса в указатель дочернего класса? Как я могу сделать это?

0

Решение

qobject_cast только для класса, который наследуется от QObject, Если item действительно ваш пользовательский тип, то используйте динамическое приведение

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

Не берите в голову. вы приводите объект к указателю. Она не будет работать. Тем не менее, то, что я ранее сказал, все еще применимо

1

Другие решения

Вы путаетесь с указателями и ценностями. Я думаю твой getItem() не должен возвращать значение (copy), он должен возвращать указатель, поэтому имейте это:

QTableWidgetItem *item = getItem(); // getItem() returns pointer
auto eItem = dynamic_cast<EnhancedTableWidgetItem*>( item );

(С помощью auto C ++ 11 и выше, что намного лучше, но если вы застряли со старым компилятором, используйте EnhancedTableWidgetItem* вместо.)

1

QTableWidgetItem не является производным от QObject, поэтому он не может использовать qobject_cast<>.

1
По вопросам рекламы [email protected]