📄 formwindow.cpp
字号:
popup->addAction(stackedWidget->actionNextPage()); popup->addAction(stackedWidget->actionPreviousPage()); if (stackedWidget->count() > 1) { popup->addAction(stackedWidget->actionChangePageOrder()); } popup->addSeparator(); } else if (qobject_cast<QDesignerToolBox*>(w)) { QDesignerToolBox *toolBox = static_cast<QDesignerToolBox*>(w); if (toolBox->count()) { popup->addAction(toolBox->actionDeletePage()); } QMenu *insertPageMenu = popup->addMenu(tr("Insert Page")); insertPageMenu->addAction(toolBox->actionInsertPageAfter()); insertPageMenu->addAction(toolBox->actionInsertPage()); if (toolBox->count() > 1) { popup->addAction(toolBox->actionChangePageOrder()); } popup->addSeparator(); } if (!isFormWindow) { popup->addAction(manager->actionCut()); popup->addAction(manager->actionCopy()); } popup->addAction(manager->actionPaste()); popup->addAction(manager->actionSelectAll()); if (!isFormWindow) { popup->addAction(manager->actionDelete()); } popup->addSeparator(); QMenu *menu = popup->addMenu(tr("Lay out")); menu->addAction(manager->actionAdjustSize()); menu->addAction(manager->actionHorizontalLayout()); menu->addAction(manager->actionVerticalLayout()); menu->addAction(manager->actionGridLayout()); if (!isFormWindow) { menu->addAction(manager->actionSplitHorizontal()); menu->addAction(manager->actionSplitVertical()); } menu->addAction(manager->actionBreakLayout()); return popup;}void FormWindow::resizeEvent(QResizeEvent *e){/* if (editMode() == TabOrderEditMode) repositionOrderIndicators(); */ m_geometryChangedTimer->start(10); QWidget::resizeEvent(e);}/*! Maps \a pos in \a w's coordinates to the form's coordinate system. This is the equivalent to mapFromGlobal(w->mapToGlobal(pos)) but avoids the two roundtrips to the X-Server on Unix/X11. */QPoint FormWindow::mapToForm(const QWidget *w, const QPoint &pos) const{ QPoint p = pos; const QWidget* i = w; while (i && !i->isWindow() && !isMainContainer(i)) { p = i->mapToParent(p); i = i->parentWidget(); } return mapFromGlobal(w->mapToGlobal(pos));}bool FormWindow::canBeBuddy(QWidget *w) const // ### rename me.{ if (QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(core()->extensionManager(), w)) { int index = sheet->indexOf(QLatin1String("focusPolicy")); if (index != -1) { bool ok = false; Qt::FocusPolicy q = (Qt::FocusPolicy) Utils::valueOf(sheet->property(index), &ok); return ok && q != Qt::NoFocus; } } return false;}QWidget *FormWindow::findContainer(QWidget *w, bool excludeLayout) const{ if (!isChildOf(w, this) || const_cast<const QWidget *>(w) == this) return 0; QDesignerWidgetFactoryInterface *widgetFactory = core()->widgetFactory(); QDesignerWidgetDataBaseInterface *widgetDataBase = core()->widgetDataBase(); QDesignerMetaDataBaseInterface *metaDataBase = core()->metaDataBase(); QWidget *container = widgetFactory->containerOfWidget(mainContainer()); // default parent for new widget is the formwindow if (!isMainContainer(w)) { // press was not on formwindow, check if we can find another parent while (w) { if (qobject_cast<InvisibleWidget*>(w) || !metaDataBase->item(w)) { w = w->parentWidget(); continue; } bool isContainer = widgetDataBase->isContainer(w, true) || w == mainContainer(); if (!isContainer || (excludeLayout && qobject_cast<QLayoutWidget*>(w))) { // ### skip QSplitter w = w->parentWidget(); } else { container = w; break; } } } return container;}void FormWindow::simplifySelection(QList<QWidget*> *sel) const{ // Figure out which widgets should be removed from selection. // We want to remove those whose parent widget is also in the // selection (because the child widgets are contained by // their parent, they shouldn't be in the selection -- // they are "implicitly" selected) QList<QWidget*> toBeRemoved; QListIterator<QWidget*> it(*sel); while (it.hasNext()) { QWidget *child = it.next(); QWidget *w = child; while (w->parentWidget() && sel->contains(w->parentWidget())) w = w->parentWidget(); if (child != w) toBeRemoved.append(child); } // Now we can actually remove the widgets that were marked // for removal in the previous pass. while (!toBeRemoved.isEmpty()) sel->removeAll(toBeRemoved.takeFirst());}FormWindow *FormWindow::findFormWindow(QWidget *w){ return qobject_cast<FormWindow*>(QDesignerFormWindowInterface::findFormWindow(w));}void FormWindow::repaintSelection(){ QList<QWidget*> sel = selectedWidgets(); foreach (QWidget *ww, sel) repaintSelection(ww);}bool FormWindow::isDirty() const{ return m_dirty;}void FormWindow::setDirty(bool dirty){ m_dirty = dirty; if (!m_dirty) m_lastIndex = m_commandHistory->currentIndex();}void FormWindow::updateDirty(){ m_dirty = m_commandHistory->currentIndex() != m_lastIndex;}QWidget *FormWindow::containerAt(const QPoint &pos){ QWidget *widget = widgetAt(pos); return findContainer(widget, true);}static QWidget *childAt_SkipDropLine(QWidget *w, QPoint pos){ QObjectList child_list = w->children(); for (int i = child_list.size() - 1; i >= 0; --i) { QObject *child_obj = child_list[i]; if (!child_obj->isWidgetType()) continue; if (qobject_cast<WidgetHandle*>(child_obj) != 0) continue; QWidget *child = static_cast<QWidget*>(child_obj); if (!child->geometry().contains(pos)) continue; pos = child->mapFromParent(pos); QWidget *res = childAt_SkipDropLine(child, pos); if (res == 0) return child; else return res; } return 0;}QWidget *FormWindow::widgetAt(const QPoint &pos){ QWidget *w = childAt(pos); if (qobject_cast<WidgetHandle*>(w) != 0) w = childAt_SkipDropLine(this, pos); return w == 0 ? this : w;}void FormWindow::highlightWidget(QWidget *widget, const QPoint &pos, HighlightMode mode){ Q_ASSERT(widget); QWidget *container = findContainer(widget, false); Q_ASSERT(!qobject_cast<ConnectionEdit*>(widget)); if (container == 0 || core()->metaDataBase()->item(container) == 0) return; if (QDesignerActionProviderExtension *g = qt_extension<QDesignerActionProviderExtension*>(core()->extensionManager(), container)) { if (mode == Restore) { g->adjustIndicator(QPoint()); } else { QPoint pt = widget->mapTo(container, pos); g->adjustIndicator(pt); } } else if (QDesignerLayoutDecorationExtension *g = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), container)) { if (mode == Restore) { g->adjustIndicator(QPoint(), -1); } else { QPoint pt = widget->mapTo(container, pos); int index = g->findItemAt(pt); g->adjustIndicator(pt, index); } } QMainWindow *mw = qobject_cast<QMainWindow*>(mainContainer()); if (container == mainContainer() || (mw && mw->centralWidget() && mw->centralWidget() == container)) return; if (mode == Restore) { QPair<QPalette, bool> paletteAndFill = palettesBeforeHighlight.take(container); container->setPalette(paletteAndFill.first); container->setAutoFillBackground(paletteAndFill.second); } else { QPalette p = container->palette(); if (!palettesBeforeHighlight.contains(container)) { QPair<QPalette, bool> paletteAndFill; if (container->testAttribute(Qt::WA_SetPalette)) paletteAndFill.first = p; paletteAndFill.second = container->autoFillBackground(); palettesBeforeHighlight[container] = paletteAndFill; } p.setColor(backgroundRole(), p.midlight().color()); container->setPalette(p); container->setAutoFillBackground(true); }}QList<QWidget *> FormWindow::widgets(QWidget *widget) const{ QList<QWidget *> l; foreach (QObject *o, widget->children()) { QWidget *w = qobject_cast<QWidget*>(o); if (w && isManaged(w)) l.append(w); } return l;}int FormWindow::toolCount() const{ return m_widgetStack->count();}QDesignerFormWindowToolInterface *FormWindow::tool(int index) const{ return m_widgetStack->tool(index);}void FormWindow::registerTool(QDesignerFormWindowToolInterface *tool){ Q_ASSERT(tool != 0); m_widgetStack->addTool(tool); if (m_mainContainer) m_mainContainer->update();}void FormWindow::setCurrentTool(int index){ m_widgetStack->setCurrentTool(index);}int FormWindow::currentTool() const{ return m_widgetStack->currentIndex();}bool FormWindow::handleEvent(QWidget *widget, QWidget *managedWidget, QEvent *event){ if (m_widgetStack == 0) return false; QDesignerFormWindowToolInterface *tool = m_widgetStack->currentTool(); if (tool == 0) return false; return tool->handleEvent(widget, managedWidget, event);}void FormWindow::initializeCoreTools(){ m_widgetEditor = new WidgetEditorTool(this); registerTool(m_widgetEditor);}void FormWindow::checkSelection(){ m_checkSelectionTimer->start(0);}void FormWindow::checkSelectionNow(){ m_checkSelectionTimer->stop(); foreach (QWidget *widget, selectedWidgets()) { updateSelection(widget); if (LayoutInfo::layoutType(core(), widget) != LayoutInfo::NoLayout) updateChildSelections(widget); }}QString FormWindow::author() const{ return m_author;}QString FormWindow::comment() const{ return m_comment;}void FormWindow::setAuthor(const QString &author){ m_author = author;}void FormWindow::setComment(const QString &comment){ m_comment = comment;}void FormWindow::editWidgets(){ m_widgetEditor->action()->trigger();}QStringList FormWindow::resourceFiles() const{ return m_resourceFiles;}void FormWindow::addResourceFile(const QString &path){ if (!m_resourceFiles.contains(path)) { m_resourceFiles.append(path); setDirty(true); emit resourceFilesChanged(); }}void FormWindow::removeResourceFile(const QString &path){ if (m_resourceFiles.removeAll(path) > 0) { setDirty(true); emit resourceFilesChanged(); }}bool FormWindow::blockSelectionChanged(bool b){ bool blocked = m_blockSelectionChanged; m_blockSelectionChanged = b; return blocked;}void FormWindow::editContents(){ QList<QWidget*> sel = selectedWidgets(); if (sel.count() == 1) { QWidget *widget = sel.first(); if (QDesignerTaskMenuExtension *taskMenu = qt_extension<QDesignerTaskMenuExtension*>(core()->extensionManager(), widget)) { if (QAction *a = taskMenu->preferredEditAction()) { a->trigger(); } } }}void FormWindow::dropWidgets(QList<QDesignerDnDItemInterface*> &item_list, QWidget *target, const QPoint &global_mouse_pos){ beginCommand(tr("Drop widget")); QWidget *parent = target; if (parent == 0) parent = mainContainer(); // You can only drop stuff onto the central widget of a QMainWindow // ### generalize to use container extension if (QMainWindow *main_win = qobject_cast<QMainWindow*>(target)) { QPoint main_win_pos = main_win->mapFromGlobal(global_mouse_pos); QRect central_wgt_geo = main_win->centralWidget()->geometry(); if (!central_wgt_geo.contains(main_win_pos)) { foreach (QDesignerDnDItemInterface *item, item_list) { if (item->widget() != 0) item->widget()->show(); } return; } } core()->formWindowManager()->setActiveFormWindow(this); mainContainer()->activateWindow(); clearSelection(false); highlightWidget(target, target->mapFromGlobal(global_mouse_pos), FormWindow::Restore); foreach (QDesignerDnDItemInterface *item, item_list) { DomUI *dom_ui = item->domUi(); QRect geometry = item->decoration()->geometry(); Q_ASSERT(dom_ui != 0); if (item->type() == QDesignerDnDItemInterface::CopyDrop) { QWidget *widget = createWidget(dom_ui, geometry, parent); if (!widget) return; selectWidget(widget, true); widget->setFocus(Qt::MouseFocusReason); // ### workaround for QWorkSpace (?) bug } else { QWidget *widget = item->widget(); Q_ASSERT(widget != 0); QDesignerFormWindowInterface *dest = findFormWindow(widget); QWidget *container = findContainer(parent, false); QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), container); if (dest == this) { if (deco == 0) { parent = container; if (parent != widget->parent()) { ReparentWidgetCommand *cmd = new ReparentWidgetCommand(dest); cmd->init(widget, parent); commandHistory()->push(cmd); } geometry.moveTopLeft(parent->mapFromGlobal(geometry.topLeft())); resizeWidget(widget, geometry); selectWidget(widget, true); widget->show(); } else { insertWidget(widget, geometry, container, true); } } else { FormWindow *source = qobject_cast<FormWindow*>(item->source()); Q_ASSERT(source != 0); source->deleteWidgets(QList<QWidget*>() << widget); QWidget *new_widget = createWidget(dom_ui, geometry, parent); selectWidget(new_widget, true); } } } endCommand();}QDir FormWindow::absoluteDir() const{ if (fileName().isEmpty()) return QDir::current(); return QFileInfo(fileName()).absoluteDir();}void FormWindow::layoutDefault(int *margin, int *spacing){ *margin = m_defaultMargin; *spacing = m_defaultSpacing;}void FormWindow::setLayoutDefault(int margin, int spacing){ m_defaultMargin = margin; m_defaultSpacing = spacing;}void FormWindow::layoutFunction(QString *margin, QString *spacing){ *margin = m_marginFunction; *spacing = m_spacingFunction;}void FormWindow::setLayoutFunction(const QString &margin, const QString &spacing){ m_marginFunction = margin; m_spacingFunction = spacing;}QString FormWindow::pixmapFunction() const{ return m_pixmapFunction;}void FormWindow::setPixmapFunction(const QString &pixmapFunction){ m_pixmapFunction = pixmapFunction;}QStringList FormWindow::includeHints() const{ return m_includeHints;}void FormWindow::setIncludeHints(const QStringList &includeHints){ m_includeHints = includeHints;}QString FormWindow::exportMacro() const{ return m_exportMacro;}void FormWindow::setExportMacro(const QString &exportMacro){ m_exportMacro = exportMacro;}} // namespace
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -