crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 килобайт ) Кол-во скачиваний: 213

и то же самое
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 Рейтинг@Mail.ru Текстовая версия Сейчас: 28.7.2025, 23:45