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 + -
显示快捷键?