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

📄 layout.cpp

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