widgetselection.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 737 行 · 第 1/2 页
CPP
737 行
if (m_type == TaskMenu) return; e->accept(); if (!m_formWindow->hasFeature(FormWindow::EditFeature)) return; QLayout *lt = 0; // Check for managed layout LayoutInfo::Type layoutType = m_widget->parentWidget() ? LayoutInfo::layoutType(m_formWindow->core(), m_widget->parentWidget(), lt) : LayoutInfo::NoLayout; if (layoutType == LayoutInfo::Grid) { const QSize size = m_widget->parentWidget()->size(); QGridLayout *grid = static_cast<QGridLayout*>(m_widget->parentWidget()->layout()); QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), m_widget->parentWidget()); const int index = deco->indexOf(m_widget); const QRect info = deco->itemInfo(index); const int top = deco->findItemAt(info.top() - 1, info.left()); const int left = deco->findItemAt(info.top(), info.left() - 1); const int bottom = deco->findItemAt(info.bottom() + 1, info.left()); const int right = deco->findItemAt(info.top(), info.right() + 1); const QPoint pt = m_origGeom.center() - m_widget->geometry().center(); ChangeLayoutItemGeometry *cmd = 0; switch (m_type) { default: break; case WidgetHandle::Top: { if (pt.y() < 0 && info.height() > 1) { cmd = new ChangeLayoutItemGeometry(m_formWindow); cmd->init(m_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(m_formWindow); cmd->init(m_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(m_formWindow); cmd->init(m_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(m_formWindow); cmd->init(m_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(m_formWindow); cmd->init(m_widget, info.y(), info.x(), info.height(), info.width() - 1); } else if (pt.x() < 0 && right != -1 && grid->itemAt(right)->spacerItem()) { cmd = new ChangeLayoutItemGeometry(m_formWindow); cmd->init(m_widget, info.y(), info.x(), info.height(), info.width() + 1); } } break; case WidgetHandle::Bottom: { if (pt.y() > 0 && info.width() > 1) { cmd = new ChangeLayoutItemGeometry(m_formWindow); cmd->init(m_widget, info.y(), info.x(), info.height() - 1, info.width()); } else if (pt.y() < 0 && bottom != -1 && grid->itemAt(bottom)->spacerItem()) { cmd = new ChangeLayoutItemGeometry(m_formWindow); cmd->init(m_widget, info.y(), info.x(), info.height() + 1, info.width()); } } break; } if (cmd != 0) { m_formWindow->commandHistory()->push(cmd); } else { grid->invalidate(); grid->activate(); m_formWindow->clearSelection(false); m_formWindow->selectWidget(m_widget); } } else if (m_geom != m_widget->geometry()) { SetPropertyCommand *cmd = new SetPropertyCommand(m_formWindow); cmd->init(m_widget, QLatin1String("geometry"), m_widget->geometry()); cmd->setOldValue(m_origGeom); m_formWindow->commandHistory()->push(cmd); m_formWindow->emitSelectionChanged(); }}void WidgetHandle::trySetGeometry(QWidget *w, int x, int y, int width, int height){ if (!m_formWindow->hasFeature(FormWindow::EditFeature)) return; int minw = qMax(w->minimumSizeHint().width(), w->minimumSize().width()); minw = qMax(minw, 2 * m_formWindow->grid().x()); int minh = qMax(w->minimumSizeHint().height(), w->minimumSize().height()); minh = qMax(minh, 2 * m_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) : m_topWidget(0), m_wid(0), m_formWindow(parent), m_taskMenu(0){ for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { m_handles.insert(i, new WidgetHandle(m_formWindow, static_cast<WidgetHandle::Type>(i), this)); } hide();}void WidgetSelection::setWidget(QWidget *w){ m_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 (m_wid != 0) m_wid->removeEventFilter(this); if (w == 0) { hide(); m_wid = 0; return; } m_wid = w; m_wid->installEventFilter(this); const bool active = LayoutInfo::isWidgetLaidout(m_formWindow->core(), m_wid) == false; for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { if (WidgetHandle *h = m_handles[i]) { h->setWidget(m_wid); h->setActive(active); } } QLayout *layout = LayoutInfo::managedLayout(m_formWindow->core(), m_formWindow->designerWidget(m_wid->parentWidget())); if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout)) { const int index = grid->indexOf(m_wid); if (index == -1) {#if defined(QD_DEBUG) qDebug() << "unexpected call to WidgetSelection::setWidget()" << "widget:" << m_wid << "grid:"<< grid;#endif return; } Q_ASSERT(index != -1); QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), m_wid->parentWidget()); if (deco == 0) { // try with the actual layout deco = qt_extension<QDesignerLayoutDecorationExtension*>(core()->extensionManager(), layout); } if (deco != 0) { // bottom cell m_handles[WidgetHandle::Bottom]->setActive(true); // top cell m_handles[WidgetHandle::Top]->setActive(true); // left cell m_handles[WidgetHandle::Left]->setActive(true); // right cellg59 m_handles[WidgetHandle::Right]->setActive(true); } else { qDebug() << "no QDesignerLayoutDecorationExtension for widget:" << m_wid; } }#ifndef NO_TOPWIDGET m_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();}bool WidgetSelection::isUsed() const{ return m_wid != 0;}void WidgetSelection::updateGeometry(){ if (!m_wid || !m_wid->parentWidget()) return; QPoint p = m_wid->parentWidget()->mapToGlobal(m_wid->pos()); p = m_formWindow->mapFromGlobal(p); const QRect r(p, m_wid->size()); const int w = 6; const int h = 6; for (int i = WidgetHandle::LeftTop; i < WidgetHandle::TypeCount; ++i) { WidgetHandle *hndl = m_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 = m_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 = m_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 = m_handles[ i ]; if (h) h->update(); }#ifndef NO_TOPWIDGET if (m_topWidget) m_topWidget->update();#endif}QWidget *WidgetSelection::widget() const{ return m_wid;}QDesignerFormEditorInterface *WidgetSelection::core() const{ if (m_formWindow) return m_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 + =
减小字号Ctrl + -
显示快捷键?