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

📄 qdesigner_menubar.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qdesigner_menubar_p.h"#include "qdesigner_menu_p.h"#include "qdesigner_toolbar_p.h"#include "qdesigner_command_p.h"#include "actionrepository_p.h"#include "actionprovider_p.h"#include "actioneditor_p.h"#include "qdesigner_utils_p.h"#include <QtDesigner/QtDesigner>#include <QtCore/QTimer>#include <QtCore/qdebug.h>#include <QtGui/QAction>#include <QtGui/QApplication>#include <QtGui/QMenu>#include <QtGui/QToolButton>#include <QtGui/QDrag>#include <QtGui/QLayout>#include <QtGui/QLineEdit>#include <QtGui/QPainter>#include <QtGui/qevent.h>Q_DECLARE_METATYPE(QAction*)Q_DECLARE_METATYPE(QListWidgetItem*)using namespace qdesigner_internal;namespace qdesigner_internal{/////////////////////////////////////////////////////////////////////////////////////////////////////////SpecialMenuAction::SpecialMenuAction(QObject *parent)    : QAction(parent){}SpecialMenuAction::~SpecialMenuAction(){}} // namespace qdesigner_internal/////////////////////////////////////////////////////////////////////////////////////////////////////////QDesignerMenuBar::QDesignerMenuBar(QWidget *parent)    : QMenuBar(parent),      m_interactive(true){    m_currentIndex = 0;    m_lastMenuActionIndex = -1;    m_dragging = false;    setContextMenuPolicy(Qt::DefaultContextMenu);    setAcceptDrops(true); // ### fake    m_addMenu = new SpecialMenuAction(this);    m_addMenu->setText(tr("Type Here"));    addAction(m_addMenu);    QFont italic;    italic.setItalic(true);    m_addMenu->setFont(italic);    m_editor = new QLineEdit(this);    m_editor->setObjectName("__qt__passive_editor");    m_editor->hide();    m_editor->installEventFilter(this);    qApp->installEventFilter(this);}QDesignerMenuBar::~QDesignerMenuBar(){}void QDesignerMenuBar::paintEvent(QPaintEvent *event){    QMenuBar::paintEvent(event);    QPainter p(this);    foreach (QAction *a, actions()) {        if (qobject_cast<SpecialMenuAction*>(a)) {            QRect g = actionGeometry(a);            QLinearGradient lg(g.left(), g.top(), g.left(), g.bottom());            lg.setColorAt(0.0, Qt::transparent);            lg.setColorAt(0.7, QColor(0, 0, 0, 32));            lg.setColorAt(1.0, Qt::transparent);            p.fillRect(g, lg);        }    }    QAction *action = currentAction();    if (m_dragging || !action)        return;    if (hasFocus()) {        QRect g = actionGeometry(action);        QDesignerMenu::drawSelection(&p, g.adjusted(1, 1, -1, -1));    } else if (action->menu() && action->menu()->isVisible()) {        QRect g = actionGeometry(action);        p.drawRect(g.adjusted(1, 1, -1, -1));    }}bool QDesignerMenuBar::handleEvent(QWidget *widget, QEvent *event){    if (!formWindow())        return false;    if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut)        update();    switch (event->type()) {        default: break;        case QEvent::MouseButtonDblClick:            return handleMouseDoubleClickEvent(widget, static_cast<QMouseEvent*>(event));        case QEvent::MouseButtonPress:            return handleMousePressEvent(widget, static_cast<QMouseEvent*>(event));        case QEvent::MouseButtonRelease:            return handleMouseReleaseEvent(widget, static_cast<QMouseEvent*>(event));        case QEvent::MouseMove:            return handleMouseMoveEvent(widget, static_cast<QMouseEvent*>(event));        case QEvent::ContextMenu:            return handleContextMenuEvent(widget, static_cast<QContextMenuEvent*>(event));        case QEvent::KeyPress:            return handleKeyPressEvent(widget, static_cast<QKeyEvent*>(event));        case QEvent::FocusIn:        case QEvent::FocusOut:            return widget != m_editor;    }    return true;}bool QDesignerMenuBar::handleMouseDoubleClickEvent(QWidget *, QMouseEvent *event){    if (!rect().contains(event->pos()))        return true;    if ((event->buttons() & Qt::LeftButton) != Qt::LeftButton)        return true;    event->accept();    m_startPosition = QPoint();    m_currentIndex = actionAtPosition(event->pos());    if (m_currentIndex != -1) {        showLineEdit();    }    return true;}bool QDesignerMenuBar::handleKeyPressEvent(QWidget *, QKeyEvent *e){    if (m_editor->isHidden()) { // In navigation mode        switch (e->key()) {        case Qt::Key_Delete:            if (m_currentIndex == -1 || m_currentIndex >= realActionCount())                break;            hideMenu();            deleteMenu();            break;        case Qt::Key_Left:            e->accept();            moveLeft(e->modifiers() & Qt::ControlModifier);            return true;        case Qt::Key_Right:            e->accept();            moveRight(e->modifiers() & Qt::ControlModifier);            return true; // no update        case Qt::Key_Up:            e->accept();            moveUp();            return true;        case Qt::Key_Down:            e->accept();            moveDown();            return true;        case Qt::Key_PageUp:            m_currentIndex = 0;            break;        case Qt::Key_PageDown:            m_currentIndex = actions().count() - 1;            break;        case Qt::Key_Enter:        case Qt::Key_Return:            e->accept();            enterEditMode();            return true; // no update        case Qt::Key_Alt:        case Qt::Key_Shift:        case Qt::Key_Control:        case Qt::Key_Escape:            e->ignore();            setFocus(); // FIXME: this is because some other widget get the focus when CTRL is pressed            return true; // no update        default:            if (!e->text().isEmpty() && e->text().at(0).toLatin1() >= 32) {                showLineEdit();                QApplication::sendEvent(m_editor, e);                e->accept();            } else {                e->ignore();            }            return true;        }    } else { // In edit mode        switch (e->key()) {        default:            return false;        case Qt::Key_Control:            e->ignore();            return true;        case Qt::Key_Enter:        case Qt::Key_Return:            if (!m_editor->text().isEmpty()) {                leaveEditMode(ForceAccept);                if (m_lastFocusWidget)                    m_lastFocusWidget->setFocus();                m_editor->hide();                showMenu();                break;            }            // fall through        case Qt::Key_Escape:            update();            setFocus();            break;        }    }    e->accept();    update();    return true;}void QDesignerMenuBar::startDrag(const QPoint &pos){    int index = findAction(pos);    if (m_currentIndex == -1 || index >= realActionCount())        return;    QAction *action = safeActionAt(index);    RemoveActionFromCommand *cmd = new RemoveActionFromCommand(formWindow());    cmd->init(this, action, actions().at(index + 1));    formWindow()->commandHistory()->push(cmd);    adjustSize();    hideMenu(index);    QDrag *drag = new QDrag(this);    drag->setPixmap(action->icon().pixmap(QSize(22, 22)));    ActionRepositoryMimeData *data = new ActionRepositoryMimeData();    data->items.append(action);    drag->setMimeData(data);    int old_index = m_currentIndex;    m_currentIndex = -1;    if (drag->start() == Qt::IgnoreAction) {        InsertActionIntoCommand *cmd = new InsertActionIntoCommand(formWindow());        cmd->init(this, action, safeActionAt(index));        formWindow()->commandHistory()->push(cmd);        m_currentIndex = old_index;        adjustSize();    }}bool QDesignerMenuBar::handleMousePressEvent(QWidget *, QMouseEvent *event){    m_startPosition = QPoint();    event->accept();    if (event->button() != Qt::LeftButton)        return true;    m_startPosition = event->pos();    m_currentIndex = actionAtPosition(m_startPosition);    update();    return true;}bool QDesignerMenuBar::handleMouseReleaseEvent(QWidget *, QMouseEvent *event){    m_startPosition = QPoint();    if (event->button() != Qt::LeftButton)        return true;    event->accept();    m_currentIndex = actionAtPosition(event->pos());    if (!m_editor->isVisible() && m_currentIndex != -1 && m_currentIndex < realActionCount())        showMenu();    return true;}bool QDesignerMenuBar::handleMouseMoveEvent(QWidget *, QMouseEvent *event){    if ((event->buttons() & Qt::LeftButton) != Qt::LeftButton)        return true;    if (m_startPosition.isNull())        return true;    QPoint pos = mapFromGlobal(event->globalPos());    if ((pos - m_startPosition).manhattanLength() < qApp->startDragDistance())        return true;    int index = actionAtPosition(m_startPosition);    if (index < actions().count()) {        hideMenu(index);        update();    }    startDrag(m_startPosition);    m_startPosition = QPoint();    return true;}bool QDesignerMenuBar::handleContextMenuEvent(QWidget *, QContextMenuEvent *event){    event->accept();    m_currentIndex = actionAtPosition(mapFromGlobal(event->globalPos()));    QAction *action = safeActionAt(m_currentIndex);    update();    QMenu menu(this);    if (action && !qobject_cast<SpecialMenuAction*>(action)) {        QVariant itemData;        qVariantSetValue(itemData, action);        QAction *remove_action = menu.addAction(tr("Remove Menu '%1'").arg(action->menu()->objectName()));        remove_action->setData(itemData);        connect(remove_action, SIGNAL(triggered()), this, SLOT(slotRemoveSelectedAction()));        menu.addSeparator();    }    QAction *remove_menubar = menu.addAction(tr("Remove Menu Bar"));    connect(remove_menubar, SIGNAL(triggered()), this, SLOT(slotRemoveMenuBar()));    menu.exec(event->globalPos());    return true;}void QDesignerMenuBar::slotRemoveMenuBar(){    Q_ASSERT(formWindow() != 0);    QDesignerFormWindowInterface *fw = formWindow();    DeleteMenuBarCommand *cmd = new DeleteMenuBarCommand(fw);    cmd->init(this);    fw->commandHistory()->push(cmd);}void QDesignerMenuBar::slotRemoveSelectedAction(){    QAction *action = qobject_cast<QAction*>(sender());    if (!action)        return;    QAction *a = qvariant_cast<QAction*>(action->data());    if (qobject_cast<SpecialMenuAction*>(a))        return; // nothing to do    int pos = actions().indexOf(a);    QAction *action_before = 0;    if (pos != -1)        action_before = safeActionAt(pos + 1);    RemoveActionFromCommand *cmd = new RemoveActionFromCommand(formWindow());    cmd->init(this, a, action_before);    formWindow()->commandHistory()->push(cmd);}void QDesignerMenuBar::focusOutEvent(QFocusEvent *event){    QMenuBar::focusOutEvent(event);}QAction *QDesignerMenuBar::createAction(const QString &name){    Q_ASSERT(formWindow() != 0);    QDesignerFormWindowInterface *fw = formWindow();    QDesignerFormEditorInterface *core = fw->core();    QMenu *menu = qobject_cast<QMenu*>(core->widgetFactory()->createWidget("QMenu", this));    core->widgetFactory()->initialize(menu);    menu->setObjectName(name);    menu->setTitle(tr("Menu"));    fw->ensureUniqueObjectName(menu);    QAction *menuAction = menu->menuAction();    AddMenuActionCommand *cmd = new AddMenuActionCommand(formWindow());    cmd->init(menuAction, this);    formWindow()->commandHistory()->push(cmd);    return menuAction;}void QDesignerMenuBar::enterEditMode(){    if (m_currentIndex >= 0 && m_currentIndex <= realActionCount()) {        showLineEdit();

⌨️ 快捷键说明

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