qdesigner_promotion.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 367 行 · 第 1/2 页

CPP
367
字号
    bool QDesignerPromotion::canBePromoted(const QDesignerWidgetDataBaseItemInterface *dbItem) const    {        if (dbItem->isPromoted() ||  !dbItem->extends().isEmpty())            return false;        const QString name = dbItem->name();        if (nonPromotableClasses().contains(name))            return false;        if (name.startsWith(QLatin1String("QDesigner")) ||            name.startsWith(QLatin1String("QLayout")))            return false;        return true;    }    QDesignerPromotion::PromotedClasses QDesignerPromotion::promotedClasses()  const    {        typedef QMap<QString, QDesignerWidgetDataBaseItemInterface *> ClassNameItemMap;        // A map containing base classes and their promoted classes.        typedef QMap<QString, ClassNameItemMap> BaseClassPromotedMap;        BaseClassPromotedMap baseClassPromotedMap;        QDesignerWidgetDataBaseInterface *widgetDataBase = m_core->widgetDataBase();        // Look for promoted classes and insert into map according to base class.        const  int cnt = widgetDataBase->count();        for (int i = 0; i < cnt; i++) {            QDesignerWidgetDataBaseItemInterface *dbItem = widgetDataBase->item(i);            if (dbItem->isPromoted()) {                const QString baseClassName = dbItem->extends();                BaseClassPromotedMap::iterator it = baseClassPromotedMap.find(baseClassName);                if (it == baseClassPromotedMap.end()) {                    it = baseClassPromotedMap.insert(baseClassName, ClassNameItemMap());                }                it.value().insert(dbItem->name(), dbItem);            }        }        // convert map into list.        PromotedClasses rc;        if (baseClassPromotedMap.empty())            return rc;        const BaseClassPromotedMap::const_iterator bcend = baseClassPromotedMap.constEnd();        for (BaseClassPromotedMap::const_iterator bit = baseClassPromotedMap.constBegin(); bit !=  bcend; ++bit) {            const int baseIndex = widgetDataBase->indexOfClassName(bit.key());            Q_ASSERT(baseIndex >= 0);            QDesignerWidgetDataBaseItemInterface *baseItem = widgetDataBase->item(baseIndex);            // promoted            const ClassNameItemMap::const_iterator pcend = bit.value().constEnd();            for (ClassNameItemMap::const_iterator pit = bit.value().constBegin(); pit != pcend; ++pit) {                PromotedClass item;                item.baseItem = baseItem;                item.promotedItem = pit.value();                rc.push_back(item);            }        }        return rc;    }    QSet<QString> QDesignerPromotion::referencedPromotedClassNames()  const {        QSet<QString> rc;        const MetaDataBase *metaDataBase = qobject_cast<const MetaDataBase*>(m_core->metaDataBase());        if (!metaDataBase)            return rc;        const QList<QObject*> objs = metaDataBase->objects();        const QList<QObject*>::const_iterator cend = objs.constEnd();        for ( QList<QObject*>::const_iterator it = objs.constBegin(); it != cend; ++it) {            const QString customClass = metaDataBase->metaDataBaseItem(*it)->customClassName();            if (!customClass.isEmpty())                rc.insert(customClass);        }        // check the scratchpad of the widget box        if (QDesignerWidgetBoxInterface *widgetBox = m_core->widgetBox()) {            const QStringList scratchPadClasses = getScratchPadClasses(widgetBox);            if (!scratchPadClasses.empty()) {                // Check whether these are actually promoted                QDesignerWidgetDataBaseInterface *widgetDataBase = m_core->widgetDataBase();                QStringList::const_iterator cend = scratchPadClasses.constEnd();                for (QStringList::const_iterator it = scratchPadClasses.constBegin(); it != cend; ++it ) {                    const int index = widgetDataBase->indexOfClassName(*it);                    if (index != -1 && widgetDataBase->item(index)->isPromoted())                        rc += *it;                }            }        }        return rc;    }    bool QDesignerPromotion::removePromotedClass(const QString &className, QString *errorMessage) {        // check if it exists and is promoted        WidgetDataBase *widgetDataBase = qobject_cast<WidgetDataBase *>(m_core->widgetDataBase());        if (!widgetDataBase) {            *errorMessage = QCoreApplication::tr("The class %1 cannot be removed").arg(className);            return false;        }        const int index = promotedWidgetDataBaseIndex(widgetDataBase, className, errorMessage);        if (index == -1)            return false;        if (referencedPromotedClassNames().contains(className)) {            *errorMessage = QCoreApplication::tr("The class %1 cannot be removed because it is still referenced.").arg(className);            return false;        }        widgetDataBase->remove(index);        return true;    }    bool QDesignerPromotion::changePromotedClassName(const QString &oldclassName, const QString &newClassName, QString *errorMessage) {        const MetaDataBase *metaDataBase = qobject_cast<const MetaDataBase*>(m_core->metaDataBase());        if (!metaDataBase) {            *errorMessage = QCoreApplication::tr("The class %1 cannot be renamed").arg(oldclassName);            return false;        }        QDesignerWidgetDataBaseInterface *widgetDataBase = m_core->widgetDataBase();        // check the new name        if (newClassName.isEmpty()) {            *errorMessage = QCoreApplication::tr("The class %1 cannot be renamed to an empty name.").arg(oldclassName);            return false;        }        const int existingIndex = widgetDataBase->indexOfClassName(newClassName);        if (existingIndex != -1) {            *errorMessage = QCoreApplication::tr("There is already a class named %1.").arg(newClassName);            return false;        }        // Check old class        QDesignerWidgetDataBaseItemInterface *dbItem = promotedWidgetDataBaseItem(widgetDataBase, oldclassName, errorMessage);        if (!dbItem)            return false;        // Change the name in the data base and change all referencing objects in the meta database        dbItem->setName(newClassName);        bool foundReferences = false;        foreach (QObject* object, metaDataBase->objects()) {            MetaDataBaseItem *item =  metaDataBase->metaDataBaseItem(object);            Q_ASSERT(item);            if (item->customClassName() == oldclassName) {                item->setCustomClassName(newClassName);                foundReferences = true;            }        }        // set state        if (foundReferences)            refreshObjectInspector();        return true;    }    bool QDesignerPromotion::setPromotedClassIncludeFile(const QString &className, const QString &includeFile, QString *errorMessage) {        // check file        if (includeFile.isEmpty()) {            *errorMessage = QCoreApplication::tr("Cannot set an empty include file.");            return false;        }        // check item        QDesignerWidgetDataBaseInterface *widgetDataBase = m_core->widgetDataBase();        QDesignerWidgetDataBaseItemInterface *dbItem = promotedWidgetDataBaseItem(widgetDataBase, className, errorMessage);        if (!dbItem)            return false;        dbItem->setIncludeFile(includeFile);        return true;    }    void QDesignerPromotion::refreshObjectInspector() {        if (QDesignerFormWindowManagerInterface *fwm = m_core->formWindowManager()) {            if (QDesignerFormWindowInterface *fw = fwm->activeFormWindow())                if ( QDesignerObjectInspectorInterface *oi = m_core->objectInspector()) {                    oi->setFormWindow(fw);                }        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?