widgetbox.cpp

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

CPP
1,171
字号
}void WidgetBoxTreeView::setFileName(const QString &file_name){    m_file_name = file_name;}QString WidgetBoxTreeView::fileName() const{    return m_file_name;}bool WidgetBoxTreeView::save(){    if (fileName().isEmpty())        return false;    QFile file(fileName());    if (!file.open(QIODevice::WriteOnly))        return false;    CategoryList cat_list;    for (int i = 0; i < categoryCount(); ++i)        cat_list.append(category(i));    const QDomDocument doc = categoryListToDom(cat_list);    QTextStream stream(&file);    doc.save(stream, 4);    return true;}void WidgetBoxTreeView::handleMousePress(QTreeWidgetItem *item){    if (item == 0)        return;    if (item->parent() == 0) {        setItemExpanded(item, !isItemExpanded(item));        return;    }    QDesignerWidgetBoxInterface::Widget wgt = itemToWidget(item);    if (wgt.isNull())        return;    emit pressed(wgt.name(), widgetDomXml(wgt), wgt.type() == QDesignerWidgetBoxInterface::Widget::Custom, QCursor::pos());}int WidgetBoxTreeView::ensureScratchpad(){    const int existingIndex = indexOfScratchpad();    if (existingIndex != -1)         return existingIndex;    QTreeWidgetItem *scratch_item = new QTreeWidgetItem(this);    scratch_item->setText(0, tr("Scratchpad"));    setTopLevelRole(SCRATCHPAD_ITEM, scratch_item);    return categoryCount() - 1;}int WidgetBoxTreeView::indexOfScratchpad() const{    if (const int numTopLevels =  topLevelItemCount()) {        for (int i = numTopLevels - 1; i >= 0; --i) {            if (topLevelRole(topLevelItem(i)) == SCRATCHPAD_ITEM)                return i;        }    }    return -1;}int WidgetBoxTreeView::indexOfCategory(const QString &name) const{    for (int i = 0; i < topLevelItemCount(); ++i) {        if (topLevelItem(i)->text(0) == name)            return i;    }    return -1;}bool WidgetBoxTreeView::load(WidgetBox::LoadMode loadMode){    switch (loadMode) {    case WidgetBox::LoadReplace:        clear();        break;    case WidgetBox::LoadCustomWidgetsOnly:        addCustomCategories(true);        return true;    default:        break;    }    const QString name = fileName();    QFile f(name);    if (!f.open(QIODevice::ReadOnly)) {        const QString msg = QObject::tr("The widgetbox could not load the file %1.").arg(name);        return false;    }    const QString contents = QString::fromUtf8(f.readAll());    return loadContents(contents, name);}bool WidgetBoxTreeView::loadContents(const QString &contents, const QString &fileName){    QString error_msg;    int line, col;    QDomDocument doc;    if (!doc.setContent(contents, &error_msg, &line, &col)) {        if (!fileName.isEmpty()) {            const QString msg = QObject::tr("The widgetbox could not parse the file %1. An error occurred at line %2: %3").                arg(fileName).arg(line).arg(error_msg);            qdesigner_internal::designerWarning(msg);        }        return false;    }    const CategoryList cat_list = domToCategoryList(doc);    if (cat_list.isEmpty())        return false;    foreach(Category cat, cat_list)        addCategory(cat);    addCustomCategories(false);    // Restore which items are expanded    restoreExpandedState();    return true;}void WidgetBoxTreeView::addCustomCategories(bool replace){    if (replace) {        // clear out all existing custom widgets        if (const int numTopLevels =  topLevelItemCount()) {            for (int t = 0; t < numTopLevels ; ++t) {                QTreeWidgetItem *topLevel = topLevelItem(t);                if (const int childCount = topLevel->childCount()) {                    for (int c = childCount - 1; c >= 0; --c) {                        QTreeWidgetItem *item = topLevel->child(c);                        const QDesignerWidgetBoxInterface::Widget wgt = itemToWidget(item);                        if (!wgt.isNull() && wgt.type() == QDesignerWidgetBoxInterface::Widget::Custom) {                            delete item;                            const int listIndex =  m_widgetNames.indexOf(wgt.name());                            if (listIndex != -1)                                m_widgetNames.removeAt(listIndex);                        }                    }                }            }        }    }    // re-add    foreach (Category cat, loadCustomCategoryList())        addCategory(cat);}QDomDocument WidgetBoxTreeView::categoryListToDom(const CategoryList &cat_list) const{    QDomDocument doc;    QDomElement root = doc.createElement(QLatin1String("widgetbox"));    doc.appendChild(root);    const QString name = QLatin1String("name");    const QString type = QLatin1String("type");    const QString icon = QLatin1String("icon");    const QString defaultType = QLatin1String("default");    const QString category = QLatin1String(QLatin1String("category"));    const QString iconPrefix = QLatin1String("__qt_icon__");    foreach (Category cat, cat_list) {        QDomElement cat_elt = doc.createElement(QLatin1String("category"));        root.appendChild(cat_elt);        cat_elt.setAttribute(name, cat.name());        if (cat.type() == Category::Scratchpad)            cat_elt.setAttribute(type, QLatin1String("scratchpad"));        for (int i = 0; i < cat.widgetCount(); ++i) {           const  Widget wgt = cat.widget(i);            if (wgt.type() == Widget::Custom)                continue;            const DomWidget *dom_wgt = xmlToUi(wgt.name(), widgetDomXml(wgt));            QDomElement wgt_elt = dom_wgt->write(doc);            wgt_elt.setAttribute(name, wgt.name());            const QString iconName = wgt.iconName();            if (!iconName.startsWith(iconPrefix))              wgt_elt.setAttribute(icon, wgt.iconName());            wgt_elt.setAttribute(type, defaultType);            cat_elt.appendChild(wgt_elt);            delete dom_wgt;        }    }    return doc;}WidgetBoxTreeView::CategoryList    WidgetBoxTreeView::domToCategoryList(const QDomDocument &doc) const{    CategoryList result;    const QDomElement root = doc.firstChildElement();    if (root.nodeName() != QLatin1String("widgetbox")) {        qdesigner_internal::designerWarning(QObject::tr("The file %1 does not appear to be a widgetbox file.").arg(m_file_name));        return result;    }    QDomElement cat_elt = root.firstChildElement();    for (; !cat_elt.isNull(); cat_elt = cat_elt.nextSiblingElement()) {        if (cat_elt.nodeName() != QLatin1String("category")) {            qdesigner_internal::designerWarning(QObject::tr("An error occurred while parsing the file %1: %2 is not a valid child of the root element.").                                                arg(m_file_name).arg( cat_elt.nodeName()));            return result;        }        const Category cat = domToCategory(cat_elt);        if (!cat.isNull())            result.append(cat);    }    return result;}WidgetBoxTreeView::Category WidgetBoxTreeView::domToCategory(const QDomElement &cat_elt) const{    const QString nameAttribute = QLatin1String("name");    const QString type = QLatin1String("type");    const QString icon = QLatin1String("icon");    const QString name = cat_elt.attribute(nameAttribute);    const QString custom = QLatin1String("custom");    if (name == QLatin1String("[invisible]"))        return Category();    Category result(name);    if (cat_elt.attribute(type) == QLatin1String("scratchpad"))        result.setType(Category::Scratchpad);    QDomElement widget_elt = cat_elt.firstChildElement();    for (; !widget_elt.isNull(); widget_elt = widget_elt.nextSiblingElement()) {        const QString type_attr = widget_elt.attribute(type);        const Widget::Type type = type_attr == custom                                ? Widget::Custom                                : Widget::Default;        const Widget w(widget_elt.attribute(nameAttribute),                    domToString(widget_elt),                    widget_elt.attribute(icon),                    type);        result.addWidget(w);    }    return result;}static int findCategory(const QString &name, const WidgetBoxTreeView::CategoryList &list){    int idx = 0;    foreach (const WidgetBoxTreeView::Category &cat, list) {        if (cat.name() == name)            return idx;        ++idx;    }    return -1;}WidgetBoxTreeView::CategoryList WidgetBoxTreeView::loadCustomCategoryList() const{    CategoryList result;    QDesignerPluginManager *pm = m_core->pluginManager();    const QList<QDesignerCustomWidgetInterface*> customWidgets = pm->registeredCustomWidgets();    static const QString customCatName = tr("Custom Widgets");    const QString invisible = QLatin1String("[invisible]");    const QString iconPrefix = QLatin1String("__qt_icon__");    foreach (const QDesignerCustomWidgetInterface *c, customWidgets) {        const QString dom_xml = c->domXml();        if (dom_xml.isEmpty())            continue;        QString cat_name = c->group();        if (cat_name.isEmpty())            cat_name = customCatName;        else if (cat_name == invisible)            continue;        int idx = findCategory(cat_name, result);        if (idx == -1) {            result.append(Category(cat_name));            idx = result.size() - 1;        }        Category &cat = result[idx];        const QIcon icon = c->icon();        QString icon_name;        if (icon.isNull())            icon_name = QLatin1String("qtlogo.png");        else {            icon_name = iconPrefix;            icon_name += c->name();            m_pluginIcons.insert(icon_name, icon);        }        cat.addWidget(Widget(c->name(), dom_xml, icon_name, Widget::Custom));    }    return result;}QTreeWidgetItem *WidgetBoxTreeView::widgetToItem(const Widget &wgt,                                                    QTreeWidgetItem *parent,                                                    bool editable){    if (!editable && m_widgetNames.contains(wgt.name()))        return 0;    QTreeWidgetItem *item = new QTreeWidgetItem(parent);    item->setFlags(item->flags() & ~Qt::ItemIsSelectable);    QString icon_name = wgt.iconName();    if (icon_name.isEmpty())        icon_name = QLatin1String("qtlogo.png");    const bool block = blockSignals(true);    item->setText(0, wgt.name());    if (!editable)        m_widgetNames.append(wgt.name());    QIcon icon;    if (icon_name.startsWith(QLatin1String("__qt_icon__")))      icon = m_pluginIcons.value(icon_name);    if (icon.isNull())      icon = createIconSet(icon_name);    item->setIcon(0, icon);    item->setData(0, Qt::UserRole, qVariantFromValue(wgt));    const QDesignerWidgetDataBaseInterface *db = m_core->widgetDataBase();    const int dbIndex = db->indexOfClassName(wgt.name());    if (dbIndex != -1) {        const QDesignerWidgetDataBaseItemInterface *dbItem = db->item(dbIndex);        const QString toolTip = dbItem->toolTip();        if (!toolTip.isEmpty())            item->setToolTip(0, toolTip);        const QString whatsThis = dbItem->whatsThis();        if (!whatsThis.isEmpty())            item->setWhatsThis(0, whatsThis);    }    blockSignals(block);    if (editable) {        item->setFlags(Qt::ItemIsSelectable                        | Qt::ItemIsEditable                        | Qt::ItemIsEnabled);    }    return item;}WidgetBoxTreeView::Widget WidgetBoxTreeView::itemToWidget(const QTreeWidgetItem *item){    return qvariant_cast<Widget>(item->data(0, Qt::UserRole));}int WidgetBoxTreeView::categoryCount() const{    return topLevelItemCount();}WidgetBoxTreeView::Category WidgetBoxTreeView::category(int cat_idx) const{    Category result;    if (cat_idx >= topLevelItemCount())        return result;    QTreeWidgetItem *cat_item = topLevelItem(cat_idx);    result.setName(cat_item->text(0));    for (int i = 0; i < cat_item->childCount(); ++i) {        QTreeWidgetItem *child = cat_item->child(i);        result.addWidget(itemToWidget(child));    }

⌨️ 快捷键说明

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