crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Приведение типов
Creator
  опции профиля:
сообщение 16.10.2009, 0:23
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 7.7.2009
Пользователь №: 881

Спасибо сказали: 0 раз(а)




Репутация:   0  


Как привести указатель на объект класса QTreeWidgetItem к указателю на класс, унаследованному от QTreeWidgetItem?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.10.2009, 7:53
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Примерно так:
QTreeWidgetItem *pTreeBase = new QTreeWidgetItem;
//...
CMyTreeWidgetItem *pTree = (CMyTreeWidgetItem*)pTreeBase;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 16.10.2009, 8:15
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Таки лучше dynamic_cast.
Ну или в рукопашную:
* определить константу типа MyUserType = QTreeWidgetItem::UserType + 1
* В конструкторе её передать, перед приведением проверять что item.type() == MyUserType
* Ну и приводить static_cast-ом - хотя бы от глупых ошибок защитит. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.10.2009, 8:51
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Tonal, для новичков в программировании аналог reinterpret_cast самое то. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.10.2009, 9:26
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


А я бы qobject_cast использовал:
CMyTreeWidgetItem *pTree = qobject_cast<CMyTreeWidgetItem*>(pTreeBase);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 16.10.2009, 10:13
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


QTreeWidgetItem не наследник QObject-а, поэтому есть некоторые сомнения в работоспособности qobject_cast для него...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Creator
  опции профиля:
сообщение 16.10.2009, 12:26
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 7.7.2009
Пользователь №: 881

Спасибо сказали: 0 раз(а)




Репутация:   0  


У меня в коде для наследуемого класса был указан макрос Q_OBJECT.
И из-за этого не работали все вышеприведенные методы
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 19.10.2009, 7:23
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


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

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

Может таки код покажешь? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Creator
  опции профиля:
сообщение 19.10.2009, 15:09
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 7.7.2009
Пользователь №: 881

Спасибо сказали: 0 раз(а)




Репутация:   0  


Прикрепленный файл  Tst.zip ( 1.07 килобайт ) Кол-во скачиваний: 178

и то же самое
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
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


думается следующее.
надо проверить
tree->topLevelItem(0)
по-моему там ноль.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 15:42