📄 formwindow.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.******************************************************************************//*TRANSLATOR qdesigner_internal::FormWindow*/#include "formwindow.h"#include "formwindow_dnditem.h"#include "formwindow_widgetstack.h"#include "formwindowcursor.h"#include "formwindowmanager.h"#include "tool_widgeteditor.h"#include "widgetselection.h"// shared#include <qdesigner_promotedwidget_p.h>#include <qdesigner_tabwidget_p.h>#include <qdesigner_toolbox_p.h>#include <qdesigner_stackedbox_p.h>#include "qdesigner_resource.h"#include <qdesigner_command_p.h>#include <qdesigner_widget_p.h>#include <qdesigner_utils_p.h>#include <qlayout_widget_p.h>#include <spacer_widget_p.h>#include <invisible_widget_p.h>#include <layoutinfo_p.h>#include <connectionedit_p.h>#include <actionprovider_p.h>// sdk#include <QtDesigner/QtDesigner>#include <QtGui>#include <QtDebug>namespace qdesigner_internal {class FriendlyWidget: public QWidget{public: FriendlyWidget() { Q_ASSERT(0); } friend class FormWindow;};class BlockSelection{public: BlockSelection(FormWindow *fw) : m_formWindow(fw) { if (m_formWindow) m_blocked = m_formWindow->blockSelectionChanged(true); } ~BlockSelection() { if (m_formWindow) m_formWindow->blockSelectionChanged(m_blocked); }private: QPointer<FormWindow> m_formWindow; bool m_blocked;};FormWindow::FormWindow(FormEditor *core, QWidget *parent, Qt::WindowFlags flags) : QDesignerFormWindowInterface(parent, flags), m_core(core), m_widgetStack(0){ init(); m_cursor = new FormWindowCursor(this, this); core->formWindowManager()->addFormWindow(this); setDirty(false);}FormWindow::~FormWindow(){ Q_ASSERT(core() != 0); Q_ASSERT(core()->metaDataBase() != 0); Q_ASSERT(core()->formWindowManager() != 0); core()->formWindowManager()->removeFormWindow(this); core()->metaDataBase()->remove(this); QList<QWidget*> l = widgets(); foreach (QWidget *w, l) core()->metaDataBase()->remove(w); m_widgetStack = 0; m_rubberBand = 0; qDeleteAll(selections);}QDesignerFormEditorInterface *FormWindow::core() const{ return m_core;}QDesignerFormWindowCursorInterface *FormWindow::cursor() const{ return m_cursor;}bool FormWindow::hasFeature(Feature f) const{ return f & m_feature;}void FormWindow::updateWidgets(){ if (!m_mainContainer) return;}int FormWindow::widgetDepth(QWidget *w){ int d = -1; while (w && !w->isWindow()) { d++; w = w->parentWidget(); } return d;}bool FormWindow::isChildOf(QWidget *c, const QWidget *p){ while (c /*&& !c->isWindow()*/) { if (c == p) return true; c = c->parentWidget(); } return false;}FormWindow::Feature FormWindow::features() const{ return m_feature;}static void recursiveUpdate(QWidget *w){ w->update(); const QObjectList &l = w->children(); QObjectList::const_iterator it = l.begin(); for (; it != l.end(); ++it) { if (QWidget *w = qobject_cast<QWidget*>(*it)) recursiveUpdate(w); }}void FormWindow::setFeatures(Feature f){ m_feature = f; emit featureChanged(f); recursiveUpdate(this);}void FormWindow::setCursorToAll(const QCursor &c, QWidget *start){ start->setCursor(c); QList<QWidget*> widgets = qFindChildren<QWidget*>(start); foreach (QWidget *widget, widgets) { if (!qobject_cast<WidgetHandle*>(widget)) { widget->setCursor(c); } }}void FormWindow::init(){ if (FormWindowManager *manager = qobject_cast<FormWindowManager*> (core()->formWindowManager())) { m_commandHistory = new QUndoStack(this); manager->undoGroup()->addStack(m_commandHistory); } m_blockSelectionChanged = false; m_defaultMargin = INT_MIN; m_defaultSpacing = INT_MIN; QHBoxLayout *layout = new QHBoxLayout(this); layout->setMargin(0); m_widgetStack = new FormWindowWidgetStack(this); connect(m_widgetStack, SIGNAL(currentToolChanged(int)), this, SIGNAL(toolChanged(int))); layout->addWidget(m_widgetStack); m_feature = DefaultFeature; m_selectionChangedTimer = new QTimer(this); m_selectionChangedTimer->setSingleShot(true); connect(m_selectionChangedTimer, SIGNAL(timeout()), this, SLOT(selectionChangedTimerDone())); m_checkSelectionTimer = new QTimer(this); m_checkSelectionTimer->setSingleShot(true); connect(m_checkSelectionTimer, SIGNAL(timeout()), this, SLOT(checkSelectionNow())); m_geometryChangedTimer = new QTimer(this); m_geometryChangedTimer->setSingleShot(true); connect(m_geometryChangedTimer, SIGNAL(timeout()), this, SIGNAL(geometryChanged())); m_rubberBand = 0; setGrid(QPoint(10,10)); setFocusPolicy(Qt::StrongFocus); m_mainContainer = 0; m_currentWidget = 0; oldRectValid = false; drawRubber = false; targetContainer = 0; hadOwnPalette = false; startWidget = 0; endWidget = 0; connect(m_commandHistory, SIGNAL(indexChanged(int)), this, SLOT(updateDirty())); connect(m_commandHistory, SIGNAL(indexChanged(int)), this, SIGNAL(changed())); connect(m_commandHistory, SIGNAL(indexChanged(int)), this, SLOT(checkSelection())); core()->metaDataBase()->add(this); initializeCoreTools(); QAction *a = new QAction(this); a->setText(tr("Edit contents")); a->setShortcut(tr("F2")); connect(a, SIGNAL(triggered()), this, SLOT(editContents())); addAction(a);}QWidget *FormWindow::mainContainer() const{ return m_mainContainer;}void FormWindow::setMainContainer(QWidget *w){ if (w == m_mainContainer) { // nothing to do return; } if (m_mainContainer) { unmanageWidget(m_mainContainer); delete m_mainContainer; m_mainContainer = 0; } m_mainContainer = w; w->setAutoFillBackground(true); QSize sz = m_mainContainer->size(); m_mainContainer->setParent(m_widgetStack, 0); m_mainContainer->raise(); m_mainContainer->show(); m_widgetStack->setCurrentTool(m_widgetEditor); setCurrentWidget(m_mainContainer); manageWidget(m_mainContainer); if (QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(core()->extensionManager(), m_mainContainer)) { sheet->setVisible(sheet->indexOf(QLatin1String("windowTitle")), true); sheet->setVisible(sheet->indexOf(QLatin1String("windowIcon")), true); // ### generalize } m_mainContainer->setFocusPolicy(Qt::StrongFocus); m_mainContainer->resize(sz); emit mainContainerChanged(m_mainContainer);}QWidget *FormWindow::findTargetContainer(QWidget *widget) const{ Q_ASSERT(widget); while (QWidget *parentWidget = widget->parentWidget()) { if (LayoutInfo::layoutType(m_core, parentWidget) == LayoutInfo::NoLayout && isManaged(widget)) return widget; widget = parentWidget; } return mainContainer();}bool FormWindow::handleMousePressEvent(QWidget * /*widget*/, QWidget *managedWidget, QMouseEvent *e){ startPos = QPoint(); e->accept(); BlockSelection blocker(this); if (core()->formWindowManager()->activeFormWindow() != this) core()->formWindowManager()->setActiveFormWindow(this); if (e->buttons() != Qt::LeftButton) return true; startPos = mapFromGlobal(e->globalPos()); bool inLayout = LayoutInfo::isWidgetLaidout(m_core, managedWidget); // if the dragged widget is not in a layout, raise it if (inLayout == false) managedWidget->raise(); if (isMainContainer(managedWidget) == true) { // press was on the formwindow clearSelection(false); drawRubber = true; currRect = QRect(); startRectDraw(mapFromGlobal(e->globalPos()), this, Rubber); return true; } bool selected = isWidgetSelected(managedWidget); if (e->modifiers() & Qt::ShiftModifier) { // shift-click - toggle selection state of widget selectWidget(managedWidget, !selected); return true; } QWidget *current = managedWidget; if (!selected) clearSelection(false); bool curLaidOut = false; bool curSelected = false; for (;;) { curLaidOut = current ? LayoutInfo::isWidgetLaidout(core(), current) : false; curSelected = current ? isWidgetSelected(current) : false; if (!current || !curLaidOut || !curSelected) break; current = designerWidget(current->parentWidget()); } if (!(current == 0 || !curLaidOut && curSelected)) { selectWidget(current); raiseChildSelections(current); } return true;}bool FormWindow::isPageOfContainerWidget(QWidget *widget) const{ QDesignerContainerExtension *c = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), widget->parentWidget()); if (c != 0) { for (int i = 0; i<c->count(); ++i) { if (widget == c->widget(i)) return true; } } return false;}bool FormWindow::handleMouseMoveEvent(QWidget *, QWidget *, QMouseEvent *e){ e->accept(); if (e->buttons() != Qt::LeftButton || startPos.isNull()) return true; QPoint pos = mapFromGlobal(e->globalPos()); if (drawRubber == true) { continueRectDraw(pos, this, Rubber); return true; } bool canStartDrag = (startPos - pos).manhattanLength() > QApplication::startDragDistance(); if (canStartDrag == false) { // nothing to do return true; } bool blocked = blockSelectionChanged(true); QList<QWidget*> sel = selectedWidgets(); simplifySelection(&sel); QSet<QWidget*> widget_set; foreach (QWidget *child, sel) { QWidget *current = child; bool done = false; while (!isMainContainer(current) && !done) { QDesignerContainerExtension *c = 0; c = qt_extension<QDesignerContainerExtension*>(core()->extensionManager(), current->parentWidget()); if (!isManaged(current)) { current = current->parentWidget(); continue; } else if (LayoutInfo::isWidgetLaidout(core(), current)) { current = current->parentWidget(); continue; } else if (isPageOfContainerWidget(current)) { current = current->parentWidget(); continue; } else if (current->parentWidget()) { QScrollArea *area = qobject_cast<QScrollArea*>(current->parentWidget()->parentWidget()); if (area && area->widget() == current) { current = area; continue; } } done = true; } if (current == mainContainer()) continue; widget_set.insert(current); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -