qmenubar.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 2,208 行 · 第 1/5 页
CPP
2,208 行
\brief the popup orientation The default popup orientation. By default, menus pop "down" the screen. By setting the property to true, the menu will pop "up". You might call this for menus that are \e below the document to which they refer. If the menu would not fit on the screen, the other direction is used automatically.*/void QMenuBar::setDefaultUp(bool b){ Q_D(QMenuBar); d->defaultPopDown = !b;}bool QMenuBar::isDefaultUp() const{ Q_D(const QMenuBar); return !d->defaultPopDown;}/*! \reimp*/void QMenuBar::resizeEvent(QResizeEvent *){ Q_D(QMenuBar); d->itemsDirty = true; d->updateGeometries();}/*! \reimp*/void QMenuBar::paintEvent(QPaintEvent *e){ Q_D(QMenuBar); QPainter p(this); QRegion emptyArea(rect()); //draw the items for (int i = 0; i < d->actionList.count(); ++i) { QAction *action = d->actionList.at(i); QRect adjustedActionRect = d->actionRect(action); if (adjustedActionRect.isEmpty() || !d->isVisible(action)) continue; if(!e->rect().intersects(adjustedActionRect)) continue; emptyArea -= adjustedActionRect; QStyleOptionMenuItem opt; initStyleOption(&opt, action); opt.rect = adjustedActionRect; p.setClipRect(adjustedActionRect); style()->drawControl(QStyle::CE_MenuBarItem, &opt, &p, this); } //draw border if(int fw = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth, 0, this)) { QRegion borderReg; borderReg += QRect(0, 0, fw, height()); //left borderReg += QRect(width()-fw, 0, fw, height()); //right borderReg += QRect(0, 0, width(), fw); //top borderReg += QRect(0, height()-fw, width(), fw); //bottom p.setClipRegion(borderReg); emptyArea -= borderReg; QStyleOptionFrame frame; frame.rect = rect(); frame.palette = palette(); frame.state = QStyle::State_None; frame.lineWidth = style()->pixelMetric(QStyle::PM_MenuBarPanelWidth); frame.midLineWidth = 0; style()->drawPrimitive(QStyle::PE_PanelMenuBar, &frame, &p, this); } p.setClipRegion(emptyArea); QStyleOptionMenuItem menuOpt; menuOpt.palette = palette(); menuOpt.state = QStyle::State_None; menuOpt.menuItemType = QStyleOptionMenuItem::EmptyArea; menuOpt.checkType = QStyleOptionMenuItem::NotCheckable; menuOpt.rect = rect(); menuOpt.menuRect = rect(); style()->drawControl(QStyle::CE_MenuBarEmptyArea, &menuOpt, &p, this);}/*! \reimp*/void QMenuBar::setVisible(bool visible){#ifdef Q_WS_MAC Q_D(QMenuBar); if(d->mac_menubar) return;#endif QWidget::setVisible(visible);}/*! \reimp*/void QMenuBar::mousePressEvent(QMouseEvent *e){ Q_D(QMenuBar); if(e->button() != Qt::LeftButton) return; QAction *action = d->actionAt(e->pos()); if (!action || !d->isVisible(action)) { d->setCurrentAction(0);#ifndef QT_NO_WHATSTHIS if (QWhatsThis::inWhatsThisMode()) QWhatsThis::showText(e->globalPos(), d->whatsThis, this);#endif return; } d->mouseDown = true; if(d->currentAction == action && d->popupState) { d->closeActiveMenu();#ifdef Q_WS_WIN if((d->closePopupMode = style()->styleHint(QStyle::SH_MenuBar_DismissOnSecondClick))) update(d->actionRect(action));#endif } else { d->setCurrentAction(action, true); }}/*! \reimp*/void QMenuBar::mouseReleaseEvent(QMouseEvent *e){ Q_D(QMenuBar); if(e->button() != Qt::LeftButton || !d->mouseDown) return; d->mouseDown = false; QAction *action = d->actionAt(e->pos()); if((d->closePopupMode && action == d->currentAction) || !action || !action->menu()) { if(action) d->activateAction(action, QAction::Trigger); d->setCurrentAction(action, false); } d->closePopupMode = 0;}/*! \reimp*/void QMenuBar::keyPressEvent(QKeyEvent *e){ Q_D(QMenuBar); int key = e->key(); if(isRightToLeft()) { // in reverse mode open/close key for submenues are reversed if(key == Qt::Key_Left) key = Qt::Key_Right; else if(key == Qt::Key_Right) key = Qt::Key_Left; } if(key == Qt::Key_Tab) //means right key = Qt::Key_Right; else if(key == Qt::Key_Backtab) //means left key = Qt::Key_Left; bool key_consumed = false; switch(key) { case Qt::Key_Up: case Qt::Key_Down: case Qt::Key_Enter: case Qt::Key_Space: case Qt::Key_Return: { if(!style()->styleHint(QStyle::SH_MenuBar_AltKeyNavigation, 0, this) || !d->currentAction) break; if(d->currentAction->menu()) { d->popupAction(d->currentAction, true); } else if(key == Qt::Key_Enter || key == Qt::Key_Return || key == Qt::Key_Space) { d->activateAction(d->currentAction, QAction::Trigger); d->setCurrentAction(d->currentAction, false); } key_consumed = true; break; } case Qt::Key_Right: case Qt::Key_Left: { if(d->currentAction) { QAction *nextAction = 0; for(int i=0; i<(int)d->actionList.count(); i++) { if(d->actionList.at(i) == (QAction*)d->currentAction) { if(key == Qt::Key_Left) { if(i > 0) nextAction = d->actionList.at(i-1); } else { if(i < d->actionList.count()-1) nextAction = d->actionList.at(i+1); } break; } } if(!nextAction) { if(key == Qt::Key_Left) nextAction = d->actionList.last(); else nextAction = d->actionList.first(); } if(nextAction) { d->setCurrentAction(nextAction, d->popupState, true); key_consumed = true; } } break; } case Qt::Key_Escape: d->setCurrentAction(0); d->setKeyboardMode(false); key_consumed = true; break; default: key_consumed = false; } if(!key_consumed && (!e->modifiers() || (e->modifiers()&(Qt::MetaModifier|Qt::AltModifier))) && e->text().length()==1 && !d->popupState) { int clashCount = 0; QAction *first = 0, *currentSelected = 0, *firstAfterCurrent = 0; { QChar c = e->text()[0].toUpper(); for(int i = 0; i < d->actionList.size(); ++i) { register QAction *act = d->actionList.at(i); QString s = act->text(); if(!s.isEmpty()) { int ampersand = s.indexOf(QLatin1Char('&')); if(ampersand >= 0) { if(s[ampersand+1].toUpper() == c) { clashCount++; if(!first) first = act; if(act == d->currentAction) currentSelected = act; else if (!firstAfterCurrent && currentSelected) firstAfterCurrent = act; } } } } } QAction *next_action = 0; if(clashCount >= 1) { if(clashCount == 1 || !d->currentAction || (currentSelected && !firstAfterCurrent)) next_action = first; else next_action = firstAfterCurrent; } if(next_action) { key_consumed = true; d->setCurrentAction(next_action, true, true); } } if(key_consumed) e->accept(); else e->ignore();}/*! \reimp*/void QMenuBar::mouseMoveEvent(QMouseEvent *e){ Q_D(QMenuBar); d->mouseDown = e->buttons() & Qt::LeftButton; QAction *action = d->actionAt(e->pos()); bool popupState = d->popupState || d->mouseDown; if(action && d->isVisible(action) || !popupState) d->setCurrentAction(action, popupState);}/*! \reimp*/void QMenuBar::leaveEvent(QEvent *){ Q_D(QMenuBar); if(!hasFocus() && !d->popupState) d->setCurrentAction(0);}/*! \reimp*/void QMenuBar::actionEvent(QActionEvent *e){ Q_D(QMenuBar); d->itemsDirty = true;#ifdef Q_WS_MAC if(d->mac_menubar) { if(e->type() == QEvent::ActionAdded) d->mac_menubar->addAction(e->action(), d->mac_menubar->findAction(e->before())); else if(e->type() == QEvent::ActionRemoved) d->mac_menubar->removeAction(e->action()); else if(e->type() == QEvent::ActionChanged) d->mac_menubar->syncAction(e->action()); }#endif if(e->type() == QEvent::ActionAdded) { connect(e->action(), SIGNAL(triggered()), this, SLOT(_q_actionTriggered())); connect(e->action(), SIGNAL(hovered()), this, SLOT(_q_actionHovered())); } else if(e->type() == QEvent::ActionRemoved) { e->action()->disconnect(this); } if (isVisible()) { d->updateGeometries(); update(); }}/*! \reimp*/void QMenuBar::focusInEvent(QFocusEvent *){ Q_D(QMenuBar); if(d->keyboardState && !d->currentAction && !d->actionList.isEmpty()) d->setCurrentAction(d->actionList.first());}/*! \reimp*/void QMenuBar::focusOutEvent(QFocusEvent *){ Q_D(QMenuBar); if(!d->popupState) { d->setCurrentAction(0); d->setKeyboardMode(false); }}void QMenuBarPrivate::handleReparent(){ Q_Q(QMenuBar); QWidget *newParent = q->parentWidget(); //Note: if parent is reparented, then window may change even if parent doesn't // we need to install an event filter on parent, and remove the old one if (oldParent != newParent) { if (oldParent) oldParent->removeEventFilter(q); if (newParent) newParent->installEventFilter(q); } //we also need event filter on top-level (for shortcuts) QWidget *newWindow = newParent ? newParent->window() : 0; if (oldWindow != newWindow) { if (oldParent && oldParent != oldWindow) oldWindow->removeEventFilter(q); if (newParent && newParent != newWindow) newWindow->installEventFilter(q); } oldParent = newParent; oldWindow = newWindow;#ifdef Q_WS_MAC macDestroyMenuBar(); macCreateMenuBar(newParent);#endif}#ifdef QT3_SUPPORT/*! Sets whether the menu bar should automatically resize itself when its parent widget is resized. This feature is provided to help porting to Qt 4. We recommend against using it in new code. \sa autoGeometry()*/void QMenuBar::setAutoGeometry(bool b){ Q_D(QMenuBar); d->doAutoResize = b;}/*! Returns true if the menu bar automatically resizes itself when its parent widget is resized; otherwise returns false. This feature is provided to help porting to Qt 4. We recommend against using it in new code. \sa setAutoGeometry()*/bool QMenuBar::autoGeometry() const{ Q_D(const QMenuBar); return d->doAutoResize;}#endif/*! \reimp*/void QMenuBar::changeEvent(QEvent *e){ Q_D(QMenuBar); if(e->type() == QEvent::StyleChange) { d->itemsDirty = true; setMouseTracking(style()->styleHint(QStyle::SH_MenuBar_MouseTracking, 0, this)); if(parentWidget()) resize(parentWidget()->width(), heightForWidth(parentWidget()->width())); d->updateGeometries(); } else if (e->type() == QEvent::ParentChange) { d->handleReparent(); } else if (e->type() == QEvent::FontChange || e->type() == QEvent::ApplicationFontChange) { d->itemsDirty = true; d->updateGeometries(); } QWidget::changeEvent(e);}/*! \reimp*/bool QMenuBar::event(QEvent *e){ Q_D(QMenuBar); switch (e->type()) { case QEvent::KeyPress: { QKeyEvent *ke = (QKeyEvent*)e;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?