Как привести указатель на объект класса QTreeWidgetItem к указателю на класс, унаследованному от QTreeWidgetItem?
Примерно так:
QTreeWidgetItem *pTreeBase = new QTreeWidgetItem;
//...
CMyTreeWidgetItem *pTree = (CMyTreeWidgetItem*)pTreeBase;
Таки лучше dynamic_cast.
Ну или в рукопашную:
* определить константу типа MyUserType = QTreeWidgetItem::UserType + 1
* В конструкторе её передать, перед приведением проверять что item.type() == MyUserType
* Ну и приводить static_cast-ом - хотя бы от глупых ошибок защитит.
Tonal, для новичков в программировании аналог reinterpret_cast самое то.
А я бы qobject_cast использовал:
CMyTreeWidgetItem *pTree = qobject_cast<CMyTreeWidgetItem*>(pTreeBase);
QTreeWidgetItem не наследник QObject-а, поэтому есть некоторые сомнения в работоспособности qobject_cast для него...
У меня в коде для наследуемого класса был указан макрос Q_OBJECT.
И из-за этого не работали все вышеприведенные методы
dynamic_cast может не работать только в случае явного отключения rtti, а static_cast и приведение в старом стиле - в случае синтаксической ошибки.
Наличие или отсутствие макроса Q_OBJECT на их вообще не влияет.
Какие именно все методы "не работали" и как?
Может таки код покажешь?
Tst.zip ( 1.07 килобайт )
: 195
и то же самое
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
#include "subitem.h"
SubItem::SubItem(QTreeWidget* parent) : QTreeWidgetItem(parent) {
};
// subitem.h
#ifndef SUBITEM_H
#define SUBITEM_H
#include <QTreeWidgetItem>
class SubItem : public QTreeWidgetItem {
Q_OBJECT
public:
SubItem(QTreeWidget* parent);
};
#endif // SUBITEM_H
TARGET = Tst
TEMPLATE = app
SOURCES += main.cpp \
subitem.cpp
HEADERS += subitem.h
думается следующее.
надо проверить
tree->topLevelItem(0)
по-моему там ноль.
Ошибка возникает еще на этапе компиляции.
И как я и писал, программа компилируется, если убрать макрос Q_OBJECT из определения класса SubItem
Макрос Q_OBJECT может быть указан только для наследников QObject-а:
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)