📄 qlayout_widget.cpp
字号:
&& at_column >= column && at_column < (column + colspan)) return index; ++index; } return -1;}QLayoutWidgetItem::QLayoutWidgetItem(QWidget *widget) : QWidgetItem(widget){}void QLayoutWidgetItem::setGeometry(const QRect &r){ widget()->setGeometry(r);}QSize QLayoutWidgetItem::sizeHint() const{ if (QLayout *l = theLayout()) return l->sizeHint(); return QWidgetItem::sizeHint();}QSize QLayoutWidgetItem::minimumSize() const{ if (QLayout *l = theLayout()) return l->minimumSize(); return QWidgetItem::minimumSize();}QSize QLayoutWidgetItem::maximumSize() const{ if (QLayout *l = theLayout()) return l->maximumSize(); return QWidgetItem::maximumSize();}Qt::Orientations QLayoutWidgetItem::expandingDirections() const{ if (QLayout *l = theLayout()) return l->expandingDirections(); return QWidgetItem::expandingDirections();}void QLayoutWidgetItem::addTo(QLayout *layout){ static_cast<qdesigner_internal::FriendlyLayout*>(layout)->addChildWidget(widget());}bool QLayoutWidgetItem::hasHeightForWidth() const{ if (QLayout *l = theLayout()) return l->hasHeightForWidth(); return QWidgetItem::hasHeightForWidth();}int QLayoutWidgetItem::heightForWidth(int w) const{ if (QLayout *l = theLayout()) return l->heightForWidth(w); return QWidgetItem::heightForWidth(w);}int QLayoutWidgetItem::minimumHeightForWidth(int w) const{ if (QLayout *l = theLayout()) return l->minimumHeightForWidth(w); return QWidgetItem::minimumHeightForWidth(w);}void QLayoutWidgetItem::removeFrom(QLayout *layout){ Q_UNUSED(layout);}void QLayoutSupport::insertWidget(int index, QWidget *widget){ QGridLayout *gridLayout = qobject_cast<QGridLayout*>(layout()); QLayoutItem *item = gridLayout->itemAt(index); if (!item || !isEmptyItem(item)) { qWarning() << "the cell is not empty"; return; } int row, column, rowspan, colspan; gridLayout->getItemPosition(index, &row, &column, &rowspan, &colspan); gridLayout->takeAt(index); add_to_grid_layout(gridLayout, widget, row, column, rowspan, colspan); delete item;}void QLayoutSupport::createEmptyCells(QGridLayout *&gridLayout){ Q_ASSERT(gridLayout); { // take the spacers items int index = 0; while (QLayoutItem *item = gridLayout->itemAt(index)) { if (QSpacerItem *spacer = item->spacerItem()) { gridLayout->takeAt(index); delete spacer; // we don't have to increment the `index' here! } else ++index; } } QMap<QPair<int,int>, QLayoutItem*> cells; for (int r = 0; r < gridLayout->rowCount(); ++r) { for (int c = 0; c < gridLayout->columnCount(); ++c) { QPair<int,int> cell = qMakePair(r, c); cells.insert(cell, 0); } } int index = 0; while (QLayoutItem *item = gridLayout->itemAt(index)) { int row, column, rowspan, colspan; gridLayout->getItemPosition(index, &row, &column, &rowspan, &colspan); ++index; for (int r = row; r < row + rowspan; ++r) { for (int c = column; c < column + colspan; ++c) { QPair<int,int> cell = qMakePair(r, c); cells[cell] = item; if (!item) { /* skip */ } else if (item->layout()) { qWarning("unexpected layout"); } else if (item->spacerItem()) { qWarning("unexpected spacer"); } } } } QMapIterator<QPair<int,int>, QLayoutItem*> it(cells); while (it.hasNext()) { it.next(); const QPair<int, int> &cell = it.key(); QLayoutItem *item = it.value(); if (!item || !item->widget() && findItemAt(gridLayout, cell.first, cell.second) == -1) { gridLayout->addItem(new QSpacerItem(20, 20), cell.first, cell.second); } }}void QLayoutSupport::insertRow(int row){ QHash<QLayoutItem*, QRect> infos; computeGridLayout(&infos); QMutableHashIterator<QLayoutItem*, QRect> it(infos); while (it.hasNext()) { it.next(); QRect info = it.value(); if (info.y() >= row) { info.translate(0, 1); it.setValue(info); } } rebuildGridLayout(&infos); QGridLayout *gridLayout = qobject_cast<QGridLayout*>(layout()); Q_ASSERT(gridLayout); if (gridLayout->rowCount() == row) { gridLayout->addItem(new QSpacerItem(20, 20), gridLayout->rowCount(), 0); } gridLayout = qobject_cast<QGridLayout*>(layout()); Q_ASSERT(gridLayout); createEmptyCells(gridLayout); layout()->activate();}void QLayoutSupport::insertColumn(int column){ QGridLayout *gridLayout = qobject_cast<QGridLayout*>(layout()); if (!gridLayout) return; QHash<QLayoutItem*, QRect> infos; computeGridLayout(&infos); QMutableHashIterator<QLayoutItem*, QRect> it(infos); while (it.hasNext()) { it.next(); QRect info = it.value(); if (info.x() >= column) { info.translate(1, 0); it.setValue(info); } } rebuildGridLayout(&infos); gridLayout = qobject_cast<QGridLayout*>(layout()); Q_ASSERT(gridLayout); if (gridLayout->columnCount() == column) { gridLayout->addItem(new QSpacerItem(20, 20), 0, gridLayout->columnCount()); } gridLayout = qobject_cast<QGridLayout*>(layout()); Q_ASSERT(gridLayout); createEmptyCells(gridLayout); layout()->activate();}QRect QLayoutSupport::itemInfo(int index) const{ Q_ASSERT(layout()); if (QGridLayout *l = qobject_cast<QGridLayout*>(layout())) { int row, column, rowSpan, columnSpan; l->getItemPosition(index, &row, &column, &rowSpan, &columnSpan); return QRect(column, row, columnSpan, rowSpan); } else if (qobject_cast<QHBoxLayout*>(layout())) { return QRect(index, 0, 1, 1); } else if (qobject_cast<QVBoxLayout*>(layout())) { return QRect(0, index, 1, 1); } else { Q_ASSERT(0); // ### not supported yet! return QRect(); }}QRect QLayoutSupport::extendedGeometry(int index) const{ QLayoutItem *item = layout()->itemAt(index); QRect g = item->geometry(); QRect info = itemInfo(index); if (info.x() == 0) { QPoint topLeft = g.topLeft(); topLeft.rx() = layout()->geometry().left(); g.setTopLeft(topLeft); } if (info.y() == 0) { QPoint topLeft = g.topLeft(); topLeft.ry() = layout()->geometry().top(); g.setTopLeft(topLeft); } if (QVBoxLayout *vbox = qobject_cast<QVBoxLayout*>(layout())) { if (vbox->itemAt(index+1) == 0) { QPoint bottomRight = g.bottomRight(); bottomRight.ry() = layout()->geometry().bottom(); g.setBottomRight(bottomRight); } } else if (QHBoxLayout *hbox = qobject_cast<QHBoxLayout*>(layout())) { if (hbox->itemAt(index+1) == 0) { QPoint bottomRight = g.bottomRight(); bottomRight.rx() = layout()->geometry().right(); g.setBottomRight(bottomRight); } } else if (QGridLayout *grid = qobject_cast<QGridLayout*>(layout())) { if (grid->rowCount() == info.y()) { QPoint bottomRight = g.bottomRight(); bottomRight.ry() = layout()->geometry().bottom(); g.setBottomRight(bottomRight); } if (grid->columnCount() == info.x()) { QPoint bottomRight = g.bottomRight(); bottomRight.rx() = layout()->geometry().right(); g.setBottomRight(bottomRight); } } return g;}int QLayoutSupport::findItemAt(const QPoint &pos) const{ if (!layout()) return -1; int best = -1; int bestIndex = -1; int index = 0; while (QLayoutItem *item = layout()->itemAt(index)) { QRect g = item->geometry(); int dist = (g.center() - pos).manhattanLength(); if (best == -1 || dist < best) { best = dist; bestIndex = index; } ++index; } return bestIndex;}void QLayoutSupport::computeGridLayout(QHash<QLayoutItem*, QRect> *l){ int index = 0; while (QLayoutItem *item = layout()->itemAt(index)) { QRect info = itemInfo(index); l->insert(item, info); ++index; }}void QLayoutSupport::rebuildGridLayout(QHash<QLayoutItem*, QRect> *infos){ QGridLayout *gridLayout = qobject_cast<QGridLayout*>(layout()); int margin = gridLayout->margin(); int spacing = gridLayout->spacing(); { // take the items int index = 0; while (gridLayout->itemAt(index)) gridLayout->takeAt(index); } Q_ASSERT(gridLayout == m_widget->layout()); QDesignerFormEditorInterface *core = formWindow()->core(); LayoutInfo::deleteLayout(core, m_widget); gridLayout = (QGridLayout*) core->widgetFactory()->createLayout(m_widget, 0, LayoutInfo::Grid); QHashIterator<QLayoutItem*, QRect> it(*infos); while (it.hasNext()) { it.next(); QRect info = it.value(); gridLayout->addItem(it.key(), info.y(), info.x(), info.height(), info.width()); } gridLayout->setMargin(margin); gridLayout->setSpacing(spacing);}QLayoutWidget::QLayoutWidget(QDesignerFormWindowInterface *formWindow, QWidget *parent) : QWidget(parent), m_formWindow(formWindow), m_support(formWindow, this){}void QLayoutWidget::paintEvent(QPaintEvent*){ if (!m_formWindow->hasFeature(QDesignerFormWindowInterface::GridFeature)) return; if (m_formWindow->currentTool() != 0) return; // only draw red borders if we're editting widgets QPainter p(this); if (layout() != 0) { p.setPen(QPen(QColor(255, 0, 0, 35))); int index = 0; while (QLayoutItem *item = layout()->itemAt(index)) { ++index; if (item->spacerItem()) p.drawRect(item->geometry()); } } p.setPen(QPen(Qt::red)); p.drawRect(0, 0, width() - 1, height() - 1);}void QLayoutWidget::updateMargin(){}bool QLayoutWidget::event(QEvent *e){ switch (e->type()) { case QEvent::ParentChange: if (e->type() == QEvent::ParentChange) updateMargin(); break; case QEvent::LayoutRequest: { (void) QWidget::event(e); if (layout() && LayoutInfo::layoutType(formWindow()->core(), parentWidget()) == LayoutInfo::NoLayout) { resize(layout()->totalMinimumSize().expandedTo(size())); } update(); return true; } default: break; } return QWidget::event(e);}int QLayoutWidget::layoutMargin() const{ if (layout()) return layout()->margin() - 1; return -1;}void QLayoutWidget::setLayoutMargin(int layoutMargin){ if (layout()) layout()->setMargin(layoutMargin + 1); QList<QLayoutWidget*> lst = qFindChildren<QLayoutWidget*>(this); foreach (QLayoutWidget *lay, lst) lay->setLayoutMargin(layoutMargin);}int QLayoutWidget::layoutSpacing() const{ if (layout()) return layout()->spacing(); return 0;}void QLayoutWidget::setLayoutSpacing(int layoutSpacing){ if (layout()) layout()->setSpacing(layoutSpacing);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -