/****************************************************************************
** Meta object code from reading C++ file 'qttreepropertybrowser.cpp'
**
** Created: Mon Jul 16 19:47:58 2012
**      by: The Qt Meta Object Compiler version 62 (Qt 4.7.4)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/

#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'qttreepropertybrowser.cpp' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 62
#error "This file was generated using the moc from 4.7.4. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif

QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_QtPropertyEditorView[] = {

 // content:
       5,       // revision
       0,       // classname
       0,    0, // classinfo
       0,    0, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       0,       // signalCount

       0        // eod
};

static const char qt_meta_stringdata_QtPropertyEditorView[] = {
    "QtPropertyEditorView\0"
};

const QMetaObject QtPropertyEditorView::staticMetaObject = {
    { &QTreeWidget::staticMetaObject, qt_meta_stringdata_QtPropertyEditorView,
      qt_meta_data_QtPropertyEditorView, 0 }
};

#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &QtPropertyEditorView::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION

const QMetaObject *QtPropertyEditorView::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}

void *QtPropertyEditorView::qt_metacast(const char *_clname)
{
    if (!_clname) return 0;
    if (!strcmp(_clname, qt_meta_stringdata_QtPropertyEditorView))
        return static_cast<void*>(const_cast< QtPropertyEditorView*>(this));
    return QTreeWidget::qt_metacast(_clname);
}

int QtPropertyEditorView::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QTreeWidget::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    return _id;
}
static const uint qt_meta_data_QtPropertyEditorDelegate[] = {

 // content:
       5,       // revision
       0,       // classname
       0,    0, // classinfo
       1,   14, // methods
       0,    0, // properties
       0,    0, // enums/sets
       0,    0, // constructors
       0,       // flags
       0,       // signalCount

 // slots: signature, parameters, type, tag, flags
      33,   26,   25,   25, 0x08,

       0        // eod
};

static const char qt_meta_stringdata_QtPropertyEditorDelegate[] = {
    "QtPropertyEditorDelegate\0\0object\0"
    "slotEditorDestroyed(QObject*)\0"
};

const QMetaObject QtPropertyEditorDelegate::staticMetaObject = {
    { &QItemDelegate::staticMetaObject, qt_meta_stringdata_QtPropertyEditorDelegate,
      qt_meta_data_QtPropertyEditorDelegate, 0 }
};

#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &QtPropertyEditorDelegate::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION

const QMetaObject *QtPropertyEditorDelegate::metaObject() const
{
    return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}

void *QtPropertyEditorDelegate::qt_metacast(const char *_clname)
{
    if (!_clname) return 0;
    if (!strcmp(_clname, qt_meta_stringdata_QtPropertyEditorDelegate))
        return static_cast<void*>(const_cast< QtPropertyEditorDelegate*>(this));
    return QItemDelegate::qt_metacast(_clname);
}

int QtPropertyEditorDelegate::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
    _id = QItemDelegate::qt_metacall(_c, _id, _a);
    if (_id < 0)
        return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
        switch (_id) {
        case 0: slotEditorDestroyed((*reinterpret_cast< QObject*(*)>(_a[1]))); break;
        default: ;
        }
        _id -= 1;
    }
    return _id;
}
QT_END_MOC_NAMESPACE
