📄 layout.cpp
字号:
stretch = c - i; break; } } if (stretch) { for (i = 0; i < stretch; i++) setCol(r, c-i-1, w, cc); } } }}void Grid::extendRight(){ int r,c,i; for (c = m_ncols - 2; c >= 0; c--) { for (r = 0; r < m_nrows; r++) { QWidget* w = cell(r, c); if (!w) continue; int cc = countCol(r, c); int stretch = 0; for (i = c+1; i < m_ncols; i++) { if (cell(r, i)) break; if (countCol(r, i) < cc) break; if (isWidgetStartCol(i)) break; if (isWidgetEndCol(i)) { stretch = i - c; break; } } if (stretch) { for (i = 0; i < stretch; i++) setCol(r, c+i+1, w, cc); } } }}void Grid::extendUp(){ int r,c,i; for (r = 1; r < m_nrows; r++) { for (c = 0; c < m_ncols; c++) { QWidget* w = cell(r, c); if (!w) continue; int cr = countRow(r, c); int stretch = 0; for (i = r-1; i >= 0; i--) { if (cell(i, c)) break; if (countRow(i, c) < cr) break; if (isWidgetEndRow(i)) break; if (isWidgetStartRow(i)) { stretch = r - i; break; } } if (stretch) { for (i = 0; i < stretch; i++) setRow(r-i-1, c, w, cr); } } }}void Grid::extendDown(){ int r,c,i; for (r = m_nrows - 2; r >= 0; r--) { for (c = 0; c < m_ncols; c++) { QWidget* w = cell(r, c); if (!w) continue; int cr = countRow(r, c); int stretch = 0; for (i = r+1; i < m_nrows; i++) { if (cell(i, c)) break; if (countRow(i, c) < cr) break; if (isWidgetStartRow(i)) break; if (isWidgetEndRow(i)) { stretch = i - r; break; } } if (stretch) { for (i = 0; i < stretch; i++) setRow(r+i+1, c, w, cr); } } }}void Grid::simplify(){ extendLeft(); extendRight(); extendUp(); extendDown(); merge();}void Grid::merge(){ int r,c; for (c = 0; c < m_ncols; c++) m_cols[c] = false; for (r = 0; r < m_nrows; r++) m_rows[r] = false; for (c = 0; c < m_ncols; c++) { for (r = 0; r < m_nrows; r++) { if (isWidgetTopLeft(r, c)) { m_rows[r] = true; m_cols[c] = true; } } }}bool Grid::locateWidget(QWidget *w, int &row, int &col, int &rowspan, int &colspan){ int r, c, r2, c2; for (c = 0; c < m_ncols; c++) { for (r = 0; r < m_nrows; r++) { if (cell(r, c) == w) { row = 0; for (r2 = 1; r2 <= r; r2++) { if (m_rows[r2-1]) row++; } col = 0; for (c2 = 1; c2 <= c; c2++) { if (m_cols[c2-1]) col++; } rowspan = 0; for (r2 = r ; r2 < m_nrows && cell(r2, c) == w; r2++) { if (m_rows[r2]) rowspan++; } colspan = 0; for (c2 = c; c2 < m_ncols && cell(r, c2) == w; c2++) { if (m_cols[c2]) colspan++; } return true; } } } return false;}GridLayout::GridLayout(const QList<QWidget*> &wl, QWidget *p, QDesignerFormWindowInterface *fw, QWidget *lb, const QSize &res) : Layout(wl, p, fw, lb), m_resolution(res), m_grid(0){}GridLayout::~GridLayout(){ delete m_grid;}QWidget *GridLayout::widgetAt(QGridLayout *layout, int row, int column) const{ int index = 0; while (QLayoutItem *item = layout->itemAt(index)) { if (item->widget()) { int r, c, rowspan, colspan; layout->getItemPosition(index, &r, &c, &rowspan, &colspan); if (row == r && column == c) return item->widget(); } ++index; } return 0;}void GridLayout::doLayout(){ bool needMove, needReparent; if (!prepareLayout(needMove, needReparent)) return; QGridLayout *layout = static_cast<QGridLayout *>(createLayout(LayoutInfo::Grid)); if (!m_grid) buildGrid(); foreach (QWidget *w, m_widgets) { int r = 0, c = 0, rs = 0, cs = 0; if (m_grid->locateWidget(w, r, c, rs, cs)) { if (needReparent && w->parent() != m_layoutBase) { w->setParent(m_layoutBase, 0); w->move(QPoint(0,0)); } Qt::Alignment alignment = Qt::Alignment(0); if (Spacer *spacer = qobject_cast<Spacer*>(w)) alignment = spacer->alignment(); if (rs * cs == 1) { add_to_grid_layout(layout, w, r, c, 1, 1, alignment); } else { add_to_grid_layout(layout, w, r, c, rs, cs, alignment); } w->show(); } else { qDebug("ooops, widget '%s' does not fit in layout", w->objectName().toUtf8().constData()); } } QLayoutSupport::createEmptyCells(layout); finishLayout(needMove, layout);}void GridLayout::sort(){ buildGrid();}void GridLayout::buildGrid(){ if (!m_widgets.count()) return;#if 0 QMap<int, int> x_dict; QMap<int, int> y_dict; foreach (QWidget *w, m_widgets) { QRect g = w->geometry(); x_dict.insert(g.left(), g.left()); x_dict.insert(g.right(), g.right()); y_dict.insert(g.top(), g.top()); y_dict.insert(g.bottom(), g.bottom()); } QList<int> x = x_dict.keys(); QList<int> y = y_dict.keys();#else // Pixel to cell conversion: // By keeping a list of start'n'stop values (x & y) for each widget, // it is possible to create a very small grid of cells to represent // the widget layout. // ----------------------------------------------------------------- // We need a list of both start and stop values for x- & y-axis QVector<int> x( m_widgets.count()*2 ); QVector<int> y( m_widgets.count()*2 ); // Using push_back would look nicer, but operator[] is much faster int index = 0; QWidget* w = 0; for (int i = 0; i < m_widgets.size(); ++i) { w = m_widgets.at(i); QRect widgetPos = w->geometry(); x[index] = widgetPos.left(); x[index+1] = widgetPos.right(); y[index] = widgetPos.top(); y[index+1] = widgetPos.bottom(); index += 2; } qSort(x); qSort(y); // Remove duplicate x enteries (Remove next, if equal to current) if ( !x.empty() ) { for (QVector<int>::iterator current = x.begin() ; (current != x.end()) && ((current+1) != x.end()) ; ) if ( (*current == *(current+1)) ) x.erase(current+1); else current++; } // Remove duplicate y enteries (Remove next, if equal to current) if ( !y.empty() ) { for (QVector<int>::iterator current = y.begin() ; (current != y.end()) && ((current+1) != y.end()) ; ) if ( (*current == *(current+1)) ) y.erase(current+1); else current++; }#endif delete m_grid; m_grid = new Grid(y.size() - 1, x.size() - 1); // Mark the cells in the grid that contains a widget foreach (QWidget *w, m_widgets) { QRect widgetPos = w->geometry(); QRect c(0, 0, 0, 0); // From left til right (not including) for (int cw=0; cw<x.size(); cw++) { if (x[cw] == widgetPos.left()) c.setLeft(cw); if (x[cw] < widgetPos.right()) c.setRight(cw); } // From top til bottom (not including) for (int ch=0; ch<y.size(); ch++) { if (y[ch] == widgetPos.top() ) c.setTop(ch); if (y[ch] < widgetPos.bottom()) c.setBottom(ch); } m_grid->setCells(c, w); // Mark cellblock } m_grid->simplify(); QList<QWidget *> widgets; for (int i = 0; i < m_grid->numRows(); i++) for (int j = 0; j < m_grid->numCols(); j++) { QWidget *w = m_grid->cell(i, j); if (w && !widgets.contains(w)) widgets.append(w); } m_widgets = widgets;}} // namespace qdesigner_internal
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -