📄 qaction.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module 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 "qaction.h"#include "qactiongroup.h"#ifndef QT_NO_ACTION#include "qaction_p.h"#include "qapplication.h"#include "qevent.h"#include "qlist.h"#include "qdebug.h"#include <private/qshortcutmap_p.h>#include <private/qapplication_p.h>/* internal: guesses a descriptive text from a text suited for a menu entry */static QString qt_strippedText(QString s){ s.remove( QString::fromLatin1("...") ); int i = 0; while (i < s.size()) { ++i; if (s.at(i-1) != QLatin1Char('&')) continue; if (i < s.size() && s.at(i) == QLatin1Char('&')) ++i; s.remove(i-1,1); } return s.trimmed();};QActionPrivate::QActionPrivate() : group(0), enabled(1), forceDisabled(0), visible(1), forceInvisible(0), checkable(0), checked(0), separator(0), fontSet(false){#ifdef QT3_SUPPORT static int qt_static_action_id = -1; param = id = --qt_static_action_id; act_signal = 0;#endif#ifndef QT_NO_SHORTCUT shortcutId = 0; shortcutContext = Qt::WindowShortcut;#endif}QActionPrivate::~QActionPrivate(){}void QActionPrivate::sendDataChanged(){ Q_Q(QAction); QActionEvent e(QEvent::ActionChanged, q); for (int i = 0; i < widgets.size(); ++i) { QWidget *w = widgets.at(i); QApplication::sendEvent(w, &e); } QApplication::sendEvent(q, &e); emit q->changed();}#ifndef QT_NO_SHORTCUTvoid QActionPrivate::redoGrab(QShortcutMap &map){ Q_Q(QAction); if (shortcutId) map.removeShortcut(shortcutId, q); if (shortcut.isEmpty()) return; shortcutId = map.addShortcut(q, shortcut, shortcutContext); if (!enabled) map.setShortcutEnabled(false, shortcutId, q);}void QActionPrivate::setShortcutEnabled(bool enable, QShortcutMap &map){ Q_Q(QAction); if (shortcutId) map.setShortcutEnabled(enable, shortcutId, q);}#endif // QT_NO_SHORTCUT/*! \class QAction \brief The QAction class provides an abstract user interface action that can be inserted into widgets. \ingroup application \mainclass \omit * parent and widget are different * parent does not define context \endomit In applications many common commands can be invoked via menus, toolbar buttons, and keyboard shortcuts. Since the user expects each command to be performed in the same way, regardless of the user interface used, it is useful to represent each command as an \e action. Actions can be added to menus and toolbars, and will automatically keep them in sync. For example, in a word processor, if the user presses a Bold toolbar button, the Bold menu item will automatically be checked. Actions can be created as independent objects, but they may also be created during the construction of menus; the QMenu class contains convenience functions for creating actions suitable for use as menu items. A QAction may contain an icon, menu text, a shortcut, status text, "What's This?" text, and a tooltip. Most of these can be set in the constructor. They can also be set independently with setIcon(), setText(), setIconText(), setShortcut(), setStatusTip(), setWhatsThis(), and setToolTip(). For menu items, it is possible to set an individual font with setFont(). Actions are added to widgets using QWidget::addAction(). Once a QAction has been created it should be added to the relevant menu and toolbar, then connected to the slot which will perform the action. For example: \quotefile mainwindows/application/mainwindow.cpp \skipto openAct \printuntil connect \skipto fileMenu->addAction(openAct \printuntil fileMenu->addAction(openAct \skipto fileToolBar->addAction(openAct \printuntil fileToolBar->addAction(openAct We recommend that actions are created as children of the window they are used in. In most cases actions will be children of the application's main window.*//*! \fn void QAction::trigger() This is a convenience slot that calls activate(Trigger).*//*! \fn void QAction::hover() This is a convenience slot that calls activate(Hover).*//*! Constructs an action with \a parent. If \a parent is an action group the action will be automatically inserted into the group.*/QAction::QAction(QObject* parent) : QObject(*(new QActionPrivate), parent){ Q_D(QAction); d->group = qobject_cast<QActionGroup *>(parent); if (d->group) d->group->addAction(this);}/*! Constructs an action with some \a text and \a parent. If \a parent is an action group the action will be automatically inserted into the group. The action uses a stripped version of \a text (e.g. "\&Menu Option..." becomes "Menu Option") as descriptive text for toolbuttons. You can override this by setting a specific description with setText(). The same text will be used for tooltips unless you specify a different test using setToolTip().*/QAction::QAction(const QString &text, QObject* parent) : QObject(*(new QActionPrivate), parent){ Q_D(QAction); d->text = text; d->group = qobject_cast<QActionGroup *>(parent); if (d->group) d->group->addAction(this);}/*! Constructs an action with an \a icon and some \a text and \a parent. If \a parent is an action group the action will be automatically inserted into the group. The action uses a stripped version of \a text (e.g. "\&Menu Option..." becomes "Menu Option") as descriptive text for toolbuttons. You can override this by setting a specific description with setText(). The same text will be used for tooltips unless you specify a different test using setToolTip().*/QAction::QAction(const QIcon &icon, const QString &text, QObject* parent) : QObject(*(new QActionPrivate), parent){ Q_D(QAction); d->icon = icon; d->text = text; d->group = qobject_cast<QActionGroup *>(parent); if (d->group) d->group->addAction(this);}/*! Returns the parent widget.*/QWidget *QAction::parentWidget() const{ QObject *ret = parent(); while (ret && !ret->isWidgetType()) ret = ret->parent(); return (QWidget*)ret;}#ifndef QT_NO_SHORTCUT/*! \property QAction::shortcut \brief the action's shortcut key Valid keycodes for this property can be found in \l Qt::Key and \l Qt::Modifier. There is no default shortcut key.*/void QAction::setShortcut(const QKeySequence &shortcut){ Q_D(QAction); if (d->shortcut == shortcut) return; d->shortcut = shortcut; d->redoGrab(qApp->d_func()->shortcutMap); d->sendDataChanged();}QKeySequence QAction::shortcut() const{ Q_D(const QAction); return d->shortcut;}/*! \property QAction::shortcutContext \brief the context for the action's shortcut Valid values for this property can be found in \l Qt::ShortcutContext. The default value is Qt::WindowShortcut.*/void QAction::setShortcutContext(Qt::ShortcutContext context){ Q_D(QAction); if (d->shortcutContext == context) return; d->shortcutContext = context; d->redoGrab(qApp->d_func()->shortcutMap); d->sendDataChanged();}Qt::ShortcutContext QAction::shortcutContext() const{ Q_D(const QAction); return d->shortcutContext;}#endif // QT_NO_SHORTCUT/*! \property QAction::font \brief the action's font The font property is used to render the text set on the QAction. The font will can be considered a hint as it will not be consulted in all cases based upon application and style. \sa QAction::setText() QStyle*/void QAction::setFont(const QFont &font){ Q_D(QAction); if (d->font == font) return; d->fontSet = true; d->font = font; d->sendDataChanged();}QFont QAction::font() const{ Q_D(const QAction); return d->font;}#ifdef QT3_SUPPORT/*! Use one of the QAction constructors that doesn't take a \a name argument and call setObjectName() instead.*/QAction::QAction(QObject* parent, const char* name) : QObject(*(new QActionPrivate), parent){ Q_D(QAction); setObjectName(QString::fromAscii(name)); d->group = qobject_cast<QActionGroup *>(parent); if (d->group) d->group->addAction(this);}/*! Use one of the QAction constructors that doesn't take a \a name argument and call setObjectName() instead.*/QAction::QAction(const QString &text, const QKeySequence &shortcut, QObject* parent, const char* name) : QObject(*(new QActionPrivate), parent){ Q_D(QAction); setObjectName(QString::fromAscii(name)); d->text = text; setShortcut(shortcut); d->group = qobject_cast<QActionGroup *>(parent); if (d->group) d->group->addAction(this);}/*! Use one of the QAction constructors that doesn't take a \a name argument and call setObjectName() instead.*/QAction::QAction(const QIcon &icon, const QString &text, const QKeySequence &shortcut, QObject* parent, const char* name) : QObject(*(new QActionPrivate), parent){ Q_D(QAction); setObjectName(QString::fromAscii(name)); d->text = text; setShortcut(shortcut); d->icon = icon; d->group = qobject_cast<QActionGroup *>(parent); if (d->group) d->group->addAction(this);}#endif/*! Destroys the object and frees allocated resources.*/QAction::~QAction(){ Q_D(QAction); for (int i = d->widgets.size()-1; i >= 0; --i) { QWidget *w = d->widgets.at(i); w->removeAction(this); } if (d->group) d->group->removeAction(this);#ifndef QT_NO_SHORTCUT if (d->shortcutId && qApp) qApp->d_func()->shortcutMap.removeShortcut(d->shortcutId, this);#endif}/*! Sets this action group to \a group. The action will be automatically added to the group's list of actions. Actions within the group will be mutually exclusive. \sa QActionGroup, QAction::actionGroup()*/void QAction::setActionGroup(QActionGroup *group){ Q_D(QAction); if(group == d->group) return; if(d->group) d->group->removeAction(this); d->group = group; if(group) group->addAction(this);}/*! Returns the action group for this action. If no action group manages this action then 0 will be returned. \sa QActionGroup, QAction::setActionGroup()*/QActionGroup *QAction::actionGroup() const{ Q_D(const QAction); return d->group;}/*! \property QAction::icon \brief the action's icon In toolbars, the icon is used as the tool button icon; in menus, it is displayed to the left of the menu text. There is no default icon. If a null icon (QIcon::isNull() is passed into this function, the icon of the action is cleared.*/void QAction::setIcon(const QIcon &icon){ Q_D(QAction); d->icon = icon; d->sendDataChanged();}QIcon QAction::icon() const{ Q_D(const QAction); return d->icon;}#ifndef QT_NO_MENU/*! Returns the menu contained by this action. Actions that contain menus can be used to create menu items with submenus, or inserted into toolbars to create buttons with popup menus. \sa QMenu::addAction()*/QMenu *QAction::menu() const{ Q_D(const QAction); return d->menu;}/*! Sets the menu contained by this action to the specified \a menu.*/void QAction::setMenu(QMenu *menu){ Q_D(QAction); d->menu = menu; d->sendDataChanged();}#endif // QT_NO_MENU/*! If \a b is true then this action will be considered a separator. How a separator is represented depends on the widget it is inserted into. Under most circumstances the text, submenu, and icon will be ignored for separator actions. \sa QAction::isSeparator()*/void QAction::setSeparator(bool b){ Q_D(QAction); if (d->separator == b) return; d->separator = b; d->sendDataChanged();}/*! Returns true if this action is a separator action; otherwise it returns false. \sa QAction::setSeparator()*/bool QAction::isSeparator() const{ Q_D(const QAction); return d->separator;}/*! \property QAction::text \brief the action's descriptive text If the action is added to a menu, the menu option will consist of the icon (if there is one), the text, and the shortcut (if there is one). If the text is not explicitly set in the constructor, or by using setText(), the action's description icon text will be used as text. There is no default text. \sa iconText*/void QAction::setText(const QString &text){ Q_D(QAction); if (d->text == text) return; d->text = text; d->sendDataChanged();}QString QAction::text() const{ Q_D(const QAction); QString s = d->text; if(s.isEmpty()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -