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

📄 qdockarealayout.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    QWidgetAnimator *widgetAnimator = mainWindowLayout()->widgetAnimator;#ifndef QT_NO_TABBAR    if (tabbed) {        QRect tab_rect;        QSize tbh = tabBarSizeHint();        if (tabBarVisible) {            switch (tabBarShape) {                case QTabBar::RoundedNorth:                    tab_rect = QRect(rect.left(), rect.top(), rect.width(), tbh.height());                    break;                case QTabBar::RoundedSouth:                    tab_rect = QRect(rect.left(), rect.bottom() - tbh.height() + 1,                                        rect.width(), tbh.height());                    break;                case QTabBar::RoundedEast:                    tab_rect = QRect(rect.right() - tbh.width() + 1, rect.top(),                                        tbh.width(), rect.height());                    break;                case QTabBar::RoundedWest:                    tab_rect = QRect(rect.left(), rect.top(),                                        tbh.width(), rect.height());                    break;                default:                    break;            }        }        widgetAnimator->animate(tabBar, tab_rect, animate);    }#endif // QT_NO_TABBAR    for (int i = 0; i < item_list.size(); ++i) {        QDockAreaLayoutItem &item = item_list[i];        if (item.gap)            continue;        if (item.subinfo != 0) {            item.subinfo->apply(animate);            continue;        }        if (item.skip())            continue;        Q_ASSERT(item.widgetItem);        QRect r = itemRect(i);        QWidget *w = item.widgetItem->widget();        QRect geo = w->geometry();        widgetAnimator->animate(w, r, animate);        if (!w->isHidden()) {            QDockWidget *dw = qobject_cast<QDockWidget*>(w);            if (!r.isValid() && geo.right() >= 0 && geo.bottom() >= 0) {                dw->lower();                emit dw->visibilityChanged(false);            } else if (r.isValid()                        && (geo.right() < 0 || geo.bottom() < 0)) {                emit dw->visibilityChanged(true);            }        }    }}static void paintSep(QPainter *p, QWidget *w, const QRect &r, Qt::Orientation o, bool mouse_over){    QStyleOption opt(0);    opt.state = QStyle::State_None;    if (w->isEnabled())        opt.state |= QStyle::State_Enabled;    if (o != Qt::Horizontal)        opt.state |= QStyle::State_Horizontal;    if (mouse_over)        opt.state |= QStyle::State_MouseOver;    opt.rect = r;    opt.palette = w->palette();    w->style()->drawPrimitive(QStyle::PE_IndicatorDockWidgetResizeHandle, &opt, p, w);}QRegion QDockAreaLayoutInfo::separatorRegion() const{    QRegion result;    if (isEmpty())        return result;#ifndef QT_NO_TABBAR    if (tabbed)        return result;#endif    for (int i = 0; i < item_list.count(); ++i) {        const QDockAreaLayoutItem &item = item_list.at(i);        if (item.skip())            continue;        int next = this->next(i);        if (item.subinfo)            result |= item.subinfo->separatorRegion();        if (next == -1)            break;        result |= separatorRect(i);    }    return result;}void QDockAreaLayoutInfo::paintSeparators(QPainter *p, QWidget *widget,                                                    const QRegion &clip,                                                    const QPoint &mouse) const{    if (isEmpty())        return;#ifndef QT_NO_TABBAR    if (tabbed)        return;#endif    for (int i = 0; i < item_list.count(); ++i) {        const QDockAreaLayoutItem &item = item_list.at(i);        if (item.skip())            continue;        int next = this->next(i);        if (item.gap || next != -1 && item_list.at(next).gap)            continue;        if (item.subinfo) {            if (clip.contains(item.subinfo->rect))                item.subinfo->paintSeparators(p, widget, clip, mouse);        }        if (next == -1)            break;        QRect r = separatorRect(i);        if (clip.contains(r))            paintSep(p, widget, r, o, r.contains(mouse));    }}int QDockAreaLayoutInfo::next(int index) const{    for (int i = index + 1; i < item_list.size(); ++i) {        if (!item_list.at(i).skip())            return i;    }    return -1;}int QDockAreaLayoutInfo::prev(int index) const{    for (int i = index - 1; i >= 0; --i) {        if (!item_list.at(i).skip())            return i;    }    return -1;}void QDockAreaLayoutInfo::tab(int index, QLayoutItem *dockWidgetItem){#ifdef QT_NO_TABBAR    Q_UNUSED(index);    Q_UNUSED(dockWidgetItem);#else    if (tabbed) {        item_list.append(QDockAreaLayoutItem(dockWidgetItem));        updateTabBar();        setCurrentTab(dockWidgetItem->widget());    } else {        QDockAreaLayoutInfo *new_info            = new QDockAreaLayoutInfo(sep, dockPos, o, tabBarShape, mainWindow);        item_list[index].subinfo = new_info;        new_info->item_list.append(item_list.at(index).widgetItem);        item_list[index].widgetItem = 0;        new_info->item_list.append(dockWidgetItem);        new_info->tabbed = true;        new_info->updateTabBar();        new_info->setCurrentTab(dockWidgetItem->widget());    }#endif // QT_NO_TABBAR}void QDockAreaLayoutInfo::split(int index, Qt::Orientation orientation,                                       QLayoutItem *dockWidgetItem){    if (orientation == o) {        item_list.insert(index + 1, QDockAreaLayoutItem(dockWidgetItem));    } else {#ifdef QT_NO_TABBAR        const int tabBarShape = 0;#endif        QDockAreaLayoutInfo *new_info            = new QDockAreaLayoutInfo(sep, dockPos, orientation, tabBarShape, mainWindow);        item_list[index].subinfo = new_info;        new_info->item_list.append(item_list.at(index).widgetItem);        item_list[index].widgetItem = 0;        new_info->item_list.append(dockWidgetItem);    }}QDockAreaLayoutItem &QDockAreaLayoutInfo::item(QList<int> path){    Q_ASSERT(!path.isEmpty());    if (path.count() > 1) {        QDockAreaLayoutItem &item = item_list[path.takeFirst()];        Q_ASSERT(item.subinfo != 0);        return item.subinfo->item(path);    }    return item_list[path.first()];}QLayoutItem *QDockAreaLayoutInfo::itemAt(int *x, int index) const{    for (int i = 0; i < item_list.count(); ++i) {        const QDockAreaLayoutItem &item = item_list.at(i);        if (item.subinfo) {            if (QLayoutItem *ret = item.subinfo->itemAt(x, index))                return ret;        } else if (item.widgetItem) {            if ((*x)++ == index)                return item.widgetItem;        }    }    return 0;}QLayoutItem *QDockAreaLayoutInfo::takeAt(int *x, int index){    for (int i = 0; i < item_list.count(); ++i) {        const QDockAreaLayoutItem &item = item_list.at(i);        if (item.subinfo) {            if (QLayoutItem *ret = item.subinfo->takeAt(x, index)) {                unnest(i);                return ret;            }        } else if (item.widgetItem) {            if ((*x)++ == index) {                QLayoutItem *ret = item.widgetItem;                item_list.removeAt(i);                return ret;            }        }    }    return 0;}void QDockAreaLayoutInfo::deleteAllLayoutItems(){    for (int i = 0; i < item_list.count(); ++i) {        QDockAreaLayoutItem &item= item_list[i];        if (item.subinfo) {            item.subinfo->deleteAllLayoutItems();        } else {            delete item.widgetItem;            item.widgetItem = 0;        }    }}void QDockAreaLayoutInfo::saveState(QDataStream &stream) const{#ifndef QT_NO_TABBAR    if (tabbed) {        stream << (uchar) TabMarker;        // write the index in item_list of the widget that's currently on top.        quintptr id = currentTabId();        int index = -1;        for (int i = 0; i < item_list.count(); ++i) {            if (tabId(item_list.at(i)) == id) {                index = i;                break;            }        }        stream << index;    } else#endif // QT_NO_TABBAR    {        stream << (uchar) SequenceMarker;    }    stream << (uchar) o << item_list.count();    for (int i = 0; i < item_list.count(); ++i) {        const QDockAreaLayoutItem &item = item_list.at(i);        if (item.widgetItem != 0) {            stream << (uchar) WidgetMarker;            QWidget *w = item.widgetItem->widget();            QString name = w->objectName();            if (name.isEmpty()) {                qWarning("QMainWindow::saveState(): 'objectName' not set for QDockWidget %p '%s;",                         w, qPrintable(w->windowTitle()));            }            stream << name;            uchar flags = 0;            if (!w->isHidden())                flags |= StateFlagVisible;            if (w->isWindow())                flags |= StateFlagFloating;            stream << flags;            if (w->isWindow()) {                stream << w->x() << w->y() << w->width() << w->height();            } else {                stream << item.pos << item.size << pick(o, item.minimumSize())                        << pick(o, item.maximumSize());            }        } else if (item.subinfo != 0) {            stream << (uchar) SequenceMarker << item.pos << item.size << pick(o, item.minimumSize()) << pick(o, item.maximumSize());            item.subinfo->saveState(stream);        }    }}#ifdef Q_WS_MACstatic Qt::DockWidgetArea toDockWidgetArea(QInternal::DockPosition pos){    switch (pos) {        case QInternal::LeftDock:   return Qt::LeftDockWidgetArea;        case QInternal::RightDock:  return Qt::RightDockWidgetArea;        case QInternal::TopDock:    return Qt::TopDockWidgetArea;        case QInternal::BottomDock: return Qt::BottomDockWidgetArea;        default: break;    }    return Qt::NoDockWidgetArea;}#endifbool QDockAreaLayoutInfo::restoreState(QDataStream &stream, QList<QDockWidget*> &widgets){    uchar marker;    stream >> marker;    if (marker != TabMarker && marker != SequenceMarker)        return false;#ifndef QT_NO_TABBAR    tabbed = marker == TabMarker;    int index = -1;    if (tabbed)        stream >> index;#endif    uchar orientation;    stream >> orientation;    o = static_cast<Qt::Orientation>(orientation);    int cnt;    stream >> cnt;    for (int i = 0; i < cnt; ++i) {        uchar nextMarker;        stream >> nextMarker;        if (nextMarker == WidgetMarker) {            QString name;            uchar flags;            stream >> name >> flags;            if (name.isEmpty()) {                int dummy;                stream >> dummy >> dummy >> dummy >> dummy;                continue;            }            QDockWidget *widget = 0;            for (int j = 0; j < widgets.count(); ++j) {                if (widgets.at(j)->objectName() == name) {                    widget = widgets.takeAt(j);                    break;                }            }            if (widget == 0) {                int dummy;                stream >> dummy >> dummy >> dummy >> dummy;                continue;            }            QDockAreaLayoutItem item(new QDockWidgetItem(widget));            if (flags & StateFlagFloating) {                bool drawer = false;#ifdef Q_WS_MAC // drawer support                extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp                extern bool qt_mac_set_drawer_preferred_edge(QWidget *, Qt::DockWidgetArea); //qwidget_mac.cpp                drawer = qt_mac_is_macdrawer(widget);#endif                widget->hide();                if (!drawer)                    widget->setFloating(true);                int x, y, w, h;                stream >> x >> y >> w >> h;#ifdef Q_WS_MAC // drawer support                if (drawer) {                    mainWindow->window()->createWinId();                    widget->window()->createWinId();                    qt_mac_set_drawer_preferred_edge(widget, toDockWidgetArea(dockPos));                } else#endif                {                    widget->move(x, y);                    widget->resize(w, h);                }                widget->setVisible(flags & StateFlagVisible);            } else {                int dummy;                stream >> item.pos >> item.size >> dummy >> dummy;//                qDebug() << widget << item.pos << item.size;                widget->setFloating(false);                widget->setVisible(flags & StateFlagVisible);            }            item_list.append(item);        } else if (nextMarker == SequenceMarker) {            int dummy;#ifdef QT_NO_TABBAR            const int tabBarShape = 0;#endif            QDockAreaLayoutInfo *info = new QDockAreaLayoutInfo(sep, dockPos, o,                                                                tabBarShape, mainWindow);            QDockAreaLayoutItem item(info);            stream >> item.pos >> item.size >> dummy >> dummy;            if (!info->restoreState(stream, widgets))                return false;            item_list.append(item);        } else {            return false;        }    }#ifndef QT_NO_TABBAR    if (tabbed && index >= 0 && index < item_list.count()) {        updateTabBar();        setCurrentTabId(tabId(item_list.at(index)));    }#endif    return true;}#ifndef QT_NO_TABBARvoid QDockAreaLayoutInfo::updateTabBar() const{    if (!tabbed)        return;    QDockAreaLayoutInfo *that = const_cast<QDockAreaLayoutInfo*>(this);    if (tabBar == 0) {        that->tabBar = mainWindowLayout()->getTabBar();        that->tabBar->setShape(static_cast<QTabBar::Shape>(tabBarShape));        that->tabBar->setDrawBase(true);    }    bool blocked = tabBar->blockSignals(true);    bool gap = false;

⌨️ 快捷键说明

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