Не удается преобразовать из унаследованного класса «Не существует подходящего конструктора для преобразования из «QStandardItem *» в «FolderItem»»

#c #qt #user-interface #inheritance #types

#c #qt #пользовательский интерфейс #наследование #типы

Вопрос:

Привет, я нахожусь в процессе попытки внедрить подкласс библиотеки qt, поставляемой QStandardItemModel и QStandardItem, для отображения элементов в Qtreeview. Кажется, все работает нормально, за исключением случаев, когда я пытаюсь извлечь выбранный объект из древовидного представления и использовать его в качестве родительского объекта для добавления дочерних объектов. Проблема в том, что выбранный объект извлекается как унаследованный тип «QStandardItem», а не мой подтип «FolderItem»:

 FolderItem KSLgui::GetSelectedFolder()
{
    QItemSelectionModel * model = ui.folderView->selectionModel();
    QModelIndexList indexes = model->selectedIndexes();
    return (FolderItem)folderModel.itemFromIndex(indexes.first());
}
  

Я получаю сообщение об ошибке, сообщающее мне, что не существует подходящего конструктора для преобразования из двух типов. Я перегрузил все конструкторы для обоих типов при создании моих подтипов и попытался создать новый конструктор, который исключает QStandardItem в качестве параметра, который, по-видимому, исправляет ошибку, но не функционирует должным образом, поскольку он возвращает только пустой объект, а не выбранный объект:

 FolderItem::FolderItem()
    : QStandardItem()
{
}

FolderItem::FolderItem(const std::string amp; text)
    : QStandardItem(QString::fromStdString(text))
{
}

FolderItem::FolderItem(const QIcon amp; icon, const QString amp; text)
    : QStandardItem(icon, text)
{
}

FolderItem::FolderItem( int rows, int columns)
    : QStandardItem(rows, columns)
{
}

/* returns empty
FolderItem::FolderItem(QStandardItem * stanitem)
{
} */

FolderItem::~FolderItem()
{
}

int FolderItem::type() const
{
    return 1001;
}

FolderStructureModel::FolderStructureModel(QObject *parent)
    : QStandardItemModel(parent)
{
}
  

Я включил то, что, по моему мнению, является важным кодом.

Комментарии:

1. Извините, я, кажется, решил проблему самостоятельно. Я должен был привести к правильному типу точки, я полагаю. Однако я не получаю нарушения доступа… но это шаг в правильном направлении.

2. Лучше не используйте приведения в стиле C — они небезопасны. Лучше используйте static_cast. (FolderItem)…itemFromIndex(…) неверен, поскольку возвращается QStandardItem* (указатель), но вы возвращаете объект FolderItem. Вы должны вернуть FolderItem* и использовать static_cast (если вы уверены в типе).