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

📄 qlayout_widget.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            && 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 + -