📄 layout.cpp
字号:
const bool showIt = w->isVisibleTo(m_formWindow); QWidget *container = widgetFactory->containerOfWidget(m_parentWidget); // ### remove widget here QWidget *parentWidget = w->parentWidget(); QDesignerFormEditorInterface *core = m_formWindow->core(); QDesignerLayoutDecorationExtension *deco = qt_extension<QDesignerLayoutDecorationExtension*>(core->extensionManager(), parentWidget); if (deco) deco->removeWidget(w); w->setParent(container); w->setGeometry(rc); if (showIt) w->show(); } LayoutInfo::deleteLayout(m_formWindow->core(), m_layoutBase); if (m_parentWidget != m_layoutBase && !qobject_cast<QMainWindow*>(m_layoutBase)) { m_formWindow->unmanageWidget(m_layoutBase); m_layoutBase->hide(); } else { QMainWindow *mw = qobject_cast<QMainWindow*>(m_formWindow->mainContainer()); if (m_layoutBase != m_formWindow->mainContainer() && (!mw || mw->centralWidget() != m_layoutBase)) m_layoutBase->setGeometry(m_oldGeometry); } QWidget *ww = m_widgets.size() ? m_widgets.front() : m_formWindow; m_formWindow->selectWidget(ww);}void Layout::breakLayout(){ QMap<QWidget *, QRect> rects; foreach (QWidget *w, m_widgets) { rects.insert(w, w->geometry()); } const QPoint m_layoutBasePos = m_layoutBase->pos(); QDesignerWidgetDataBaseInterface *widgetDataBase = m_formWindow->core()->widgetDataBase(); LayoutInfo::deleteLayout(m_formWindow->core(), m_layoutBase); const bool needReparent = qobject_cast<QLayoutWidget*>(m_layoutBase) || qobject_cast<QSplitter*>(m_layoutBase) || (!widgetDataBase->isContainer(m_layoutBase, false) && m_layoutBase != m_formWindow->mainContainer()); const bool needResize = qobject_cast<QSplitter*>(m_layoutBase); const bool add = m_geometries.isEmpty(); QMapIterator<QWidget*, QRect> it(rects); while (it.hasNext()) { it.next(); QWidget *w = it.key(); if (needReparent) { w->setParent(m_layoutBase->parentWidget(), 0); w->move(m_layoutBasePos + it.value().topLeft()); w->show(); } if (needResize) w->resize(it.value().size()); if (add) m_geometries.insert(w, QRect(w->pos(), w->size())); } if (needReparent) { m_layoutBase->hide(); m_parentWidget = m_layoutBase->parentWidget(); m_formWindow->unmanageWidget(m_layoutBase); } else { m_parentWidget = m_layoutBase; } if (!m_widgets.isEmpty() && m_widgets.first() && m_widgets.first()->isVisibleTo(m_formWindow)) m_formWindow->selectWidget(m_widgets.first()); else m_formWindow->selectWidget(m_formWindow);} QLayout *Layout::createLayout(int type){ if (m_useSplitter) return WidgetFactory::createUnmanagedLayout(m_layoutBase, type); QLayout *layout = m_formWindow->core()->widgetFactory()->createLayout(m_layoutBase, 0, type); if (qobject_cast<QLayoutWidget*>(m_layoutBase)) { QDesignerPropertySheetExtension *sheet = qt_extension<QDesignerPropertySheetExtension*>(m_formWindow->core()->extensionManager(), layout); if (sheet) { sheet->setProperty(sheet->indexOf(QLatin1String("leftMargin")), 0); sheet->setProperty(sheet->indexOf(QLatin1String("topMargin")), 0); sheet->setProperty(sheet->indexOf(QLatin1String("rightMargin")), 0); sheet->setProperty(sheet->indexOf(QLatin1String("bottomMargin")), 0); } } return layout;}HorizontalLayout::HorizontalLayout(const QList<QWidget*> &wl, QWidget *p, QDesignerFormWindowInterface *fw, QWidget *lb, bool splitter) : Layout(wl, p, fw, lb, splitter){}void HorizontalLayout::sort(){ HorizontalLayoutList l(m_widgets); l.sort(); m_widgets = l;}void HorizontalLayout::doLayout(){ bool needMove, needReparent; if (!prepareLayout(needMove, needReparent)) return; QHBoxLayout *layout = static_cast<QHBoxLayout *>(createLayout(LayoutInfo::HBox)); foreach (QWidget *w, m_widgets) { if (needReparent && w->parent() != m_layoutBase) { w->setParent(m_layoutBase, 0); w->move(QPoint(0,0)); } if (m_useSplitter) { QSplitter *splitter = qobject_cast<QSplitter*>(m_layoutBase); Q_ASSERT(splitter != 0); splitter->addWidget(w); } else { if (Spacer *spacer = qobject_cast<Spacer*>(w)) layout->addWidget(w, 0, spacer->alignment()); else add_to_box_layout(layout, w); } w->show(); } if (QSplitter *splitter = qobject_cast<QSplitter*>(m_layoutBase)) splitter->setOrientation(Qt::Horizontal); finishLayout(needMove, layout);}VerticalLayout::VerticalLayout(const QList<QWidget*> &wl, QWidget *p, QDesignerFormWindowInterface *fw, QWidget *lb, bool splitter) : Layout(wl, p, fw, lb, splitter){}void VerticalLayout::sort(){ VerticalLayoutList l(m_widgets); l.sort(); m_widgets = l;}void VerticalLayout::doLayout(){ bool needMove, needReparent; if (!prepareLayout(needMove, needReparent)) return; QVBoxLayout *layout = static_cast<QVBoxLayout *>(createLayout(LayoutInfo::VBox)); Q_ASSERT(layout != 0); foreach (QWidget *w, m_widgets) { if (needReparent && w->parent() != m_layoutBase) { w->setParent(m_layoutBase, 0); w->move(QPoint(0,0)); } if (m_useSplitter) { QSplitter *splitter = qobject_cast<QSplitter*>(m_layoutBase); Q_ASSERT(splitter != 0); splitter->addWidget(w); } else { if (Spacer *spacer = qobject_cast<Spacer*>(w)) layout->addWidget(w, 0, spacer->alignment()); else add_to_box_layout(layout, w); } w->show(); } if (QSplitter *splitter = qobject_cast<QSplitter*>(m_layoutBase)) { // ### m_useSplitter?? splitter->setOrientation(Qt::Vertical); } finishLayout(needMove, layout);}class Grid{public: Grid(int rows, int cols); ~Grid(); QWidget* cell(int row, int col) const { return m_cells[ row * m_ncols + col]; } void setCell(int row, int col, QWidget* w) { m_cells[ row * m_ncols + col] = w; } void setCells(QRect c, QWidget* w) { for (int rows = c.bottom()-c.top(); rows >= 0; rows--) for (int cols = c.right()-c.left(); cols >= 0; cols--) { setCell(c.top()+rows, c.left()+cols, w); } } int numRows() const { return m_nrows; } int numCols() const { return m_ncols; } void simplify(); bool locateWidget(QWidget* w, int& row, int& col, int& rowspan, int& colspan);private: void merge(); int countRow(int r, int c) const; int countCol(int r, int c) const; void setRow(int r, int c, QWidget* w, int count); void setCol(int r, int c, QWidget* w, int count); bool isWidgetStartCol(int c) const; bool isWidgetEndCol(int c) const; bool isWidgetStartRow(int r) const; bool isWidgetEndRow(int r) const; bool isWidgetTopLeft(int r, int c) const; void extendLeft(); void extendRight(); void extendUp(); void extendDown(); const int m_nrows; const int m_ncols; QWidget** m_cells; bool* m_cols; bool* m_rows;};Grid::Grid(int r, int c) : m_nrows(r), m_ncols(c), m_cells(new QWidget*[ r * c ]), m_cols(new bool[ c ]), m_rows(new bool[ r ]){ qFill(m_cells, m_cells + r * c, static_cast<QWidget *>(0));}Grid::~Grid(){ delete [] m_cells; delete [] m_cols; delete [] m_rows;}int Grid::countRow(int r, int c) const{ QWidget* w = cell(r, c); int i = c + 1; while (i < m_ncols && cell(r, i) == w) i++; return i - c;}int Grid::countCol(int r, int c) const{ QWidget* w = cell(r, c); int i = r + 1; while (i < m_nrows && cell(i, c) == w) i++; return i - r;}void Grid::setCol(int r, int c, QWidget* w, int count){ for (int i = 0; i < count; i++) setCell(r + i, c, w);}void Grid::setRow(int r, int c, QWidget* w, int count){ for (int i = 0; i < count; i++) setCell(r, c + i, w);}bool Grid::isWidgetStartCol(int c) const{ int r; for (r = 0; r < m_nrows; r++) { if (cell(r, c) && ((c==0) || (cell(r, c) != cell(r, c-1)))) { return true; } } return false;}bool Grid::isWidgetEndCol(int c) const{ int r; for (r = 0; r < m_nrows; r++) { if (cell(r, c) && ((c == m_ncols-1) || (cell(r, c) != cell(r, c+1)))) return true; } return false;}bool Grid::isWidgetStartRow(int r) const{ int c; for (c = 0; c < m_ncols; c++) { if (cell(r, c) && ((r==0) || (cell(r, c) != cell(r-1, c)))) return true; } return false;}bool Grid::isWidgetEndRow(int r) const{ int c; for (c = 0; c < m_ncols; c++) { if (cell(r, c) && ((r == m_nrows-1) || (cell(r, c) != cell(r+1, c)))) return true; } return false;}bool Grid::isWidgetTopLeft(int r, int c) const{ QWidget* w = cell(r, c); if (!w) return false; return (!r || cell(r-1, c) != w) && (!c || cell(r, c-1) != w);}void Grid::extendLeft(){ int r,c,i; for (c = 1; c < m_ncols; 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 >= 0; i--) { if (cell(r, i)) break; if (countCol(r, i) < cc) break; if (isWidgetEndCol(i)) break; if (isWidgetStartCol(i)) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -