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

📄 qdockarealayout.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    int tab_idx = 0;    bool changed = false;    for (int i = 0; i < item_list.count(); ++i) {        const QDockAreaLayoutItem &item = item_list.at(i);        if (item.skip())            continue;        if (item.gap) {            gap = true;            continue;        }        if (item.widgetItem == 0)            continue;        QDockWidget *dw = qobject_cast<QDockWidget*>(item.widgetItem->widget());        QString title = dw->d_func()->fixedWindowTitle;        quintptr id = tabId(item);        if (tab_idx == tabBar->count()) {            tabBar->insertTab(tab_idx, title);#ifndef QT_NO_TOOLTIP            tabBar->setTabToolTip(tab_idx, title);#endif            tabBar->setTabData(tab_idx, id);            changed = true;        } else if (qvariant_cast<quintptr>(tabBar->tabData(tab_idx)) != id) {            if (tab_idx + 1 < tabBar->count()                    && qvariant_cast<quintptr>(tabBar->tabText(tab_idx + 1)) == id)                tabBar->removeTab(tab_idx);            else {                tabBar->insertTab(tab_idx, title);#ifndef QT_NO_TOOLTIP                tabBar->setTabToolTip(tab_idx, title);#endif                tabBar->setTabData(tab_idx, id);            }            changed = true;        }        if (title != tabBar->tabText(tab_idx)) {            tabBar->setTabText(tab_idx, title);#ifndef QT_NO_TOOLTIP            tabBar->setTabToolTip(tab_idx, title);#endif            changed = true;        }        ++tab_idx;    }    while (tab_idx < tabBar->count()) {        tabBar->removeTab(tab_idx);        changed = true;    }    tabBar->blockSignals(blocked);    that->tabBarVisible = gap || tabBar->count() > 1;    if (changed || !tabBarMin.isValid() | !tabBarHint.isValid()) {        that->tabBarMin = tabBar->minimumSizeHint();        that->tabBarHint = tabBar->sizeHint();    }}void QDockAreaLayoutInfo::setTabBarShape(int shape){    if (shape == tabBarShape)        return;    tabBarShape = shape;    if (tabBar != 0) {        tabBar->setShape(static_cast<QTabBar::Shape>(shape));        tabBarMin = QSize();        tabBarHint = QSize();    }    for (int i = 0; i < item_list.count(); ++i) {        QDockAreaLayoutItem &item = item_list[i];        if (item.subinfo != 0)            item.subinfo->setTabBarShape(shape);    }}QSize QDockAreaLayoutInfo::tabBarMinimumSize() const{    if (!tabbed)        return QSize(0, 0);    updateTabBar();    return tabBarMin;}QSize QDockAreaLayoutInfo::tabBarSizeHint() const{    if (!tabbed)        return QSize(0, 0);    updateTabBar();    return tabBarHint;}QSet<QTabBar*> QDockAreaLayoutInfo::usedTabBars() const{    QSet<QTabBar*> result;    if (tabbed) {        updateTabBar();        result.insert(tabBar);    }    for (int i = 0; i < item_list.count(); ++i) {        const QDockAreaLayoutItem &item = item_list.at(i);        if (item.subinfo != 0)            result += item.subinfo->usedTabBars();    }    return result;}QRect QDockAreaLayoutInfo::tabContentRect() const{    if (!tabbed)        return QRect();    QRect result = rect;    QSize tbh = tabBarSizeHint();    if (tabBarVisible) {        switch (tabBarShape) {            case QTabBar::RoundedNorth:                result.adjust(0, tbh.height(), 0, 0);                break;            case QTabBar::RoundedSouth:                result.adjust(0, 0, 0, -tbh.height());                break;            case QTabBar::RoundedEast:                result.adjust(0, 0, -tbh.width(), 0);                break;            case QTabBar::RoundedWest:                result.adjust(tbh.width(), 0, 0, 0);                break;            default:                break;        }    }    return result;}#endif // QT_NO_TABBAR/******************************************************************************** QDockAreaLayout*/QDockAreaLayout::QDockAreaLayout(QMainWindow *win){    mainWindow = win;    sep = win->style()->pixelMetric(QStyle::PM_DockWidgetSeparatorExtent);#ifndef QT_NO_TABBAR    const int tabShape = QTabBar::RoundedSouth;#else    const int tabShape = 0;#endif    docks[QInternal::LeftDock]        = QDockAreaLayoutInfo(sep, QInternal::LeftDock, Qt::Vertical, tabShape, win);    docks[QInternal::RightDock]        = QDockAreaLayoutInfo(sep, QInternal::RightDock, Qt::Vertical, tabShape, win);    docks[QInternal::TopDock]        = QDockAreaLayoutInfo(sep, QInternal::TopDock, Qt::Horizontal, tabShape, win);    docks[QInternal::BottomDock]        = QDockAreaLayoutInfo(sep, QInternal::BottomDock, Qt::Horizontal, tabShape, win);    centralWidgetItem = 0;    centralWidgetRect = QRect(0, 0, -1, -1);    corners[Qt::TopLeftCorner] = Qt::TopDockWidgetArea;    corners[Qt::TopRightCorner] = Qt::TopDockWidgetArea;    corners[Qt::BottomLeftCorner] = Qt::BottomDockWidgetArea;    corners[Qt::BottomRightCorner] = Qt::BottomDockWidgetArea;}bool QDockAreaLayout::isValid() const{    return rect.isValid();}void QDockAreaLayout::saveState(QDataStream &stream) const{    stream << (uchar) DockWidgetStateMarker;    int cnt = 0;    for (int i = 0; i < QInternal::DockCount; ++i) {        if (!docks[i].item_list.isEmpty())            ++cnt;    }    stream << cnt;    for (int i = 0; i < QInternal::DockCount; ++i) {        if (docks[i].item_list.isEmpty())            continue;        stream << i << docks[i].rect.size();        docks[i].saveState(stream);    }    stream << centralWidgetRect.size();    for (int i = 0; i < 4; ++i)        stream << static_cast<int>(corners[i]);}bool QDockAreaLayout::restoreState(QDataStream &stream, const QList<QDockWidget*> &_dockwidgets){    QList<QDockWidget*> dockwidgets = _dockwidgets;    int cnt;    stream >> cnt;    for (int i = 0; i < cnt; ++i) {        int pos;        stream >> pos;        QSize size;        stream >> size;        docks[pos].rect = QRect(QPoint(0, 0), size);        if (!docks[pos].restoreState(stream, dockwidgets)) {            stream.setStatus(QDataStream::ReadCorruptData);            return false;        }    }    QSize size;    stream >> size;    centralWidgetRect = QRect(QPoint(0, 0), size);    bool ok = stream.status() == QDataStream::Ok;    if (ok) {        int cornerData[4];        for (int i = 0; i < 4; ++i)            stream >> cornerData[i];        if (stream.status() == QDataStream::Ok) {            for (int i = 0; i < 4; ++i)                corners[i] = static_cast<Qt::DockWidgetArea>(cornerData[i]);        }    }    return ok;}QList<int> QDockAreaLayout::indexOf(QWidget *dockWidget) const{    for (int i = 0; i < QInternal::DockCount; ++i) {        QList<int> result = docks[i].indexOf(dockWidget);        if (!result.isEmpty()) {            result.prepend(i);            return result;        }    }    return QList<int>();}QList<int> QDockAreaLayout::gapIndex(const QPoint &pos) const{    QMainWindow::DockOptions opts = mainWindow->dockOptions();    bool nestingEnabled = opts & QMainWindow::AllowNestedDocks;    QDockAreaLayoutInfo::TabMode tabMode = QDockAreaLayoutInfo::NoTabs;#ifndef QT_NO_TABBAR    if (opts & QMainWindow::AllowTabbedDocks        || opts & QMainWindow::VerticalTabs)        tabMode = QDockAreaLayoutInfo::AllowTabs;    if (opts & QMainWindow::ForceTabbedDocks)        tabMode = QDockAreaLayoutInfo::ForceTabs;    if (tabMode == QDockAreaLayoutInfo::ForceTabs)        nestingEnabled = false;#endif    for (int i = 0; i < QInternal::DockCount; ++i) {        const QDockAreaLayoutInfo &info = docks[i];        if (!info.isEmpty() && info.rect.contains(pos)) {            QList<int> result                = docks[i].gapIndex(pos, nestingEnabled, tabMode);            if (!result.isEmpty())                result.prepend(i);            return result;        }    }    for (int i = 0; i < QInternal::DockCount; ++i) {        const QDockAreaLayoutInfo &info = docks[i];        if (info.isEmpty()) {            QRect r;            switch (i) {                case QInternal::LeftDock:                    r = QRect(rect.left(), rect.top(), EmptyDropAreaSize, rect.height());                    break;                case QInternal::RightDock:                    r = QRect(rect.right() - EmptyDropAreaSize, rect.top(),                                EmptyDropAreaSize, rect.height());                    break;                case QInternal::TopDock:                    r = QRect(rect.left(), rect.top(), rect.width(), EmptyDropAreaSize);                    break;                case QInternal::BottomDock:                    r = QRect(rect.left(), rect.bottom() - EmptyDropAreaSize,                                rect.width(), EmptyDropAreaSize);                    break;            }            if (r.contains(pos))                return QList<int>() << i << 0;        }    }    return QList<int>();}QList<int> QDockAreaLayout::findSeparator(const QPoint &pos) const{    QList<int> result;    for (int i = 0; i < QInternal::DockCount; ++i) {        const QDockAreaLayoutInfo &info = docks[i];        if (info.isEmpty())            continue;        if (separatorRect(i).contains(pos)) {            result << i;            break;        } else if (info.rect.contains(pos)) {            result = docks[i].findSeparator(pos);            if (!result.isEmpty()) {                result.prepend(i);                break;            }        }    }    return result;}QDockAreaLayoutInfo *QDockAreaLayout::info(QWidget *widget){    for (int i = 0; i < QInternal::DockCount; ++i) {        if (QDockAreaLayoutInfo *result = docks[i].info(widget))            return result;    }    return 0;}QDockAreaLayoutInfo *QDockAreaLayout::info(QList<int> path){    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    if (path.isEmpty())        return &docks[index];    return docks[index].info(path);}const QDockAreaLayoutInfo *QDockAreaLayout::info(QList<int> path) const{    return const_cast<QDockAreaLayout*>(this)->info(path);}QDockAreaLayoutItem &QDockAreaLayout::item(QList<int> path){    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    return docks[index].item(path);}QRect QDockAreaLayout::itemRect(QList<int> path) const{    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    return docks[index].itemRect(path);}QRect QDockAreaLayout::separatorRect(int index) const{    if (docks[index].isEmpty())        return QRect();    QRect r = docks[index].rect;    switch (index) {        case QInternal::LeftDock:            return QRect(r.right() + 1, r.top(), sep, r.height());        case QInternal::RightDock:            return QRect(r.left() - sep, r.top(), sep, r.height());        case QInternal::TopDock:            return QRect(r.left(), r.bottom() + 1, r.width(), sep);        case QInternal::BottomDock:            return QRect(r.left(), r.top() - sep, r.width(), sep);        default:            break;    }    return QRect();}QRect QDockAreaLayout::separatorRect(QList<int> path) const{    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    if (path.isEmpty())        return separatorRect(index);    else        return docks[index].separatorRect(path);}bool QDockAreaLayout::insertGap(QList<int> path, QLayoutItem *dockWidgetItem){    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    return docks[index].insertGap(path, dockWidgetItem);}QLayoutItem *QDockAreaLayout::plug(QList<int> path){    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    return docks[index].plug(path);}QLayoutItem *QDockAreaLayout::unplug(QList<int> path){    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    return docks[index].unplug(path);}void QDockAreaLayout::remove(QList<int> path){    Q_ASSERT(!path.isEmpty());    int index = path.takeFirst();    Q_ASSERT(index >= 0 && index < QInternal::DockCount);    docks[index].remove(path);}static inline int qMin(int i1, int i2, int i3) { return qMin(i1, qMin(i2, i3)); }static inline int qMax(int i1, int i2, int i3) { return qMax(i1, qMax(i2, i3)); }void QDockAreaLayout::getGrid(QVector<QLayoutStruct> *_ver_struct_list,                                QVector<QLayoutStruct> *_hor_struct_list){    QSize center_hint(0, 0);    QSize center_min(0, 0);    bool have_central = centralWidgetItem != 0 && !centralWidgetItem->isEmpty();    if (have_central) {        center_hint = centralWidgetRect.size();        if (!center_hint.isValid())            center_hint = centralWidgetItem->sizeHint();        center_min = centralWidgetItem->minimumSize();    }    QRect center_rect = rect;    if (!docks[QInternal:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -