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

📄 qmainwindowlayout.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#endif //QT_NO_DOCKWIDGET    return QRect();}QLayoutItem *QMainWindowLayoutState::plug(QList<int> path){    int i = path.takeFirst();#ifndef QT_NO_TOOLBAR    if (i == 0)        return toolBarAreaLayout.plug(path);#endif#ifndef QT_NO_DOCKWIDGET    if (i == 1)        return dockAreaLayout.plug(path);#endif //QT_NO_DOCKWIDGET    return 0;}QLayoutItem *QMainWindowLayoutState::unplug(QList<int> path){    int i = path.takeFirst();#ifndef QT_NO_TOOLBAR    if (i == 0)        return toolBarAreaLayout.unplug(path);#endif#ifndef QT_NO_DOCKWIDGET    if (i == 1)        return dockAreaLayout.unplug(path);#endif //QT_NO_DOCKWIDGET    return 0;}void QMainWindowLayoutState::saveState(QDataStream &stream) const{#ifndef QT_NO_DOCKWIDGET    dockAreaLayout.saveState(stream);#endif#ifndef QT_NO_TOOLBAR    toolBarAreaLayout.saveState(stream);#endif}template <typename T>static QList<T> findChildren(const QObject *o){    const QObjectList &list = o->children();    QList<T> result;    for (int i=0; i < list.size(); ++i) {        if (T t = qobject_cast<T>(list[i])) {            result.append(t);        }    }    return result;}bool QMainWindowLayoutState::restoreState(QDataStream &stream,                                        const QMainWindowLayoutState &oldState){    while (!stream.atEnd()) {        uchar marker;        stream >> marker;        switch(marker)        {#ifndef QT_NO_TOOLBAR            case QToolBarAreaLayout::ToolBarStateMarker:            case QToolBarAreaLayout::ToolBarStateMarkerEx:                {                    QList<QToolBar *> toolBars = ::findChildren<QToolBar*>(mainWindow);                    if (!toolBarAreaLayout.restoreState(stream, toolBars, marker))                        return false;                    for (int i = 0; i < toolBars.size(); ++i) {                        QToolBar *w = toolBars.at(i);                        QList<int> path = toolBarAreaLayout.indexOf(w);                        if (path.isEmpty()) {                            QList<int> oldPath = oldState.toolBarAreaLayout.indexOf(w);                            if (oldPath.isEmpty()) {                                continue;                            }                            toolBarAreaLayout.docks[oldPath.at(0)].insertToolBar(0, w);                        }                    }                }                break;#endif // QT_NO_TOOLBAR#ifndef QT_NO_DOCKWIDGET            case QDockAreaLayout::DockWidgetStateMarker:                {                    QList<QDockWidget *> dockWidgets = ::findChildren<QDockWidget*>(mainWindow);                    if (!dockAreaLayout.restoreState(stream, dockWidgets))                        return false;                    for (int i = 0; i < dockWidgets.size(); ++i) {                        QDockWidget *w = dockWidgets.at(i);                        QList<int> path = dockAreaLayout.indexOf(w);                        if (path.isEmpty()) {                            QList<int> oldPath = oldState.dockAreaLayout.indexOf(w);                            if (oldPath.isEmpty()) {                                continue;                            }                            QDockAreaLayoutInfo *info = dockAreaLayout.info(oldPath);                            if (info == 0) {                                continue;                            }                            info->item_list.append(QDockAreaLayoutItem(new QDockWidgetItem(w)));                        }                    }                }                break;#endif            default:                return false;        }// switch    } //while    return true;}/******************************************************************************** QMainWindowLayoutState - toolbars*/#ifndef QT_NO_TOOLBARstatic inline void validateToolBarArea(Qt::ToolBarArea &area){    switch (area) {    case Qt::LeftToolBarArea:    case Qt::RightToolBarArea:    case Qt::TopToolBarArea:    case Qt::BottomToolBarArea:        break;    default:        area = Qt::TopToolBarArea;    }}static QInternal::DockPosition toDockPos(Qt::ToolBarArea area){    switch (area) {        case Qt::LeftToolBarArea: return QInternal::LeftDock;        case Qt::RightToolBarArea: return QInternal::RightDock;        case Qt::TopToolBarArea: return QInternal::TopDock;        case Qt::BottomToolBarArea: return QInternal::BottomDock;        default:            break;    }    return QInternal::DockCount;}static Qt::ToolBarArea toToolBarArea(QInternal::DockPosition pos){    switch (pos) {        case QInternal::LeftDock:   return Qt::LeftToolBarArea;        case QInternal::RightDock:  return Qt::RightToolBarArea;        case QInternal::TopDock:    return Qt::TopToolBarArea;        case QInternal::BottomDock: return Qt::BottomToolBarArea;        default: break;    }    return Qt::NoToolBarArea;}static inline Qt::ToolBarArea toToolBarArea(int pos){    return toToolBarArea(static_cast<QInternal::DockPosition>(pos));}void QMainWindowLayout::addToolBarBreak(Qt::ToolBarArea area){    validateToolBarArea(area);    layoutState.toolBarAreaLayout.addToolBarBreak(toDockPos(area));    invalidate();}void QMainWindowLayout::insertToolBarBreak(QToolBar *before){    layoutState.toolBarAreaLayout.insertToolBarBreak(before);    invalidate();}void QMainWindowLayout::removeToolBarBreak(QToolBar *before){    layoutState.toolBarAreaLayout.removeToolBarBreak(before);    invalidate();}#ifdef Q_WS_MACvoid QMainWindowLayout::updateHIToolBarStatus(){#ifndef kWindowUnifiedTitleAndToolbarAttribute#define kWindowUnifiedTitleAndToolbarAttribute (1 << 7)#endif    bool useHIToolbar = layoutState.mainWindow->unifiedTitleAndToolBarOnMac();    if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_4) {        if (useHIToolbar) {            ChangeWindowAttributes(qt_mac_window_for(layoutState.mainWindow),                                   kWindowUnifiedTitleAndToolbarAttribute, 0);        } else {            ChangeWindowAttributes(qt_mac_window_for(layoutState.mainWindow),                                   0, kWindowUnifiedTitleAndToolbarAttribute);        }    }    layoutState.mainWindow->setUpdatesEnabled(false);  // reduces a little bit of flicker, not all though    if (!useHIToolbar) {        ShowHideWindowToolbar(qt_mac_window_for(parentWidget()), false, false);        // Move everything out of the HIToolbar into the main toolbar.        while (!qtoolbarsInHIToolbarList.isEmpty()) {            // Should shrink the list by one every time.            layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, qtoolbarsInHIToolbarList.first());        }        SetWindowToolbar(qt_mac_window_for(parentWidget()), 0);    } else {        QList<QToolBar *> toolbars = layoutState.mainWindow->findChildren<QToolBar *>();        for (int i = 0; i < toolbars.size(); ++i) {            QToolBar *toolbar = toolbars.at(i);            if (toolBarArea(toolbar) == Qt::TopToolBarArea) {                removeWidget(toolbar);  // Do this here, because we are in an in-between state.                layoutState.mainWindow->addToolBar(Qt::TopToolBarArea, toolbar);            }        }    }    layoutState.mainWindow->setUpdatesEnabled(true);}static const int kEventParamQToolBar = 'QTBR';static const int kEventParamQMainWindowLayout = 'QMWL';#define kQToolBarHIToolbarItemClassID CFSTR("com.trolltech.qt.qmainwindow.qtoolbarInHIToolbar")const EventTypeSpec qtoolbarEvents[] ={    { kEventClassHIObject, kEventHIObjectConstruct },    { kEventClassHIObject, kEventHIObjectDestruct },    { kEventClassHIObject, kEventHIObjectInitialize },    { kEventClassToolbarItem, kEventToolbarItemCreateCustomView }};struct QToolBarInHIToolbarInfo{    QToolBarInHIToolbarInfo(HIToolbarItemRef item)        : toolbarItem(item), mainWindowLayout(0)    {}    HIToolbarItemRef toolbarItem;    QMainWindowLayout *mainWindowLayout;};OSStatus QMainWindowLayout::qtoolbarInHIToolbarHandler(EventHandlerCallRef inCallRef,                                                       EventRef event, void *data){    OSStatus result = eventNotHandledErr;    QToolBarInHIToolbarInfo *object = static_cast<QToolBarInHIToolbarInfo *>(data);    switch (GetEventClass(event)) {        case kEventClassHIObject:            switch (GetEventKind(event)) {                case kEventHIObjectConstruct:                    {                        HIObjectRef toolbarItem;                        GetEventParameter(event, kEventParamHIObjectInstance, typeHIObjectRef,                                          0, sizeof( HIObjectRef ), 0, &toolbarItem);                        QToolBarInHIToolbarInfo *item = new QToolBarInHIToolbarInfo(toolbarItem);                        SetEventParameter(event, kEventParamHIObjectInstance, typeVoidPtr,                                          sizeof(void *), &item);                        result = noErr;                    }                    break;                case kEventHIObjectInitialize:                    result = CallNextEventHandler(inCallRef, event);                    if (result == noErr) {                        QToolBar *toolbar = 0;                        QMainWindowLayout *layout = 0;                        GetEventParameter(event, kEventParamQToolBar, typeVoidPtr,                                          0, sizeof(void *), 0, &toolbar);                        GetEventParameter(event, kEventParamQMainWindowLayout, typeVoidPtr,                                          0, sizeof(void *), 0, &layout);                        object->mainWindowLayout = layout;                        object->mainWindowLayout->hitoolbarHash.insert(object->toolbarItem, toolbar);                        HIToolbarItemChangeAttributes(object->toolbarItem,                                                      kHIToolbarItemLabelDisabled, 0);                    }                    break;                case kEventHIObjectDestruct:                    delete object;                    result = noErr;                    break;            }            break;        case kEventClassToolbarItem:            switch (GetEventKind(event))            {                case kEventToolbarItemCreateCustomView:                    {                        QToolBar *toolbar                                = object->mainWindowLayout->hitoolbarHash.value(object->toolbarItem);                        if (toolbar) {                            HIViewRef hiview = HIViewRef(toolbar->winId());                            SetEventParameter(event, kEventParamControlRef, typeControlRef,                                              sizeof(HIViewRef), &hiview);                            result = noErr;                        }                    }                    break;            }            break;    }    return result;}void QMainWindowLayout::qtMacHIToolbarRegisterQToolBarInHIToolborItemClass(){    static bool registered = false;    if (!registered) {        HIObjectRegisterSubclass( kQToolBarHIToolbarItemClassID,                kHIToolbarItemClassID, 0, QMainWindowLayout::qtoolbarInHIToolbarHandler,                GetEventTypeCount(qtoolbarEvents), qtoolbarEvents, 0, 0 );        registered = true;    }}static void GetToolbarAllowedItems(CFMutableArrayRef array){    CFArrayAppendValue(array, CFSTR("com.trolltech.qt.hitoolbar-qtoolbar"));}HIToolbarItemRef QMainWindowLayout::createQToolBarInHIToolbarItem(QToolBar *toolbar,                                                                  QMainWindowLayout *layout){    QMainWindowLayout::qtMacHIToolbarRegisterQToolBarInHIToolborItemClass();    EventRef event;    HIToolbarItemRef result = 0;    CFStringRef identifier = CFSTR("com.trolltech.qt.hitoolbar-qtoolbar");    UInt32 options = kHIToolbarItemAllowDuplicates;    CreateEvent(0, kEventClassHIObject, kEventHIObjectInitialize,                GetCurrentEventTime(), 0, &event);    SetEventParameter(event, kEventParamToolbarItemIdentifier, typeCFStringRef,                      sizeof(CFStringRef), &identifier);    SetEventParameter(event, kEventParamAttributes, typeUInt32, sizeof(UInt32), &options);    SetEventParameter(event, kEventParamQToolBar, typeVoidPtr, sizeof(void *), &toolbar);    SetEventParameter(event, kEventParamQMainWindowLayout, typeVoidPtr, sizeof(void *), &layout);    HIObjectCreate(kQToolBarHIToolbarItemClassID, event,                                  static_cast<HIObjectRef *>(&result));    ReleaseEvent(event);    return result;}HIToolbarItemRef QMainWindowLayout::CreateToolbarItemForIdentifier(CFStringRef identifier,                                                                   CFTypeRef data){    HIToolbarItemRef item = 0;    if (CFStringCompare(CFSTR("com.trolltech.qt.hitoolbar-qtoolbar"), identifier,                              kCFCompareBackwards) == kCFCompareEqualTo) {        if (data && CFGetTypeID(data) == CFArrayGetTypeID()) {            CFArrayRef array = static_cast<CFArrayRef>(data);            QToolBar *toolbar = static_cast<QToolBar *>(const_cast<void *>(CFArrayGetValueAtIndex(array, 0)));            QMainWindowLayout *layout = static_cast<QMainWindowLayout *>(const_cast<void *>(CFArrayGetValueAtIndex(array, 1)));            item = createQToolBarInHIToolbarItem(toolbar, layout);        }    }    return item;}static const EventTypeSpec kToolbarEvents[] = {    { kEventClassToolbar, kEventToolbarGetDefaultIdentifiers },    { kEventClassToolbar, kEventToolbarGetAllowedIdentifiers },    { kEventClassToolbar, kEventToolbarCreateItemWithIdentifier },    { kEventClassToolbar, kEventToolbarItemAdded },    { kEventClassToolbar, kEventToolbarItemRemoved }};OSStatus QMainWindowLayout::qtmacToolbarDelegate(EventHandlerCallRef, EventRef event, void *data){    QMainWindowLayout *mainWindowLayout = static_cast<QMainWindowLayout *>(data);    OSStatus            result = eventNotHandledErr;    CFMutableArrayRef   array;    CFStringRef         identifier;    switch (GetEventKind(event)) {    case kEventToolbarGetDefaultIdentifiers:    case kEventToolbarGetAllowedIdentifiers:        GetEventParameter(event, kEventParamMutableArray, typeCFMutableArrayRef, 0,                          sizeof(CFMutableArrayRef), 0, &array);        GetToolbarAllowedItems(array);        result = noErr;        break;    case kEventToolbarCreateItemWithIdentifier: {        HIToolbarItemRef item;        CFTypeRef data = 0;        OSStatus err = GetEventParameter(event, kEventParamToolbarItemIdentifier, typeCFStringRef,                          0, sizeof(CFStringRef), 0, &identifier);        err = GetEventParameter(event, kEventParamToolbarItemConfigData, typeCFTypeRef,                          0, sizeof(CFTypeRef), 0, &data);        item = CreateToolbarItemForIdentifier(identifier, data);        if (item) {            result = SetEventParameter(event, kEventParamToolbarItem, typeHIToolbarItemRef,                              sizeof(HIToolbarItemRef), &item );        }        break;    }    case kEventToolbarItemAdded: {        // Double check that our "view" of the toolbar is similar.        HIToolbarItemRef item;        CFIndex index;        if (GetEventParameter(event, kEventParamToolbarItem, typeHIToolbarItemRef,                              0, sizeof(HIToolbarItemRef), 0, &item) == noErr            && GetEventParameter(event, kEventParamIndex, typeCFIndex, 0,                                 sizeof(CFIndex), 0, &index) == noErr) {            CFRetain(item); // We will watch this until it's removed from the list (or bust).            mainWindowLayout->toolbarItemsCopy.insert(index, item);            QToolBar *toolbar = mainWindowLayout->hitoolbarHash.value(item);            if (toolbar) {                int toolbarIndex = mainWindowLayout->qtoolbarsInHIToolbarList.indexOf(toolbar);                if (index != toolbarIndex) {                    // Dang, we must be out of sync, rebuild it from the "toolbarItemsCopy"                    mainWindowLayout->qtoolbarsInHIToolbarList.clear();                    for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) {                        // This will either append the correct toolbar or an                        // null toolbar. This is fine because this list                        // is really only kept to make sure that things are but in the right order.                        mainWindowLayout->qtoolbarsInHIToolbarList.append(                                mainWindowLayout->hitoolbarHash.value(mainWindowLayout->                                                                        toolbarItemsCopy.at(i)));                    }                }            }        }        break;    }    case kEventToolbarItemRemoved: {        HIToolbarItemRef item;        if (GetEventParameter(event, kEventParamToolbarItem, typeHIToolbarItemRef,                              0, sizeof(HIToolbarItemRef), 0, &item) == noErr) {            mainWindowLayout->hitoolbarHash.remove(item);            for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) {                if (mainWindowLayout->toolbarItemsCopy.at(i) == item) {                    // I know about it, so release it.                    mainWindowLayout->toolbarItemsCopy.removeAt(i);                    mainWindowLayout->qtoolbarsInHIToolbarList.removeAt(i);                    CFRelease(item);                    break;                }            }        }        break;    }    }    return result;}void QMainWindowLayout::insertIntoMacHIToolbar(QToolBar *before, QToolBar *toolbar){    if (toolbar == 0)        return;    toolbarSaveState.insert(toolbar, ToolBarSaveState(toolbar->isMovable(),                                                      toolbar->maximumSize()));    toolbar->setMovable(false);    toolbar->setMaximumSize(toolbar->sizeHint());    static_cast<QToolBarLayout *>(toolbar->layout())->setUsePopupMenu(true);    layoutState.mainWindow->createWinId();    HIToolbarRef macToolbar;    WindowRef window = qt_mac_window_for(layoutState.mainWindow);    if ((GetWindowToolbar(window, &macToolbar) == noErr) && !macToolbar) {        HIToolbarCreate(CFSTR("com.trolltech.qt.qmainwindow.hitoolbar"),                        kHIToolbarItemAllowDuplicates, &macToolbar);        InstallEventHandler(HIObjectGetEventTarget(static_cast<HIToolbarRef>(macToolbar)),                            QMainWindowLayout::qtmacToolbarDelegate, GetEventTypeCount(kToolbarEvents),                            kToolbarEvents, this, 0);        HIToolbarSetDisplaySize(macToolbar, kHIToolbarDisplaySizeNormal);        HIToolbarSetDisplayMode(macToolbar, kHIToolbarDisplayModeIconOnly);

⌨️ 快捷键说明

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