📄 qmainwindowlayout.cpp
字号:
SetWindowToolbar(window, macToolbar); if (layoutState.mainWindow->isVisible()) ShowHideWindowToolbar(window, true, false); CFRelease(macToolbar); } int beforeIndex = qtoolbarsInHIToolbarList.indexOf(before); if (beforeIndex == -1) beforeIndex = qtoolbarsInHIToolbarList.size(); int toolbarIndex = qtoolbarsInHIToolbarList.indexOf(toolbar); if (toolbarIndex != -1) { qtoolbarsInHIToolbarList.removeAt(toolbarIndex); HIToolbarRemoveItemAtIndex(macToolbar, toolbarIndex); } // Make the toolbar a child of the mainwindow to avoid creating a window. toolbar->setParent(layoutState.mainWindow); toolbar->createWinId(); // Now create the HIViewRef. qtoolbarsInHIToolbarList.insert(beforeIndex, toolbar); QCFType<HIToolbarItemRef> outItem; const QObject *stupidArray[] = { toolbar, this }; QCFType<CFArrayRef> array = CFArrayCreate(0, reinterpret_cast<const void **>(&stupidArray), 2, 0); HIToolbarCreateItemWithIdentifier(macToolbar, CFSTR("com.trolltech.qt.hitoolbar-qtoolbar"), array, &outItem); HIToolbarInsertItemAtIndex(macToolbar, outItem, beforeIndex);}#endif // Q_WS_MAC/* Removes the toolbar from the mainwindow so that it can be added again. Does not explicitly hide the toolbar. */void QMainWindowLayout::removeToolBar(QToolBar *toolbar){ if (toolbar) { QObject::disconnect(parentWidget(), SIGNAL(iconSizeChanged(QSize)), toolbar, SLOT(_q_updateIconSize(QSize))); QObject::disconnect(parentWidget(), SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle)), toolbar, SLOT(_q_updateToolButtonStyle(Qt::ToolButtonStyle)));#ifdef Q_WS_MAC if (usesHIToolBar(toolbar)) { QHash<HIToolbarItemRef, QToolBar *>::iterator it = hitoolbarHash.begin(); while (it != hitoolbarHash.end()) { if (it.value() == toolbar) { // Rescue our HIView and set it on the mainWindow again. bool saveVisible = toolbar->isVisible(); toolbar->setParent(0); toolbar->setParent(parentWidget()); toolbar->setVisible(saveVisible); ToolBarSaveState saveState = toolbarSaveState.value(toolbar); static_cast<QToolBarLayout *>(toolbar->layout())->setUsePopupMenu(false); toolbar->setMovable(saveState.movable); toolbar->setMaximumSize(saveState.maximumSize); toolbarSaveState.remove(toolbar); HIToolbarItemRef item = it.key(); HIToolbarRemoveItemAtIndex(HIToolbarItemGetToolbar(item), toolbarItemsCopy.indexOf(item)); break; } ++it; } } else#endif // Q_WS_MAC { removeWidget(toolbar); } }}/*! Adds \a toolbar to \a area, continuing the current line.*/void QMainWindowLayout::addToolBar(Qt::ToolBarArea area, QToolBar *toolbar, bool){ validateToolBarArea(area);#ifdef Q_WS_MAC if ((area == Qt::TopToolBarArea) && layoutState.mainWindow->unifiedTitleAndToolBarOnMac()) { insertIntoMacHIToolbar(0, toolbar); } else#endif { addChildWidget(toolbar); layoutState.toolBarAreaLayout.addToolBar(toDockPos(area), toolbar); invalidate(); }}/*! Adds \a toolbar before \a before*/void QMainWindowLayout::insertToolBar(QToolBar *before, QToolBar *toolbar){#ifdef Q_WS_MAC if (usesHIToolBar(before)) { insertIntoMacHIToolbar(before, toolbar); } else#endif // Q_WS_MAC { addChildWidget(toolbar); layoutState.toolBarAreaLayout.insertToolBar(before, toolbar); invalidate(); }}Qt::ToolBarArea QMainWindowLayout::toolBarArea(QToolBar *toolbar) const{ QInternal::DockPosition pos = layoutState.toolBarAreaLayout.findToolBar(toolbar); 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; }#ifdef Q_WS_MAC if (pos == QInternal::DockCount) { if (qtoolbarsInHIToolbarList.contains(toolbar)) return Qt::TopToolBarArea; }#endif return Qt::NoToolBarArea;}bool QMainWindowLayout::toolBarBreak(QToolBar *toolBar) const{ return layoutState.toolBarAreaLayout.toolBarBreak(toolBar);}void QMainWindowLayout::getStyleOptionInfo(QStyleOptionToolBar *option, QToolBar *toolBar) const{ option->toolBarArea = toolBarArea(toolBar); layoutState.toolBarAreaLayout.getStyleOptionInfo(option, toolBar);}void QMainWindowLayout::toggleToolBarsVisible(){ layoutState.toolBarAreaLayout.visible = !layoutState.toolBarAreaLayout.visible; QRect oldRect = parentWidget()->geometry(); QRect newRect = layoutState.toolBarAreaLayout.rectHint(oldRect); newRect.moveTopRight(oldRect.topRight());// widgetAnimator->animate(parentWidget(), r, true); parentWidget()->setGeometry(newRect);}#endif // QT_NO_TOOLBAR/******************************************************************************** QMainWindowLayoutState - dock areas*/#ifndef QT_NO_DOCKWIDGETstatic inline void validateDockWidgetArea(Qt::DockWidgetArea &area){ switch (area) { case Qt::LeftDockWidgetArea: case Qt::RightDockWidgetArea: case Qt::TopDockWidgetArea: case Qt::BottomDockWidgetArea: break; default: area = Qt::LeftDockWidgetArea; }}static QInternal::DockPosition toDockPos(Qt::DockWidgetArea area){ switch (area) { case Qt::LeftDockWidgetArea: return QInternal::LeftDock; case Qt::RightDockWidgetArea: return QInternal::RightDock; case Qt::TopDockWidgetArea: return QInternal::TopDock; case Qt::BottomDockWidgetArea: return QInternal::BottomDock; default: break; } return QInternal::DockCount;}static 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;}inline static Qt::DockWidgetArea toDockWidgetArea(int pos){ return toDockWidgetArea(static_cast<QInternal::DockPosition>(pos));}void QMainWindowLayout::setCorner(Qt::Corner corner, Qt::DockWidgetArea area){ if (layoutState.dockAreaLayout.corners[corner] == area) return; layoutState.dockAreaLayout.corners[corner] = area; invalidate();}Qt::DockWidgetArea QMainWindowLayout::corner(Qt::Corner corner) const{ return layoutState.dockAreaLayout.corners[corner];}void QMainWindowLayout::addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget, Qt::Orientation orientation){ addChildWidget(dockwidget); // If we are currently moving a separator, then we need to abort the move, since each // time we move the mouse layoutState is replaced by savedState modified by the move. if (!movingSeparator.isEmpty()) endSeparatorMove(movingSeparatorPos); layoutState.dockAreaLayout.addDockWidget(toDockPos(area), dockwidget, orientation); emit dockwidget->dockLocationChanged(area); invalidate();}void QMainWindowLayout::tabifyDockWidget(QDockWidget *first, QDockWidget *second){ addChildWidget(second); layoutState.dockAreaLayout.tabifyDockWidget(first, second); emit second->dockLocationChanged(dockWidgetArea(first)); invalidate();}void QMainWindowLayout::setVerticalTabsEnabled(bool enabled){#ifdef QT_NO_TABBAR Q_UNUSED(enabled);#else QDockAreaLayout &layout = layoutState.dockAreaLayout; const QTabBar::Shape verticalShapes[] = { QTabBar::RoundedWest, QTabBar::RoundedEast, QTabBar::RoundedNorth, QTabBar::RoundedSouth }; for (int i = 0; i < QInternal::DockCount; ++i) { layout.docks[i].setTabBarShape( enabled ? verticalShapes[i] : QTabBar::RoundedSouth ); }#endif // QT_NO_TABBAR}void QMainWindowLayout::splitDockWidget(QDockWidget *after, QDockWidget *dockwidget, Qt::Orientation orientation){ addChildWidget(dockwidget); layoutState.dockAreaLayout.splitDockWidget(after, dockwidget, orientation); emit dockwidget->dockLocationChanged(dockWidgetArea(after)); invalidate();}Qt::DockWidgetArea QMainWindowLayout::dockWidgetArea(QDockWidget *widget) const{ QList<int> pathToWidget = layoutState.dockAreaLayout.indexOf(widget); if (pathToWidget.isEmpty()) return Qt::NoDockWidgetArea; return toDockWidgetArea(pathToWidget.first());}void QMainWindowLayout::keepSize(QDockWidget *w){ layoutState.dockAreaLayout.keepSize(w);}#ifndef QT_NO_TABBARclass QMainWindowTabBar : public QTabBar{public: QMainWindowTabBar(QWidget *parent);protected: bool event(QEvent *e);};QMainWindowTabBar::QMainWindowTabBar(QWidget *parent) : QTabBar(parent){ static_cast<QTabBarPrivate*>(d_ptr)->squeezeTabs = true;}bool QMainWindowTabBar::event(QEvent *e){ // show the tooltip if tab is too small to fit label if (e->type() != QEvent::ToolTip) return QTabBar::event(e); QSize size = this->size(); QSize hint = sizeHint(); if (shape() == QTabBar::RoundedWest || shape() == QTabBar::RoundedEast) { size.transpose(); hint.transpose(); } if (size.width() < hint.width()) return QTabBar::event(e); e->accept(); return true;}QTabBar *QMainWindowLayout::getTabBar(){ QTabBar *result = 0; if (!unusedTabBars.isEmpty()) { result = unusedTabBars.takeLast(); } else { result = new QMainWindowTabBar(parentWidget()); result->setShape(QTabBar::RoundedSouth); result->setDrawBase(true); result->setElideMode(Qt::ElideRight); connect(result, SIGNAL(currentChanged(int)), this, SLOT(tabChanged())); } usedTabBars.insert(result); return result;}void QMainWindowLayout::tabChanged(){ QTabBar *tb = qobject_cast<QTabBar*>(sender()); if (tb == 0) return; QDockAreaLayoutInfo *info = layoutState.dockAreaLayout.info(tb); if (info == 0) return; info->apply(false); if (QWidget *w = centralWidget()) w->raise();}#endif // QT_NO_TABBARbool QMainWindowLayout::startSeparatorMove(const QPoint &pos){ movingSeparator = layoutState.dockAreaLayout.findSeparator(pos); if (movingSeparator.isEmpty()) return false; savedState = layoutState; movingSeparatorPos = movingSeparatorOrigin = pos; return true;}bool QMainWindowLayout::separatorMove(const QPoint &pos){ if (movingSeparator.isEmpty()) return false; movingSeparatorPos = pos; separatorMoveTimer->start(); return true;}void QMainWindowLayout::doSeparatorMove(){ if (movingSeparator.isEmpty()) return; if (movingSeparatorOrigin == movingSeparatorPos) return; layoutState = savedState; layoutState.dockAreaLayout.separatorMove(movingSeparator, movingSeparatorOrigin, movingSeparatorPos, &separatorMoveCache); movingSeparatorPos = movingSeparatorOrigin;}bool QMainWindowLayout::endSeparatorMove(const QPoint&){ bool result = !movingSeparator.isEmpty(); movingSeparator.clear(); savedState.clear(); separatorMoveCache.clear(); return result;}void QMainWindowLayout::raise(QDockWidget *widget){ QDockAreaLayoutInfo *info = layoutState.dockAreaLayout.info(widget); if (info == 0) return;#ifndef QT_NO_TABBAR if (!info->tabbed) return; info->setCurrentTab(widget);#endif}#endif // QT_NO_DOCKWIDGET/******************************************************************************** QMainWindowLayoutState - layout interface*/int QMainWindowLayout::count() const{ qWarning("QMainWindowLayout::count: ?"); return 0; //#################################################}QLayoutItem *QMainWindowLayout::itemAt(int index) const{ int x = 0; if (QLayoutItem *ret = layoutState.itemAt(index, &x)) return ret; if (statusbar && x++ == index) return statusbar; return 0;}QLayoutItem *QMainWindowLayout::takeAt(int index){ int x = 0; if (QLayoutItem *ret = layoutState.takeAt(index, &x)) { // the widget might in fact have been destroyed by now if (QWidget *w = ret->widget()) { widgetAnimator->abort(w); if (w == pluggingWidget) pluggingWidget = 0; } return ret; } if (statusbar && x++ == index) { QLayoutItem *ret = statusbar; statusbar = 0; return ret; } return 0;}void QMainWindowLayout::setGeometry(const QRect &_r){ if (savedState.isValid()) return; QRect r = _r; QLayout::setGeometry(r); if (statusbar) { QRect sbr(QPoint(0, 0), QSize(r.width(), statusbar->heightForWidth(r.width())) .expandedTo(statusbar->minimumSize())); sbr.moveBottom(r.bottom()); QRect vr = QStyle::visualRect(QApplication::layoutDirection(), _r, sbr); statusbar->setGeometry(vr); r.setBottom(sbr.top() - 1); } layoutState.rect = r; layoutState.fitLayout(); applyState(layoutState, false);}void QMainWindowLayout::addItem(QLayoutItem *){ qWarning("QMainWindowLayout::addItem: Please use the public QMainWindow API instead"); }QSize QMainWindowLayout::sizeHint() const{ if (!szHint.isValid()) { szHint = layoutState.sizeHint(); const QSize sbHint = statusbar ? statusbar->sizeHint() : QSize(0, 0); szHint = QSize(qMax(sbHint.width(), szHint.width()), sbHint.height() + szHint.height()); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -