QDESIGNER_SHARED_EXPORT QDesignerWidgetDataBaseItemInterface * appendDerived(QDesignerWidgetDataBaseInterface *db, const QString &className, const QString &group, const QString &baseClassName, const QString &includeFile, bool promoted, bool custom) { if (debugWidgetDataBase) qDebug() << "appendDerived " << className << " derived from " << baseClassName; // Check. if (className.isEmpty() || baseClassName.isEmpty()) { qWarning("** WARNING %s called with an empty class names: '%s' extends '%s'.", Q_FUNC_INFO, className.toUtf8().constData(), baseClassName.toUtf8().constData()); return 0; } // Check whether item already exists. QDesignerWidgetDataBaseItemInterface *derivedItem = 0; const int existingIndex = db->indexOfClassName(className); if ( existingIndex != -1) derivedItem = db->item(existingIndex); if (derivedItem) { // Check the existing item for base class mismatch. This will likely // happen when loading a file written by an instance with missing plugins. // In that case, just warn and ignore the file properties. // // An empty base class indicates that it is not known (for example, for custom plugins). // In this case, the widget DB is later updated once the widget is created // by DOM (by querying the metaobject). Suppress the warning. const QString existingBaseClass = derivedItem->extends(); if (existingBaseClass.isEmpty() || baseClassName == existingBaseClass) return derivedItem; // Warn about mismatches designerWarning(QCoreApplication::translate("WidgetDataBase", "The file contains a custom widget '%1' whose base class (%2)" " differs from the current entry in the widget database (%3)." " The widget database is left unchanged."). arg(className, baseClassName, existingBaseClass)); return derivedItem; } // Create this item, inheriting its base properties const int baseIndex = db->indexOfClassName(baseClassName); if (baseIndex == -1) { if (debugWidgetDataBase) qDebug() << "appendDerived failed due to missing base class"; return 0; } const QDesignerWidgetDataBaseItemInterface *baseItem = db->item(baseIndex); derivedItem = WidgetDataBaseItem::clone(baseItem); // Sort of hack: If base class is QWidget, we most likely // do not want to inherit the container attribute. static const QString qWidgetName = QLatin1String("QWidget"); if (baseItem->name() == qWidgetName) derivedItem->setContainer(false); // set new props derivedItem->setName(className); derivedItem->setGroup(group); derivedItem->setCustom(custom); derivedItem->setPromoted(promoted); derivedItem->setExtends(baseClassName); derivedItem->setIncludeFile(includeFile); db->append(derivedItem); return derivedItem; }