qdesigner_workbench.cpp

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

CPP
1,252
字号
    connect(m_core->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)),                this, SLOT(updateWindowMenu(QDesignerFormWindowInterface*)));}Qt::WindowFlags QDesignerWorkbench::magicalWindowFlags(const QWidget *widgetForFlags) const{    switch (m_mode) {        case TopLevelMode: {#ifdef Q_WS_MAC            if (qobject_cast<const QDesignerToolWindow *>(widgetForFlags))                return Qt::Tool;#else            Q_UNUSED(widgetForFlags);#endif            return Qt::Window;        }        case DockedMode:            Q_ASSERT(m_mdiArea != 0);            return Qt::Window | Qt::WindowShadeButtonHint | Qt::WindowSystemMenuHint | Qt::WindowTitleHint;        case NeutralMode:            return Qt::Window;        default:            Q_ASSERT(0);            return 0;    }}QWidget *QDesignerWorkbench::magicalParent() const{    switch (m_mode) {        case TopLevelMode:            return 0;        case DockedMode:            Q_ASSERT(m_mdiArea != 0);            return m_mdiArea;        case NeutralMode:            return 0;        default:            Q_ASSERT(0);            return 0;    }}void QDesignerWorkbench::switchToNeutralMode(){    if (m_mode == NeutralMode) {        return;    } else if (m_mode == DockedMode) {        Q_ASSERT(m_mdiArea != 0);        QMainWindow *mw = qobject_cast<QMainWindow*>(m_mdiArea->window());        QDesignerSettings settings;        settings.setMainWindowState(mw->saveState(2));    } else if (m_mode == TopLevelMode) {        QDesignerToolWindow *widgetBoxWrapper = findToolWindow(core()->widgetBox());        if (widgetBoxWrapper) {            QDesignerSettings settings;            settings.setToolBoxState(widgetBoxWrapper->saveState());        }    }    saveGeometries();    m_mode = NeutralMode;    foreach (QDesignerToolWindow *tw, m_toolWindows) {        tw->setSaveSettingsOnClose(false);        tw->setParent(0);    }    foreach (QDesignerFormWindow *fw, m_formWindows) {        fw->setParent(0);    }#ifndef Q_WS_MAC    m_globalMenuBar->setParent(0);#endif    m_fileToolBar->setParent(0);    m_editToolBar->setParent(0);    m_toolToolBar->setParent(0);    m_formToolBar->setParent(0);    m_core->setTopLevel(0);    qDesigner->setMainWindow(0);    if (m_mdiArea)        delete m_mdiArea->parentWidget();    m_mdiArea = 0;}void QDesignerWorkbench::switchToDockedMode(){    bool wasTopLevel = (m_mode == TopLevelMode);    if (m_mode == DockedMode)        return;    switchToNeutralMode();    m_mode = DockedMode;    QDesignerToolWindow *widgetBoxWrapper = 0;    if (0 != (widgetBoxWrapper = findToolWindow(core()->widgetBox()))) {        widgetBoxWrapper->action()->setVisible(true);        widgetBoxWrapper->setWindowTitle(tr("Widget Box"));    }    Q_ASSERT(m_mdiArea == 0);    QDesignerSettings settings;    QDesignerToolWindow *mw = new QDesignerToolWindow(this); // Just to have a copy of    mw->setSaveSettingsOnClose(true);    mw->setObjectName(QLatin1String("MDIWindow"));    mw->setWindowTitle(tr("Qt Designer"));    m_mdiArea = new QMdiArea(mw);    m_mdiArea->setAcceptDrops(true);    m_mdiArea->installEventFilter(this);    m_mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);    m_mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);    connect(m_mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)),            this, SLOT(activateMdiAreaChildWindow(QMdiSubWindow*)));    mw->setCentralWidget(m_mdiArea);    m_core->setTopLevel(mw);    (void) mw->statusBar();    if (m_Positions.isEmpty()) {        settings.setGeometryFor(mw, qApp->desktop()->availableGeometry(0));    } else {        if (QDesignerToolWindow *widgetBox = findToolWindow(core()->widgetBox())) {            const PositionMap::const_iterator pit = m_Positions.constFind(widgetBox);            const QPoint pos = pit != m_Positions.constEnd() ? pit->position() : QPoint(0, 0);            mw->move(pos);        }        mw->setWindowState(mw->windowState() | Qt::WindowMaximized);    }#ifndef Q_WS_MAC    mw->setMenuBar(m_globalMenuBar);    m_globalMenuBar->show();#endif    mw->addToolBar(m_fileToolBar);    mw->addToolBar(m_editToolBar);    mw->addToolBar(m_toolToolBar);    mw->addToolBar(m_formToolBar);    m_fileToolBar->show();    m_editToolBar->show();    m_toolToolBar->show();    m_formToolBar->show();    qDesigner->setMainWindow(mw);    foreach (QDesignerToolWindow *tw, m_toolWindows) {        if (wasTopLevel)            settings.saveGeometryFor(tw);        QDockWidget *dockWidget = magicalDockWidget(tw);        if (dockWidget == 0) {            dockWidget = new QDockWidget(mw);            dockWidget->setObjectName(tw->objectName() + QLatin1String("_dock"));            dockWidget->setWindowTitle(tw->windowTitle());            mw->addDockWidget(tw->dockWidgetAreaHint(), dockWidget);        }        dockWidget->setWidget(tw);        const PositionMap::const_iterator pit = m_Positions.constFind(tw);        if (pit != m_Positions.constEnd()) pit->applyTo(dockWidget);    }    mw->restoreState(settings.mainWindowState(), 2);    foreach (QDesignerFormWindow *fw, m_formWindows)        createFormMdiSubWindow(m_mdiArea, fw, magicalWindowFlags(fw), m_actionManager->closeFormAction()->shortcut())->hide();    m_actionManager->setBringAllToFrontVisible(false);    mw->show();    // Trigger adjustMDIFormPositions() delayed as viewport size is not yet known.    if (m_state != StateInitializing)        QMetaObject::invokeMethod(this, "adjustMDIFormPositions", Qt::QueuedConnection);}void QDesignerWorkbench::adjustMDIFormPositions(){    const QPoint mdiAreaOffset =  m_mdiArea->pos();    foreach (QDesignerFormWindow *fw, m_formWindows) {        const PositionMap::const_iterator pit = m_Positions.constFind(fw);        if (pit != m_Positions.constEnd()) pit->applyTo(mdiSubWindowOf(fw), mdiAreaOffset);    }}bool QDesignerWorkbench::eventFilter(QObject *object, QEvent *event){    if (object == m_mdiArea) {        if (event->type() == QEvent::DragEnter) {            QDragEnterEvent *e = static_cast<QDragEnterEvent*>(event);            if (e->mimeData()->hasFormat(QLatin1String("text/uri-list"))) {                e->acceptProposedAction();                return true;            }        } else if (event->type() == QEvent::Drop) {            QDropEvent *e = static_cast<QDropEvent*>(event);            if (!e->mimeData()->hasFormat(QLatin1String("text/uri-list")))                return false;            foreach (QUrl url, e->mimeData()->urls()) {                if (!url.toLocalFile().isEmpty())                    readInForm(url.toLocalFile());            }            e->acceptProposedAction();            return true;        }    }    return false;}void QDesignerWorkbench::switchToTopLevelMode(){    if (m_mode == TopLevelMode)        return;    // make sure that the widgetbox is visible if it is different from neutral.    QDesignerToolWindow *widgetBoxWrapper = findToolWindow(core()->widgetBox());    if (m_mode != NeutralMode) {        if (widgetBoxWrapper) {            if (!widgetBoxWrapper->action()->isChecked())                widgetBoxWrapper->action()->trigger();        }    }    switchToNeutralMode();    const QPoint desktopOffset = QApplication::desktop()->availableGeometry().topLeft();    m_mode = TopLevelMode;    // The widget box is special, it gets the menubar and gets to be the main widget.    QDesignerSettings settings;    if (widgetBoxWrapper) {        m_core->setTopLevel(widgetBoxWrapper);#ifndef Q_WS_MAC        widgetBoxWrapper->setMenuBar(m_globalMenuBar);        widgetBoxWrapper->action()->setVisible(false);        widgetBoxWrapper->setSaveSettingsOnClose(true);        qDesigner->setMainWindow(widgetBoxWrapper);        widgetBoxWrapper->setWindowTitle(tr("Qt Designer"));#endif        widgetBoxWrapper->addToolBar(m_fileToolBar);        widgetBoxWrapper->addToolBar(m_editToolBar);        widgetBoxWrapper->addToolBar(m_toolToolBar);        widgetBoxWrapper->addToolBar(m_formToolBar);        widgetBoxWrapper->restoreState(settings.toolBoxState());    }    bool found_visible_window = false;    foreach (QDesignerToolWindow *tw, m_toolWindows) {        tw->setParent(magicalParent(), magicalWindowFlags(tw));        settings.setGeometryFor(tw, tw->geometryHint());        tw->action()->setChecked(tw->isVisible());        found_visible_window |= tw->isVisible();    }    if (widgetBoxWrapper) {        if (!widgetBoxWrapper->action()->isChecked())            widgetBoxWrapper->action()->trigger();    }    if (!m_toolWindows.isEmpty() && !found_visible_window)        m_toolWindows.first()->show();    m_actionManager->setBringAllToFrontVisible(true);    foreach (QDesignerFormWindow *fw, m_formWindows) {        fw->setParent(magicalParent(), magicalWindowFlags(fw));        const PositionMap::const_iterator pit = m_Positions.constFind(fw);        if (pit != m_Positions.constEnd()) pit->applyTo(fw, desktopOffset);    }}QDesignerFormWindow *QDesignerWorkbench::createFormWindow(){    QDesignerFormWindow *formWindow = new QDesignerFormWindow(/*formWindow=*/ 0, this);    if (m_mdiArea) {        m_mdiArea->setActiveSubWindow(createFormMdiSubWindow(m_mdiArea, formWindow, magicalWindowFlags(formWindow), m_actionManager->closeFormAction()->shortcut()));    } else {        const QRect formWindowGeometryHint = formWindow->geometryHint();        formWindow->setAttribute(Qt::WA_DeleteOnClose, true);        formWindow->setParent(magicalParent(), magicalWindowFlags(formWindow));        formWindow->resize(formWindowGeometryHint.size());        formWindow->move(availableGeometry().center() - formWindowGeometryHint.center());    }    addFormWindow(formWindow);    return formWindow;}QDesignerFormWindowManagerInterface *QDesignerWorkbench::formWindowManager() const{    return m_core->formWindowManager();}QDesignerFormEditorInterface *QDesignerWorkbench::core() const{    return m_core;}int QDesignerWorkbench::toolWindowCount() const{    return m_toolWindows.count();}QDesignerToolWindow *QDesignerWorkbench::toolWindow(int index) const{    return m_toolWindows.at(index);}int QDesignerWorkbench::formWindowCount() const{    return m_formWindows.count();}QDesignerFormWindow *QDesignerWorkbench::formWindow(int index) const{    return m_formWindows.at(index);}QRect QDesignerWorkbench::availableGeometry() const{    if (m_mdiArea)        return m_mdiArea->geometry();    QDesktopWidget *desktop = qDesigner->desktop();    QWidget *window = findToolWindow(core()->widgetBox());    if (window)        return desktop->availableGeometry(desktop->screenNumber(window));    return desktop->availableGeometry(0);}int QDesignerWorkbench::marginHint() const{    return 20;}void QDesignerWorkbench::activateMdiAreaChildWindow(QMdiSubWindow *subWindow){    if (subWindow) {        QWidget *widget = subWindow->widget();        if (QDesignerFormWindow *fw = qobject_cast<QDesignerFormWindow*>(widget)) {            core()->formWindowManager()->setActiveFormWindow(fw->editor());            m_mdiArea->setActiveSubWindow(subWindow);        }    }}void QDesignerWorkbench::removeToolWindow(QDesignerToolWindow *toolWindow){    int index = m_toolWindows.indexOf(toolWindow);    if (index != -1) {        m_toolWindows.removeAt(index);        m_toolWindowExtras.remove(toolWindow);    }    if (QAction *action = toolWindow->action()) {        m_toolActions->removeAction(action);        m_toolMenu->removeAction(action);    }}void QDesignerWorkbench::removeFormWindow(QDesignerFormWindow *formWindow){    QDesignerFormWindowInterface *editor = formWindow->editor();    const bool loadOk = editor->mainContainer();    updateBackup(editor);    const int index = m_formWindows.indexOf(formWindow);    if (index != -1) {        m_formWindows.removeAt(index);        m_formWindowExtras.remove(formWindow);    }    if (QAction *action = formWindow->action()) {        m_windowActions->removeAction(action);        m_windowMenu->removeAction(action);    }    if (m_formWindows.empty()) {        m_actionManager->setWindowListSeparatorVisible(false);        // Show up new form dialog unless closing        if (loadOk && m_state == StateUp &&  QDesignerSettings().showNewFormOnStartup()) {            QTimer::singleShot(200, m_actionManager, SLOT(createForm()));        }    }}void QDesignerWorkbench::initializeCorePlugins(){    QList<QObject*> plugins = QPluginLoader::staticInstances();    plugins += core()->pluginManager()->instances();    foreach (QObject *plugin, plugins) {        if (QDesignerFormEditorPluginInterface *formEditorPlugin = qobject_cast<QDesignerFormEditorPluginInterface*>(plugin)) {            if (!formEditorPlugin->isInitialized())                formEditorPlugin->initialize(core());        }    }}void QDesignerWorkbench::saveSettings() const{    QDesignerSettings settings;    if (m_mode == DockedMode) {        if (qFindChild<QMdiArea *>(qDesigner->mainWindow())) {            settings.saveGeometryFor(qDesigner->mainWindow());            settings.setValue(qDesigner->mainWindow()->objectName() + QLatin1String("/visible"), false);        }    } else {        foreach (QDesignerToolWindow *tw, m_toolWindows) {            settings.saveGeometryFor(tw);        }    }}bool QDesignerWorkbench::readInForm(const QString &fileName) const{

⌨️ 快捷键说明

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