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 + -
显示快捷键?