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

📄 layout.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        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 + -