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

📄 widgetselection.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    LayoutInfo::Type layoutType = widget->parentWidget()            ? LayoutInfo::layoutType(formWindow->core(), widget->parentWidget())            : LayoutInfo::NoLayout;    if (layoutType == LayoutInfo::Grid) {        QSize size = widget->parentWidget()->size();        QGridLayout *grid = static_cast<QGridLayout*>(widget->parentWidget()->layout());        QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), widget->parentWidget());        int index = deco->indexOf(widget);        QRect info = deco->itemInfo(index);        int top = deco->findItemAt(info.top() - 1, info.left());        int left = deco->findItemAt(info.top(), info.left() - 1);        int bottom = deco->findItemAt(info.bottom() + 1, info.left());        int right = deco->findItemAt(info.top(), info.right() + 1);        QPoint pt = origGeom.center() - widget->geometry().center();        ChangeLayoutItemGeometry *cmd = 0;        switch (type) {            default: break;            case WidgetHandle::Top: {                if (pt.y() < 0 && info.height() > 1) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y() + 1, info.x(), info.height() - 1, info.width());                } else if (pt.y() > 0 && top != -1 && grid->itemAt(top)->spacerItem()) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y() - 1, info.x(), info.height() + 1, info.width());                }            } break;            case WidgetHandle::Left: {                if (pt.x() < 0 && info.width() > 1) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y(), info.x() + 1, info.height(), info.width() - 1);                } else if (pt.x() > 0 && left != -1 && grid->itemAt(left)->spacerItem()) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y(), info.x() - 1, info.height(), info.width() + 1);                }            } break;            case WidgetHandle::Right: {                if (pt.x() > 0 && info.width() > 1) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y(), info.x(), info.height(), info.width() - 1);                } else if (pt.x() < 0 && right != -1 && grid->itemAt(right)->spacerItem()) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y(), info.x(), info.height(), info.width() + 1);                }            } break;            case WidgetHandle::Bottom: {                if (pt.y() > 0 && info.width() > 1) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y(), info.x(), info.height() - 1, info.width());                } else if (pt.y() < 0 && bottom != -1 && grid->itemAt(bottom)->spacerItem()) {                    cmd = new ChangeLayoutItemGeometry(formWindow);                    cmd->init(widget, info.y(), info.x(), info.height() + 1, info.width());                }            } break;        }        if (cmd != 0) {            formWindow->commandHistory()->push(cmd);        } else {            grid->invalidate();            grid->activate();            formWindow->clearSelection(false);            formWindow->selectWidget(widget);        }    } else if (geom != widget->geometry()) {        SetPropertyCommand *cmd = new SetPropertyCommand(formWindow);        cmd->init(widget, QLatin1String("geometry"), widget->geometry());        cmd->setOldValue(origGeom);        formWindow->commandHistory()->push(cmd);        formWindow->emitSelectionChanged();    }}void WidgetHandle::trySetGeometry(QWidget *w, int x, int y, int width, int height){    if (!formWindow->hasFeature(FormWindow::EditFeature))        return;    int minw = qMax(w->minimumSizeHint().width(), w->minimumSize().width());    minw = qMax(minw, 2 * formWindow->grid().x());    int minh = qMax(w->minimumSizeHint().height(), w->minimumSize().height());    minh = qMax(minh, 2 * formWindow->grid().y());    if (qMax(minw, width) > w->maximumWidth() ||         qMax(minh, height) > w->maximumHeight())        return;    if (width < minw && x != w->x())        x -= minw - width;    if (height < minh && y != w->y())        y -= minh - height;    w->setGeometry(x, y, qMax(minw, width), qMax(minh, height));}void WidgetHandle::tryResize(QWidget *w, int width, int height){    int minw = qMax(w->minimumSizeHint().width(), w->minimumSize().width());    minw = qMax(minw, 16);    int minh = qMax(w->minimumSizeHint().height(), w->minimumSize().height());    minh = qMax(minh, 16);    w->resize(qMax(minw, width), qMax(minh, height));}// ------------------------------------------------------------------------WidgetSelection::WidgetSelection(FormWindow *parent, QHash<QWidget *, WidgetSelection *> *selDict)    : selectionDict(selDict){    wid = 0;    taskMenu = 0;    formWindow = parent;    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        handles.insert(i, new WidgetHandle(formWindow, (WidgetHandle::Type)i, this));    }    m_topWidget = 0;    hide();}void WidgetSelection::setWidget(QWidget *w, bool updateDict){    taskMenu = 0; // ### qt_extension<QDesignerTaskMenuExtension*>(core()->extensionManager(), w);#ifndef NO_TOPWIDGET    if (m_topWidget) {        Q_ASSERT(m_topWidget->parentWidget() != 0);        m_topWidget->parentWidget()->setAttribute(Qt::WA_ContentsPropagated, false);    }    delete m_topWidget;    m_topWidget = 0;#endif    if (wid != 0)        wid->removeEventFilter(this);    if (w == 0) {        hide();        if (updateDict)            selectionDict->remove(wid);        wid = 0;        return;    }    wid = w;    wid->installEventFilter(this);    bool active = LayoutInfo::isWidgetLaidout(formWindow->core(), wid) == false;    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        if (WidgetHandle *h = handles[i]) {            h->setWidget(wid);            h->setActive(active);        }    }    QLayout *layout = LayoutInfo::managedLayout(formWindow->core(), formWindow->designerWidget(wid->parentWidget()));    if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout)) {        int index = grid->indexOf(wid);        if (index == -1) {#if defined(QD_DEBUG)            qWarning() << "unexpected call to WidgetSelection::setWidget()" << "widget:" << wid << "grid:"<< grid;#endif            return;        }        Q_ASSERT(index != -1);        QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), wid->parentWidget());        if (deco == 0) {            // try with the actual layout            deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), layout);        }        if (deco != 0) {            // bottom cell            handles[WidgetHandle::Bottom]->setActive(true);            // top cell            handles[WidgetHandle::Top]->setActive(true);            // left cell            handles[WidgetHandle::Left]->setActive(true);            // right cell            handles[WidgetHandle::Right]->setActive(true);        } else {            qWarning() << "no QDesignerLayoutDecorationExtension for widget:" << wid;        }    }#ifndef NO_TOPWIDGET    wid->setAttribute(Qt::WA_ContentsPropagated, true);    m_topWidget = new TopWidget(wid);    QPalette p = m_topWidget->palette();    p.setColor(m_topWidget->backgroundRole(), QColor(255, 0, 0, 32));    m_topWidget->setPalette(p);#endif    updateGeometry();    show();    if (updateDict)        selectionDict->insert(w, this);}bool WidgetSelection::isUsed() const{    return wid != 0;}void WidgetSelection::updateGeometry(){    if (!wid || !wid->parentWidget())        return;    QPoint p = wid->parentWidget()->mapToGlobal(wid->pos());    p = formWindow->mapFromGlobal(p);    QRect r(p, wid->size());    int w = 6;    int h = 6;    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        WidgetHandle *hndl = handles[ i ];        if (!hndl)            continue;        switch (i) {        case WidgetHandle::LeftTop:            hndl->move(r.x() - w / 2, r.y() - h / 2);            break;        case WidgetHandle::Top:            hndl->move(r.x() + r.width() / 2 - w / 2, r.y() - h / 2);            break;        case WidgetHandle::RightTop:            hndl->move(r.x() + r.width() - w / 2, r.y() - h / 2);            break;        case WidgetHandle::Right:            hndl->move(r.x() + r.width() - w / 2, r.y() + r.height() / 2 - h / 2);            break;        case WidgetHandle::RightBottom:            hndl->move(r.x() + r.width() - w / 2, r.y() + r.height() - h / 2);            break;        case WidgetHandle::Bottom:            hndl->move(r.x() + r.width() / 2 - w / 2, r.y() + r.height() - h / 2);            break;        case WidgetHandle::LeftBottom:            hndl->move(r.x() - w / 2, r.y() + r.height() - h / 2);            break;        case WidgetHandle::Left:            hndl->move(r.x() - w / 2, r.y() + r.height() / 2 - h / 2);            break;        case WidgetHandle::TaskMenu:            hndl->move(r.x() + r.width() - w / 2, r.y() + h - h / 2);            break;        default:            break;        }    }#ifndef NO_TOPWIDGET    if (m_topWidget) {        m_topWidget->setGeometry(wid->rect());    }#endif}void WidgetSelection::hide(){    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        WidgetHandle *h = handles[ i ];        if (h)            h->hide();    }#ifndef NO_TOPWIDGET    if (m_topWidget)        m_topWidget->hide();#endif}void WidgetSelection::show(){    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        WidgetHandle *h = handles[ i ];        if (h) {            if (i == WidgetHandle::TaskMenu) {                h->setVisible(taskMenuExtension() != 0);                h->raise();            } else {                h->show();                h->raise();            }        }    }#ifndef NO_TOPWIDGET    if (m_topWidget) {        m_topWidget->show();        m_topWidget->raise();    }#endif}void WidgetSelection::update(){    for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) {        WidgetHandle *h = handles[ i ];        if (h)            h->update();    }#ifndef NO_TOPWIDGET    if (m_topWidget)        m_topWidget->update();#endif}QWidget *WidgetSelection::widget() const{    return wid;}QDesignerFormEditorInterface *WidgetSelection::core() const{    if (formWindow)        return formWindow->core();    return 0;}bool WidgetSelection::eventFilter(QObject *object, QEvent *event){    if (object != widget())        return false;    switch (event->type()) {        default: break;        case QEvent::Move:        case QEvent::Resize:            updateGeometry();            break;    } // end switch    return false;}#include "widgetselection.moc"

⌨️ 快捷键说明

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