📄 qmainwindowlayout.cpp
字号:
#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 + -