Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Приведение типов

Автор: Creator 16.10.2009, 0:23

Как привести указатель на объект класса QTreeWidgetItem к указателю на класс, унаследованному от QTreeWidgetItem?

Автор: ViGOur 16.10.2009, 7:53

Примерно так:

QTreeWidgetItem *pTreeBase = new QTreeWidgetItem;
//...
CMyTreeWidgetItem *pTree = (CMyTreeWidgetItem*)pTreeBase;

Автор: Tonal 16.10.2009, 8:15

Таки лучше dynamic_cast.
Ну или в рукопашную:
* определить константу типа MyUserType = QTreeWidgetItem::UserType + 1
* В конструкторе её передать, перед приведением проверять что item.type() == MyUserType
* Ну и приводить static_cast-ом - хотя бы от глупых ошибок защитит. :)

Автор: ViGOur 16.10.2009, 8:51

Tonal, для новичков в программировании аналог reinterpret_cast самое то. :)

Автор: Litkevich Yuriy 16.10.2009, 9:26

А я бы qobject_cast использовал:

CMyTreeWidgetItem *pTree = qobject_cast<CMyTreeWidgetItem*>(pTreeBase);

Автор: Tonal 16.10.2009, 10:13

QTreeWidgetItem не наследник QObject-а, поэтому есть некоторые сомнения в работоспособности qobject_cast для него...

Автор: Creator 16.10.2009, 12:26

У меня в коде для наследуемого класса был указан макрос Q_OBJECT.
И из-за этого не работали все вышеприведенные методы

Автор: Tonal 19.10.2009, 7:23

dynamic_cast может не работать только в случае явного отключения rtti, а static_cast и приведение в старом стиле - в случае синтаксической ошибки.
Наличие или отсутствие макроса Q_OBJECT на их вообще не влияет.

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

Может таки код покажешь? :)

Автор: Creator 19.10.2009, 15:09

 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
Раскрывающийся текст

// 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 19.10.2009, 15:44

думается следующее.
надо проверить
tree->topLevelItem(0)
по-моему там ноль.

Автор: Creator 22.10.2009, 1:17

Ошибка возникает еще на этапе компиляции.
И как я и писал, программа компилируется, если убрать макрос Q_OBJECT из определения класса SubItem

Автор: Tonal 22.10.2009, 7:04

Макрос Q_OBJECT может быть указан только для наследников QObject-а:

Цитата
Note: This macro requires the class to be a subclass of QObject.

http://doc.crossplatform.ru/qt/4.5.0/qobject.html#Q_OBJECT

QTreeWidgetItem не является наследником QObject-а.
Так что убери Q_OBJECT и используй dynamic_cast пока не понимаешь что происходит. :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)