⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 widgetfactory.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "widgetfactory_p.h"#include "widgetdatabase_p.h"#include "qlayout_widget_p.h"#include "qdesigner_widget_p.h"#include "qdesigner_tabwidget_p.h"#include "qdesigner_toolbox_p.h"#include "qdesigner_stackedbox_p.h"#include "qdesigner_toolbar_p.h"#include "qdesigner_menubar_p.h"#include "qdesigner_menu_p.h"#include "qdesigner_dockwidget_p.h"#include "qdesigner_promotedwidget_p.h"#include "abstractformwindow.h"// shared#include "layoutinfo_p.h"#include "spacer_widget_p.h"#include "layout_p.h"// sdk#include <QtDesigner/QtDesigner>#include <QtGui/QtGui>#include <QtCore/qdebug.h>namespace qdesigner_internal {QPointer<QWidget> *WidgetFactory::m_lastPassiveInteractor = new QPointer<QWidget>();bool WidgetFactory::m_lastWasAPassiveInteractor = false;WidgetFactory::WidgetFactory(QDesignerFormEditorInterface *core, QObject *parent)    : QDesignerWidgetFactoryInterface(parent),      m_core(core){}WidgetFactory::~WidgetFactory(){}void WidgetFactory::loadPlugins(){    m_customFactory.clear();    QDesignerPluginManager *pluginManager = m_core->pluginManager();    QList<QDesignerCustomWidgetInterface*> lst = pluginManager->registeredCustomWidgets();    foreach (QDesignerCustomWidgetInterface *c, lst) {        m_customFactory.insert(c->name(), c);    }}QWidget *WidgetFactory::createWidget(const QString &widgetName, QWidget *parentWidget) const{    if (QDesignerPromotedWidget *promoted = qobject_cast<QDesignerPromotedWidget*>(parentWidget))        parentWidget = promoted->child();    QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(parentWidget);    QWidget *w = 0;    // ### cleanup    if (QDesignerCustomWidgetInterface *f = m_customFactory.value(widgetName)) {        w = f->createWidget(parentWidget);    } else if (widgetName == QLatin1String("Line")) {        w = new Line(parentWidget);    } else if (widgetName == QLatin1String("QLabel")) {        w = new QDesignerLabel(parentWidget);    } else if (widgetName == QLatin1String("QDockWidget")) {        w = new QDesignerDockWidget(parentWidget);    } else if (widgetName == QLatin1String("QTabWidget")) {        w = new QDesignerTabWidget(parentWidget);    } else if (widgetName == QLatin1String("QStackedWidget")) {        w = new QDesignerStackedWidget(parentWidget);    } else if (widgetName == QLatin1String("QToolBox")) {        w = new QDesignerToolBox(parentWidget);    } else if (widgetName == QLatin1String("QToolBar")) {        w = new QDesignerToolBar(parentWidget);    } else if (widgetName == QLatin1String("QMenuBar")) {        w = new QDesignerMenuBar(parentWidget);    } else if (widgetName == QLatin1String("QMenu")) {        w = new QDesignerMenu(parentWidget);    } else if (widgetName == QLatin1String("Spacer")) {        w = new Spacer(parentWidget);    } else if (widgetName == QLatin1String("QDockWidget")) {        w = new QDesignerDockWidget(parentWidget);    } else if (widgetName == QLatin1String("QLayoutWidget")) {        w = fw ? new QLayoutWidget(fw, parentWidget) : new QWidget(parentWidget);    } else if (widgetName == QLatin1String("QDialog")) {        if (fw) {             w = new QDesignerDialog(fw, parentWidget);        } else {            w = new QDialog(parentWidget);        }    } else if (widgetName == QLatin1String("QWidget")) {        if (fw && parentWidget &&             (qobject_cast<QDesignerFormWindowInterface*>(parentWidget) || qt_extension<QDesignerContainerExtension*>(m_core->extensionManager(), parentWidget))) {             w = new QDesignerWidget(fw, qobject_cast<QDesignerFormWindowInterface*>(parentWidget) ? parentWidget : 0);        } else {            w = new QWidget(parentWidget);        }    }#define DECLARE_LAYOUT(L, C)#define DECLARE_COMPAT_WIDGET(W, C) /*DECLARE_WIDGET(W, C)*/#define DECLARE_WIDGET(W, C) else if (widgetName == QLatin1String(#W)) { Q_ASSERT(w == 0); w = new W(parentWidget); }#include "widgets.table"#undef DECLARE_COMPAT_WIDGET#undef DECLARE_LAYOUT#undef DECLARE_WIDGET    if (w == 0) {        QDesignerWidgetDataBaseInterface *db = core()->widgetDataBase();        QDesignerWidgetDataBaseItemInterface *item = db->item(db->indexOfClassName(widgetName));        if (item == 0) {            item = new WidgetDataBaseItem(widgetName, tr("%1 Widget").arg(widgetName));            item->setCustom(true);            item->setPromoted(true);            item->setExtends(QLatin1String("QWidget"));            item->setContainer(true);            item->setIncludeFile(widgetName.toLower() + QLatin1String(".h"));            db->append(item);        }        QString baseClass = item->extends();        if (baseClass.isEmpty())            baseClass = QLatin1String("QWidget");        QDesignerPromotedWidget *promoted = new QDesignerPromotedWidget(item, parentWidget);        QWidget *child = createWidget(baseClass, promoted);        promoted->setChildWidget(child);        w = promoted;    }    Q_ASSERT(w != 0);    if (fw != 0)        initialize(w);    return w;}const char *WidgetFactory::classNameOf(QObject* o){    if (o == 0)        return 0;    if (qobject_cast<QDesignerTabWidget*>(o))        return "QTabWidget";    else if (qobject_cast<QDesignerStackedWidget*>(o))        return "QStackedWidget";    else if (qobject_cast<QDesignerMenuBar*>(o))        return "QMenuBar";    else if (qobject_cast<QDesignerToolBar*>(o))        return "QToolBar";    else if (qobject_cast<QDesignerDockWidget*>(o))        return "QDockWidget";    else if (qobject_cast<QDesignerToolBox*>(o))        return "QToolBox";    else if (qobject_cast<QDesignerDialog*>(o))        return "QDialog";    else if (qobject_cast<QDesignerWidget*>(o))        return "QWidget";    else if (qobject_cast<QDesignerLabel*>(o))        return "QLabel";    else if (qstrcmp(o->metaObject()->className(), "QAxBase") == 0)        return "QAxWidget";    else if (qstrcmp(o->metaObject()->className(), "QDesignerQ3WidgetStack") == 0)        return "Q3WidgetStack";    else if (QDesignerPromotedWidget *promoted = qobject_cast<QDesignerPromotedWidget*>(o))        return promoted->customClassName();    return o->metaObject()->className();}/*!  Creates a layout on the widget \a widget of the type \a type  which can be \c HBox, \c VBox or \c Grid.*/QLayout *WidgetFactory::createLayout(QWidget *widget, QLayout *parentLayout, int type) const // ### (sizepolicy){    QDesignerMetaDataBaseInterface *metaDataBase = core()->metaDataBase();    if (parentLayout == 0) {        widget = containerOfWidget(widget);    }    Q_ASSERT(metaDataBase->item(widget) != 0); // ensure the widget is managed    if (parentLayout == 0 && metaDataBase->item(widget->layout()) == 0) {        parentLayout = widget->layout();    }    QWidget *parentWidget = parentLayout != 0 ? 0 : widget;    QLayout *layout = 0;    switch (type) {    case LayoutInfo::HBox:        layout = new QHBoxLayout(parentWidget);        break;    case LayoutInfo::VBox:        layout = new QVBoxLayout(parentWidget);        break;    case LayoutInfo::Grid:        layout = new QGridLayout(parentWidget);        break;    case LayoutInfo::Stacked:        layout = new QStackedLayout(parentWidget);        break;    default:        Q_ASSERT(0);        return 0;    } // end switch    metaDataBase->add(layout); // add the layout in the MetaDataBase    if (QLayoutWidget *layoutWidget = qobject_cast<QLayoutWidget*>(widget)) {        layoutWidget->setLayoutMargin(0);    }    if (QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(core()->extensionManager(), layout)) {        sheet->setChanged(sheet->indexOf(QLatin1String("margin")), true);        sheet->setChanged(sheet->indexOf(QLatin1String("spacing")), true);        sheet->setChanged(sheet->indexOf(QLatin1String("alignment")), true);    }    if (widget && metaDataBase->item(widget->layout()) == 0) {        Q_ASSERT(layout->parent() == 0);        QBoxLayout *box = qobject_cast<QBoxLayout*>(widget->layout());        Q_ASSERT(box != 0); // we support only unmanaged box layouts        box->addLayout(layout);    }    return layout;}/*!  Returns the widget into which children should be inserted when \a  w is a container known to the designer.  Usually that is \a w itself, sometimes it is different (e.g. a  tabwidget is known to the designer as a container but the child  widgets should be inserted into the current page of the  tabwidget. So in this case this function returns the current page of  the tabwidget.) */QWidget* WidgetFactory::containerOfWidget(QWidget *w) const{    if (QDesignerPromotedWidget *promoted = qobject_cast<QDesignerPromotedWidget*>(w))        return containerOfWidget(promoted->child());    else if (QDesignerContainerExtension *container = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), w))        return container->widget(container->currentIndex());    return w;}/*!  Returns the actual designer widget of the container \a w. This is  normally \a w itself, but might be a parent or grand parent of \a w  (e.g. when working with a tabwidget and \a w is the container which  contains and layouts childs, but the actual widget known to the  designer is the tabwidget which is the parent of \a w. So this  function returns the tabwidget then.)*/QWidget* WidgetFactory::widgetOfContainer(QWidget *w) const{    // ### cleanup    if (!w)        return 0;    if (QDesignerPromotedWidget *promoted = qobject_cast<QDesignerPromotedWidget*>(w))        return widgetOfContainer(promoted->child());    if (w->parentWidget() && w->parentWidget()->parentWidget() &&         w->parentWidget()->parentWidget()->parentWidget() &&         qobject_cast<QToolBox*>(w->parentWidget()->parentWidget()->parentWidget()))        return w->parentWidget()->parentWidget()->parentWidget();    while (w != 0) {        if (core()->widgetDataBase()->isContainer(w) ||             w && qobject_cast<QDesignerFormWindowInterface*>(w->parentWidget()))            return w;        w = w->parentWidget();    }    return w;}QDesignerFormEditorInterface *WidgetFactory::core() const{    return m_core;}void WidgetFactory::initialize(QObject *object) const{    QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(m_core->extensionManager(), object);    if (object->metaObject()->indexOfProperty("focusPolicy") != -1)        object->setProperty("focusPolicy", Qt::NoFocus);    if (!sheet)        return;    sheet->setChanged(sheet->indexOf(QLatin1String("objectName")), true);    sheet->setChanged(sheet->indexOf(QLatin1String("geometry")), true);    if (qobject_cast<Spacer*>(object))        sheet->setChanged(sheet->indexOf(QLatin1String("sizeHint")), true);    int o = sheet->indexOf(QLatin1String("orientation"));    if (o != -1)        sheet->setChanged(o, true);    if (QWidget *widget = qobject_cast<QWidget*>(object)) {        QSize sz = widget->sizeHint();        if (sz.width() <= 0 && sz.height() <= 0)            widget->setMinimumSize(QSize(16, 16));        widget->setAttribute(Qt::WA_TransparentForMouseEvents, false);        if (!(qobject_cast<QDesignerWidget*>(widget) || qobject_cast<QDesignerDialog*>(widget)))            widget->setAttribute(Qt::WA_TintedBackground);    }    if (qobject_cast<QDockWidget*>(object) || qobject_cast<QToolBar*>(object)) {        sheet->setVisible(sheet->indexOf(QLatin1String("windowTitle")), true);        if (qobject_cast<QDockWidget*>(object)) {            sheet->setVisible(sheet->indexOf(QLatin1String("windowIcon")), true);        }    }    if (qobject_cast<QAction*>(object)) {        sheet->setChanged(sheet->indexOf(QLatin1String("text")), true);    }    if (qobject_cast<QMenu*>(object)) {        sheet->setChanged(sheet->indexOf(QLatin1String("geometry")), false);        sheet->setChanged(sheet->indexOf(QLatin1String("title")), true);    }    if (qobject_cast<QMenu*>(object) || qobject_cast<QMenuBar*>(object)) {        qobject_cast<QWidget*>(object)->setFocusPolicy(Qt::StrongFocus);    }}bool WidgetFactory::isPassiveInteractor(QWidget *widget){    if (m_lastPassiveInteractor != 0 && (QWidget*)(*m_lastPassiveInteractor) == widget)        return m_lastWasAPassiveInteractor;    m_lastWasAPassiveInteractor = false;    (*m_lastPassiveInteractor) = widget;    if (QApplication::activePopupWidget()) // if a popup is open, we have to make sure that this one is closed, else X might do funny things        return (m_lastWasAPassiveInteractor = true);    else if (widget == 0)        return m_lastWasAPassiveInteractor;    if (qobject_cast<QTabBar*>(widget))        return (m_lastWasAPassiveInteractor = true);    else if (qobject_cast<QSizeGrip*>(widget))        return (m_lastWasAPassiveInteractor = true);    else if (qobject_cast<QAbstractButton*>(widget) && (qobject_cast<QTabBar*>(widget->parent()) || qobject_cast<QToolBox*>(widget->parent())))        return (m_lastWasAPassiveInteractor = true);    else if (qobject_cast<QMenuBar*>(widget))        return (m_lastWasAPassiveInteractor = true);    else if (qstrcmp(widget->metaObject()->className(), "QDockSeparator") == 0)        return (m_lastWasAPassiveInteractor = true);    else if (qstrcmp(widget->metaObject()->className(), "QDockWidgetSeparator") == 0)        return (m_lastWasAPassiveInteractor = true);    else if (qstrcmp(widget->metaObject()->className(), "QDockWidgetTitle") == 0)        return (m_lastWasAPassiveInteractor = true);    else if (qstrcmp(widget->metaObject()->className(), "QToolBarHandle") == 0)        return (m_lastWasAPassiveInteractor = true);    else if (widget->objectName().startsWith(QLatin1String("__qt__passive_")))        return (m_lastWasAPassiveInteractor = true);    return m_lastWasAPassiveInteractor;}} // namespace qdesigner_internal

⌨️ 快捷键说明

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