Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Приведение типов
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
Creator
Как привести указатель на объект класса QTreeWidgetItem к указателю на класс, унаследованному от QTreeWidgetItem?
ViGOur
Примерно так:
QTreeWidgetItem *pTreeBase = new QTreeWidgetItem;
//...
CMyTreeWidgetItem *pTree = (CMyTreeWidgetItem*)pTreeBase;
Tonal
Таки лучше dynamic_cast.
Ну или в рукопашную:
* определить константу типа MyUserType = QTreeWidgetItem::UserType + 1
* В конструкторе её передать, перед приведением проверять что item.type() == MyUserType
* Ну и приводить static_cast-ом - хотя бы от глупых ошибок защитит. :)
ViGOur
Tonal, для новичков в программировании аналог reinterpret_cast самое то. :)
Litkevich Yuriy
А я бы qobject_cast использовал:
CMyTreeWidgetItem *pTree = qobject_cast<CMyTreeWidgetItem*>(pTreeBase);
Tonal
QTreeWidgetItem не наследник QObject-а, поэтому есть некоторые сомнения в работоспособности qobject_cast для него...
Creator
У меня в коде для наследуемого класса был указан макрос Q_OBJECT.
И из-за этого не работали все вышеприведенные методы
Tonal
dynamic_cast может не работать только в случае явного отключения rtti, а static_cast и приведение в старом стиле - в случае синтаксической ошибки.
Наличие или отсутствие макроса Q_OBJECT на их вообще не влияет.

Какие именно все методы "не работали" и как? :)

Может таки код покажешь? :)
Creator
Нажмите для просмотра прикрепленного файла
и то же самое
main.cpp
Раскрывающийся текст

// main.cpp
#include <QtGui/QApplication>
#include <QtGui/QTreeWidgetItem>
#include <QtGui/QMessageBox>
#include "subitem.h"

int main(int argc, char *argv[]) {
   QApplication app(argc, argv);

   QTreeWidget *tree = new QTreeWidget();
   tree->show();

   SubItem *item = new SubItem(tree);
   item->setText(0, "Item");

   SubItem *item2;
   item2 = static_cast<SubItem *>(tree->topLevelItem(0));

   return app.exec();
}


subitem.cpp
Раскрывающийся текст

// subitem.cpp
#include "subitem.h"

SubItem::SubItem(QTreeWidget* parent) : QTreeWidgetItem(parent) {
};


subitem.h
Раскрывающийся текст

// subitem.h
#ifndef SUBITEM_H
#define SUBITEM_H

#include <QTreeWidgetItem>

class SubItem : public QTreeWidgetItem {
   Q_OBJECT
   public:
      SubItem(QTreeWidget* parent);
};
#endif // SUBITEM_H


tst.pro
Раскрывающийся текст

TARGET = Tst
TEMPLATE = app
SOURCES += main.cpp \
    subitem.cpp
HEADERS += subitem.h

kwisp
думается следующее.
надо проверить
tree->topLevelItem(0)
по-моему там ноль.
Creator
Ошибка возникает еще на этапе компиляции.
И как я и писал, программа компилируется, если убрать макрос Q_OBJECT из определения класса SubItem
Tonal
Макрос Q_OBJECT может быть указан только для наследников QObject-а:
Цитата
Note: This macro requires the class to be a subclass of QObject.

Отсюда

QTreeWidgetItem не является наследником QObject-а.
Так что убери Q_OBJECT и используй dynamic_cast пока не понимаешь что происходит. :)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.