qdesigner_menubar.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 953 行 · 第 1/2 页
CPP
953 行
/******************************************************************************** Copyright (C) 1992-2007 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://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** 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_command_p.h"#include "qdesigner_propertycommand_p.h"#include "actionrepository_p.h"#include "actionprovider_p.h"#include "actioneditor_p.h"#include "qdesigner_utils_p.h"#include "promotiontaskmenu_p.h"#include "qdesigner_objectinspector_p.h"#include <QtDesigner/QDesignerFormWindowInterface>#include <QtDesigner/QDesignerFormEditorInterface>#include <QtDesigner/QDesignerWidgetFactoryInterface>#include <QtDesigner/QExtensionManager>#include <QtCore/QMimeData>#include <QtCore/qdebug.h>#include <QtGui/QApplication>#include <QtGui/QDrag>#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_addMenu(new SpecialMenuAction(this)), m_currentIndex(0), m_interactive(true), m_editor(new QLineEdit(this)), m_dragging(false), m_lastMenuActionIndex( -1), m_promotionTaskMenu(new PromotionTaskMenu(this, PromotionTaskMenu::ModeSingleWidget, this)){ setContextMenuPolicy(Qt::DefaultContextMenu); setAcceptDrops(true); // ### fake m_addMenu->setText(tr("Type Here")); addAction(m_addMenu); QFont italic; italic.setItalic(true); m_addMenu->setFont(italic); m_editor->setObjectName(QLatin1String("__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)) { const 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()) { const QRect g = actionGeometry(action); QDesignerMenu::drawSelection(&p, g.adjusted(1, 1, -1, -1)); } else if (action->menu() && action->menu()->isVisible()) { const 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(); if (QApplication::layoutDirection() == Qt::LeftToRight) moveLeft(e->modifiers() & Qt::ControlModifier); else moveRight(e->modifiers() & Qt::ControlModifier); return true; case Qt::Key_Right: e->accept(); if (QApplication::layoutDirection() == Qt::LeftToRight) moveRight(e->modifiers() & Qt::ControlModifier); else moveLeft(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){ const int index = findAction(pos); if (m_currentIndex == -1 || index >= realActionCount()) return; QAction *action = safeActionAt(index); QDesignerFormWindowInterface *fw = formWindow(); RemoveActionFromCommand *cmd = new RemoveActionFromCommand(fw); cmd->init(this, action, actions().at(index + 1)); fw->commandHistory()->push(cmd); adjustSize(); hideMenu(index); QDrag *drag = new QDrag(this); drag->setPixmap(ActionRepositoryMimeData::actionDragPixmap(action)); drag->setMimeData(new ActionRepositoryMimeData(action, Qt::MoveAction)); const int old_index = m_currentIndex; m_currentIndex = -1; if (drag->start(Qt::MoveAction) == Qt::IgnoreAction) { InsertActionIntoCommand *cmd = new InsertActionIntoCommand(fw); cmd->init(this, action, safeActionAt(index)); fw->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(); const int newIndex = actionAtPosition(m_startPosition); const bool changed = newIndex != m_currentIndex; m_currentIndex = newIndex; updateCurrentAction(changed); 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; const QPoint pos = mapFromGlobal(event->globalPos()); if ((pos - m_startPosition).manhattanLength() < qApp->startDragDistance()) return true; const 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())); update(); QMenu menu(this); if (QAction *action = safeActionAt(m_currentIndex)) { if (!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(deleteMenu())); menu.addSeparator(); } } m_promotionTaskMenu->addActions(formWindow(), PromotionTaskMenu::TrailingSeparator, &menu); 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::focusOutEvent(QFocusEvent *event){ QMenuBar::focusOutEvent(event);}void QDesignerMenuBar::enterEditMode(){ if (m_currentIndex >= 0 && m_currentIndex <= realActionCount()) { showLineEdit(); }}void QDesignerMenuBar::leaveEditMode(LeaveEditMode mode){ m_editor->releaseKeyboard(); if (mode == Default) return; if (m_editor->text().isEmpty()) return; QAction *action = 0; QDesignerFormWindowInterface *fw = formWindow(); Q_ASSERT(fw); if (m_currentIndex >= 0 && m_currentIndex < realActionCount()) { action = safeActionAt(m_currentIndex); fw->beginCommand(QApplication::translate("Command", "Change Title")); } else { fw->beginCommand(QApplication::translate("Command", "Insert Menu")); const QString niceObjectName = ActionEditor::actionTextToName(m_editor->text(), QLatin1String("menu")); QMenu *menu = qobject_cast<QMenu*>(fw->core()->widgetFactory()->createWidget(QLatin1String("QMenu"), this)); fw->core()->widgetFactory()->initialize(menu); menu->setObjectName(niceObjectName); menu->setTitle(tr("Menu")); fw->ensureUniqueObjectName(menu);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?