formwindow.cpp

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

CPP
2,326
字号
bool FormWindow::handleMousePressEvent(QWidget * widget, QWidget *managedWidget, QMouseEvent *e){    m_startPos = QPoint();    e->accept();    BlockSelection blocker(this);    if (core()->formWindowManager()->activeFormWindow() != this)        core()->formWindowManager()->setActiveFormWindow(this);    if (e->buttons() != Qt::LeftButton)        return true;    m_startPos = mapFromGlobal(e->globalPos());    const bool inLayout = LayoutInfo::isWidgetLaidout(m_core, managedWidget);    const bool selected = isWidgetSelected(managedWidget);    if (debugFormWindow)        qDebug() << "handleMousePressEvent:" <<  widget << ',' << managedWidget << " inLayout=" << inLayout << " selected=" << selected;    // if the dragged widget is not in a layout, raise it    if (inLayout == false) {        managedWidget->raise();        if (selected)            selectWidget(managedWidget, true);    }    if (isMainContainer(managedWidget) == true) { // press was on the formwindow        clearSelection(false);        m_drawRubber = true;        m_currRect = QRect();        startRectDraw(mapFromGlobal(e->globalPos()), this, Rubber);        return true;    }    if (e->modifiers() & Qt::ShiftModifier) {        // shift-click - toggle selection state of widget        selectWidget(managedWidget, !selected);        return true;    }    QWidget *current = managedWidget;    if (!selected)        clearSelection(false);    selectWidget(current);    raiseChildSelections(current);    return true;}bool FormWindow::isPageOfContainerWidget(const 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 || m_startPos.isNull())        return true;    const QPoint pos = mapFromGlobal(e->globalPos());    if (m_drawRubber == true) {        continueRectDraw(pos, this, Rubber);        return true;    }    const bool canStartDrag = (m_startPos - pos).manhattanLength() > QApplication::startDragDistance();    if (canStartDrag == false) {        // nothing to do        return true;    }    const bool blocked = blockSelectionChanged(true);    QWidgetList sel = selectedWidgets();    simplifySelection(&sel);    QSet<QWidget*> widget_set;    foreach (QWidget *child, sel) {        QWidget *current = child;        bool done = false;        while (!isMainContainer(current) && !done) {            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();    QDesignerFormWindowCursorInterface *c = cursor();    QWidget *current = c->current();    if (sel.contains(current)) {        sel.removeAll(current);        sel.prepend(current);    }    QList<QDesignerDnDItemInterface*> item_list;    const QPoint globalPos = mapToGlobal(m_startPos);    const QDesignerDnDItemInterface::DropType dropType = (e->modifiers()#ifndef Q_WS_MAC        & Qt::ControlModifier)#else        & Qt::AltModifier)#endif        ? QDesignerDnDItemInterface::CopyDrop : QDesignerDnDItemInterface::MoveDrop;    foreach (QWidget *widget, sel) {        item_list.append(new FormWindowDnDItem(dropType,  this, widget, globalPos));        if (dropType == QDesignerDnDItemInterface::MoveDrop)            widget->hide();        }    blockSelectionChanged(blocked);    if (sel.count())        core()->formWindowManager()->dragItems(item_list);    m_startPos = QPoint();    return true;}bool FormWindow::handleMouseReleaseEvent(QWidget *w, QWidget *mw, QMouseEvent *e){    if (m_dblClicked) {        m_dblClicked = false;        return true;    }    if (debugFormWindow)        qDebug() << "handleMousePressEvent:" << w << ',' << mw;    e->accept();    if (m_drawRubber) { // we were drawing a rubber selection        endRectDraw(); // get rid of the rectangle        const bool blocked = blockSelectionChanged(true);        selectWidgets(); // select widgets which intersect the rect        blockSelectionChanged(blocked);        m_drawRubber = false;    }    m_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){    m_rectAnchor = (t == Insert) ? designerGrid().snapPoint(pos) : pos;    m_currRect = QRect(m_rectAnchor, QSize(0, 0));    if (!m_rubberBand)        m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this);    m_rubberBand->setGeometry(m_currRect);    m_rubberBand->show();}void FormWindow::continueRectDraw(const QPoint &pos, QWidget *, RectType t){    const QPoint p2 = (t == Insert) ? designerGrid().snapPoint(pos) : pos;    QRect r(m_rectAnchor, p2);    r = r.normalized();    if (m_currRect == r)        return;    if (r.width() > 1 || r.height() > 1) {        m_currRect = r;        if (m_rubberBand)            m_rubberBand->setGeometry(m_currRect);    }}void FormWindow::endRectDraw(){    if (m_rubberBand) {        delete m_rubberBand;        m_rubberBand = 0;    }}QWidget *FormWindow::currentWidget() const{    return m_currentWidget;}bool FormWindow::setCurrentWidget(QWidget *currentWidget){     if (debugFormWindow)        qDebug() << "setCurrentWidget:" <<  m_currentWidget << " --> " << currentWidget;     if (currentWidget == m_currentWidget)         return false;     // repaint the old widget unless it is the main window     if (m_currentWidget && m_currentWidget != mainContainer()) {         m_selection->repaintSelection(m_currentWidget);     }     // set new and repaint     m_currentWidget = currentWidget;     if (m_currentWidget && m_currentWidget != mainContainer()) {         m_selection->repaintSelection(m_currentWidget);     }     return true;}QSize FormWindow::sizeHint() const{    QWidget *w = mainContainer();    if (!w)        return QSize(400, 300);    QWidget *centralWidget = w;    QMainWindow *mw = qobject_cast<QMainWindow*>(w);    if (mw)        centralWidget = mw->centralWidget();    if (centralWidget->layout())        return w->sizeHint();    return w->sizeHint().expandedTo(QSize(400, 300));}void FormWindow::selectWidget(QWidget* w, bool select){    if (trySelectWidget(w, select))        emitSelectionChanged();}// Selects a widget and determines the new current one. Returns true if a change occurs.bool FormWindow::trySelectWidget(QWidget *w, bool select){    if (debugFormWindow)        qDebug() << "trySelectWidget:" << w << select;    if (!isManaged(w) && !isCentralWidget(w))        return false;    if (!select && !isWidgetSelected(w))        return false;    if (!mainContainer())        return false;    if (isMainContainer(w) || isCentralWidget(w)) {        setCurrentWidget(mainContainer());        return true;    }    if (select) {        setCurrentWidget(w);        m_selection->addWidget(this, w);    } else {        QWidget *newCurrent = m_selection->removeWidget(w);        if (!newCurrent)            newCurrent = mainContainer();        setCurrentWidget(newCurrent);    }    return true;}void FormWindow::hideSelection(QWidget *w){    selectWidget(w, false);}void FormWindow::clearSelection(bool changePropertyDisplay){    if (debugFormWindow)        qDebug() << "clearSelection(" <<  changePropertyDisplay << ')';    // At all events, we need a current widget.    m_selection->clear();    setCurrentWidget(mainContainer());    if (changePropertyDisplay)        emitSelectionChanged();}void FormWindow::emitSelectionChanged(){    if (m_blockSelectionChanged == true) {        // nothing to do        return;    }    m_selectionChangedTimer->start(0);}void FormWindow::selectionChangedTimerDone(){    emit selectionChanged();}bool FormWindow::isWidgetSelected(QWidget *w) const{    return m_selection->isWidgetSelected(w);}bool FormWindow::isMainContainer(const QWidget *w) const{    return w && (w == this || w == mainContainer());}void FormWindow::updateChildSelections(QWidget *w){    const QWidgetList l = qFindChildren<QWidget*>(w);    QListIterator<QWidget*> it(l);    while (it.hasNext()) {        QWidget *w = it.next();        if (isManaged(w)) {            updateSelection(w);        }    }}void FormWindow::repaintSelection(){    m_selection->repaintSelection();}void FormWindow::raiseSelection(QWidget *w){    m_selection->raiseWidget(w);}void FormWindow::updateSelection(QWidget *w){    if (!w->isVisibleTo(this)) {        selectWidget(w, false);    } else {        m_selection->updateGeometry(w);    }}QWidget *FormWindow::designerWidget(QWidget *w) const{    while (w && !isMainContainer(w) && !isManaged(w) || isCentralWidget(w))        w = w->parentWidget();    return w;}bool FormWindow::isCentralWidget(QWidget *w) const{    if (QMainWindow *mainWindow = qobject_cast<QMainWindow*>(mainContainer()))        return w == mainWindow->centralWidget();    return false;}void FormWindow::ensureUniqueObjectName(QObject *object){    QString name = object->objectName();    if (name.isEmpty()) {        QDesignerWidgetDataBaseInterface *db = core()->widgetDataBase();        if (QDesignerWidgetDataBaseItemInterface *item = db->item(db->indexOfObject(object)))            name = QDesignerResource::qtify(item->name());    }    unify(object, name, true);    object->setObjectName(name);}template <class T, class P>void merge(QList<T> *target, const QList<P> &source){    foreach (P item, source) {        target->append(item);    }}bool FormWindow::unify(QObject *w, QString &s, bool changeIt){    bool found = !isMainContainer(static_cast<QWidget*>(w)) && objectName() == s;    if (!found) {        QList<QObject*> objects;        if (mainContainer()) {            objects.append(mainContainer());            merge(&objects, qFindChildren<QWidget*>(mainContainer()));            merge(&objects, qFindChildren<QAction*>(mainContainer()));        }        QMutableListIterator<QObject*> mit(objects);        while (mit.hasNext()) {            if (!core()->metaDataBase()->item(mit.next())) {                mit.remove();            }        }        QListIterator<QObject*> it(objects);        while (it.hasNext()) {            QObject *child = it.next();            if (child != w && child->objectName() == s) {                found = true;                if (!changeIt)                    break;                qlonglong num = 0;                qlonglong factor = 1;                int idx = s.length()-1;                for ( ; (idx > 0) && s.at(idx).isDigit(); --idx) {                    num += (s.at(idx).unicode() - QLatin1Char('0').unicode()) * factor;                    factor *= 10;                }

⌨️ 快捷键说明

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