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

📄 formwindow.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/******************************************************************************** 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 "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(){    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;    m_commandHistory = new QtUndoStack(this);    connect(m_commandHistory, SIGNAL(commandExecuted()), this, SLOT(updateDirty()));    connect(m_commandHistory, SIGNAL(commandExecuted()), this, SIGNAL(changed()));    connect(commandHistory(), SIGNAL(commandExecuted()), 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);    }    sel = widget_set.toList();    QDesignerResource builder(this);    QList<QDesignerDnDItemInterface*> item_list;    foreach (QWidget *widget, sel) {        if (e->modifiers()#ifndef Q_WS_MAC        & Qt::ControlModifier#else        & Qt::AltModifier#endif        ) {            item_list.append(new FormWindowDnDItem(QDesignerDnDItemInterface::CopyDrop,                this, widget, mapToGlobal(startPos)));        } else {            item_list.append(new FormWindowDnDItem(QDesignerDnDItemInterface::MoveDrop,                this, widget, mapToGlobal(startPos)));            widget->hide();        }    }    blockSelectionChanged(blocked);    if (sel.count())        core()->formWindowManager()->dragItems(item_list);    startPos = QPoint();    return true;}bool FormWindow::handleMouseReleaseEvent(QWidget *, QWidget *, QMouseEvent *e){    e->accept();    if (drawRubber) { // we were drawing a rubber selection        endRectDraw(); // get rid of the rectangle        bool blocked = blockSelectionChanged(true);        selectWidgets(); // select widgets which intersect the rect        blockSelectionChanged(blocked);        drawRubber = false;    }    startPos = QPoint();    emitSelectionChanged(); // inform about selection changes    return true;}void FormWindow::checkPreviewGeometry(QRect &r){    if (!rect().contains(r)) {        if (r.left() < rect().left())            r.moveTopLeft(QPoint(0, r.top()));        if (r.right() > rect().right())            r.moveBottomRight(QPoint(rect().right(), r.bottom()));        if (r.top() < rect().top())            r.moveTopLeft(QPoint(r.left(), rect().top()));        if (r.bottom() > rect().bottom())            r.moveBottomRight(QPoint(r.right(), rect().bottom()));    }}void FormWindow::startRectDraw(const QPoint &pos, QWidget *, RectType t){    oldRectValid = false;    rectAnchor = (t == Insert) ? gridPoint(pos) : pos;    currRect = QRect(rectAnchor, QSize(0, 0));    if (!m_rubberBand)        m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);    m_rubberBand->setGeometry(currRect);    m_rubberBand->show();}void FormWindow::continueRectDraw(const QPoint &pos, QWidget *, RectType t){    QPoint p2 = (t == Insert) ? gridPoint(pos) : pos;    QRect r(rectAnchor, p2);    r = r.normalized();    if (currRect == r)        return;    if (r.width() > 1 || r.height() > 1) {        oldRectValid = true;        currRect = r;        if (m_rubberBand)            m_rubberBand->setGeometry(currRect);    } else {        oldRectValid = false;    }}void FormWindow::endRectDraw(){    if (m_rubberBand) {        delete m_rubberBand;        m_rubberBand = 0;    }}QPoint FormWindow::gridPoint(const QPoint &p) const

⌨️ 快捷键说明

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