crossplatform.ru

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


  Ответ в Приведение типов
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Tonal Дата 22.10.2009, 7:04
  Макрос Q_OBJECT может быть указан только для наследников QObject-а:
Цитата
Note: This macro requires the class to be a subclass of QObject.

Отсюда

QTreeWidgetItem не является наследником QObject-а.
Так что убери Q_OBJECT и используй dynamic_cast пока не понимаешь что происходит. :)
Creator Дата 22.10.2009, 1:17
  Ошибка возникает еще на этапе компиляции.
И как я и писал, программа компилируется, если убрать макрос Q_OBJECT из определения класса SubItem
kwisp Дата 19.10.2009, 15:44
  думается следующее.
надо проверить
tree->topLevelItem(0)
по-моему там ноль.
Creator Дата 19.10.2009, 15:09
  Прикрепленный файл  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

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

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

Может таки код покажешь? :)
Creator Дата 16.10.2009, 12:26
  У меня в коде для наследуемого класса был указан макрос Q_OBJECT.
И из-за этого не работали все вышеприведенные методы
Tonal Дата 16.10.2009, 10:13
  QTreeWidgetItem не наследник QObject-а, поэтому есть некоторые сомнения в работоспособности qobject_cast для него...
Litkevich Yuriy Дата 16.10.2009, 9:26
  А я бы qobject_cast использовал:
CMyTreeWidgetItem *pTree = qobject_cast<CMyTreeWidgetItem*>(pTreeBase);
ViGOur Дата 16.10.2009, 8:51
  Tonal, для новичков в программировании аналог reinterpret_cast самое то. :)
Tonal Дата 16.10.2009, 8:15
  Таки лучше dynamic_cast.
Ну или в рукопашную:
* определить константу типа MyUserType = QTreeWidgetItem::UserType + 1
* В конструкторе её передать, перед приведением проверять что item.type() == MyUserType
* Ну и приводить static_cast-ом - хотя бы от глупых ошибок защитит. :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 18:35