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

📄 qtwindowlistmenu.cpp

📁 QT 开发环境里面一个很重要的文件
💻 CPP
字号:
/******************************************************************************** Copyright (C) 2006-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Linguist 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 "qtwindowlistmenu.h"#include <QString>#include <QWorkspace>#include <QObjectList>#include <QMenuBar>#include <QList>#include <QEvent>#include <QTextStream>#include <stdio.h>/*!    \class QtWindowListMenu    \brief The QtWindowListMenu class is a menu that displays    the names of the windows in a QWorkspace.    This class is intended to be used in the "Windows" item in an MDI    application's menubar. It keeps track of the workspace and updates    its own contents automatically, noting when windows are added,    removed or activated. When there are no windows on the workspace it    disables itself. Additionally, it provides the standard Window    menu entries: "Tile", "Cascade", "Close" and "Close All".    The QtWindowListMenu is added to the menubar (or any descendant of    QMenuBar) using addTo().        This class inherits publicly from QMenu, so the items    "Tile", "Cascade", "Close" and "Close All" may be modified    or removed, and new items may be added. However, removing menu items    which correspond to windows on the workspace results in undefined     behavior.*//*!    Constructs a QtWindowListMenu object. The \a parent     parameter is passed to the QMenu constructor, and the \a name parameter    is set as the object name. The    \a workspace parameter specifies which QWorkspace object the menu    must keep track of. If it is 0, the QtWindowListMenu will not    update itself automatically, although it will still keep track of the    state of any windows specified manually using    addWindow().*/QtWindowListMenu::QtWindowListMenu(QWorkspace *workspace, QWidget *parent,					    const char *name)	: QMenu(parent), groupWindows(this){        setObjectName(name);    m_menubar = 0;    m_my_action = 0;    m_close_current_action = 0;    m_workspace = workspace;    groupWindows.setExclusive(false);    if (m_workspace != 0) {	    m_workspace->installEventFilter(this);        connect(m_workspace, SIGNAL(windowActivated(QWidget*)),                this, SLOT(addWindow(QWidget*)));                                               	    m_tile_action = addAction(tr("Tile"), m_workspace, SLOT(tile()));	    m_cascade_action = addAction(tr("Cascade"), m_workspace, SLOT(cascade()));	    addSeparator();	    m_close_current_action = addAction(tr("Close"), m_workspace, SLOT(closeActiveWindow()));	    m_close_current_action->setEnabled(false);	    m_close_all_action = addAction(tr("Close All"), m_workspace, SLOT(closeAllWindows()));	    addSeparator();    }}/*    If \a on is false, the window titles in the menu will have the form:    \code    Unnamed    Unnamed2    SomeDocument.txt    ...    \endcode    If \a on is true and \a amperstands if false, the window titles in the menu     will have the form:        \code    1 Unnamed    2 Unnamed2    3 SomeDocument.txt    ...    \endcode        If both \a on and \a amperstands are true, the window titles in the menu    will have the form:        \code    &1 Unnamed    &2 Unnamed2    &3 SomeDocument.txt    ...    \endcode        Calling this method has no effect on window titles that are already in the    menu at the time when the call is made. It should therefore be called    right after the QtWindowListMenu is created, before any windows are    put on the QWorkspace.void QtWindowListMenu::setNumbering(bool on, bool amperstands){    m_numbering = on;    m_amperstands = amperstands;}*//*!    Adds this window list menu to \a menubar at position \a idx, with the     name \a text. If \a idx is -1, the window list menu is appended    as the last item on the menubar. Does nothing and returns null if this     menu is already assigned to a menubar. Otherwise returns a pointer to    the QAction object for the inserted menu item.  */QAction *QtWindowListMenu::addTo(const QString &text, QMenuBar *menubar, int idx){    if (menubar == 0 || m_menubar != 0)     	return 0;    m_menubar = menubar;    QList<QAction *> actions = m_menubar->actions();        QAction *action = 0;    if (idx >= 0 && idx < actions.size())        action = actions[idx];    setTitle(text);    m_my_action = m_menubar->insertMenu(action, this);    setEnabled(false);    return m_my_action;}/*!    Removes the widget \a w from this window list menu's list of    widgets. If \a windowDestroyed is true, QtWindowListMenu assumes    that \a w is a pointer to a destroyed object, and will not call    \a w's functions. \a windowDestroyed has a default value of false.    Normally it's not necessary to call this method, as    QtWindowListMenu automatically removes windows from the list when    they recieve a QCloseEvent.*/void QtWindowListMenu::removeWindow(QWidget *w, bool windowDestroyed){    WindowList::iterator it = m_window_list.find(w);    if (it == m_window_list.end())    	return;    /* We don't want call any of w's methods if removeWindow() is being	    called in response to w's destroyed() signal. */    if (!windowDestroyed) {	    w->removeEventFilter(this);	    disconnect(w, 0, this, 0);    }        if (*it != 0) {         removeAction(*it);        groupWindows.removeAction(*it);    }    m_window_list.erase(it);    if (isEmpty())     	setEnabled(false);}/*!    Adds the widget \a w to this QtWindowListMenu. Does nothing if \a w is    already in the menu. Normally it's not necessary to call this    function, since QtWindowListMenu automatically adds windows to the    list when they are inserted into the QWorkspace specified in the    constructor.*/void QtWindowListMenu::addWindow(QWidget *w){    if (w == 0) {	    if (m_menubar != 0 && m_close_current_action != 0)	        m_close_current_action->setEnabled(false);	    	    return;    }    if (m_menubar != 0 && m_close_current_action != 0)    	m_close_current_action->setEnabled(true);    WindowList::iterator it = m_window_list.find(w);        if (it == m_window_list.end()) {	    m_window_list[w] = 0;	    w->installEventFilter(this);	    connect(w, SIGNAL(destroyed(QObject*)),     	    	this, SLOT(windowDestroyed(QObject*)));    	it = m_window_list.find(w);    }        if (!w->isVisible() && !w->isMinimized())        return;        if (*it == 0) {        *it = new QAction(w->windowTitle(), &groupWindows);        (*it)->setCheckable(true);        if (!m_default_icon.isNull())            (*it)->setIcon(m_default_icon);        addAction(*it);              connect(*it, SIGNAL(toggled(bool)), this, SLOT(setSenderChecked(bool)));        connect(*it, SIGNAL(triggered()), w, SLOT(setFocus()));                                       connect(*it, SIGNAL(triggered()), w, SLOT(show()));    }        setChecked(true, *it);    setEnabled(true);}/*!    Adds the widget \a widget to this QtWindowListMenu, and sets the icon of its menu item     to be \a icon. */void QtWindowListMenu::addWindow(QWidget *widget, const QIcon &icon){    addWindow(widget);    setWindowIcon(widget, icon);}/*!    Sets \a icon as the icon of the menu item belonging to the widget \a widget. If \a icon is     a null icon, then the menu item's icon will be cleared instead of set.    */void QtWindowListMenu::setWindowIcon(QWidget *widget, const QIcon &icon){    WindowList::iterator it = m_window_list.find(widget);    if (it != m_window_list.end())        (*it)->setIcon(icon);}/*!    Sets \a icon as the default menu item icon for this QtWindowListMenu. The menu items for each of the windows     currently listed in the menu will get this as their current icon. New menu items added to the menu will also    get this icon by default. If \a icon is a null icon, then the default icon will be cleared.*/void QtWindowListMenu::setDefaultIcon(const QIcon &icon){    m_default_icon = icon;    WindowList::iterator it;    for (it=m_window_list.begin();it!=m_window_list.end();++it)         (*it)->setIcon(icon);}void QtWindowListMenu::setSenderChecked(bool /*checked*/){    setChecked(true, qobject_cast<QAction *>(sender()));}void QtWindowListMenu::setChecked(bool checked, QAction *a){    if (a != 0) {        WindowList::iterator it = m_window_list.begin();        for (;it != m_window_list.end(); ++it) {            if (*it != 0) {                bool wasBlocked = (*it)->signalsBlocked();                (*it)->blockSignals(true);                (*it)->setChecked(false);                (*it)->blockSignals(wasBlocked);            }        }        bool wasBlocked = a->signalsBlocked();        a->blockSignals(true);        a->setChecked(checked);        a->blockSignals(wasBlocked);    }}/*! \internal */bool QtWindowListMenu::isEmpty(){    WindowList::const_iterator it = m_window_list.begin();    for (; it != m_window_list.end(); ++it) {    	if (*it != 0)	        return false;    }    return true;}/*! \internal */bool QtWindowListMenu::eventFilter(QObject *obj, QEvent *e){    if (obj == m_workspace) {        if (e->type() != QEvent::ChildAdded)	        return false;    	QChildEvent *child_event = (QChildEvent *) e;	    QObject *child = child_event->child();    	if (child->metaObject()->className() != "QWorkspaceChild")	        return false;        QWidget *child_widget = qobject_cast<QWidget *>(child);        if (child_widget == 0)            return false;        addWindow(child_widget);    } else {        // events from registered windows        QWidget *w = qobject_cast<QWidget *>(obj);        if (w == 0)	        return false;	    WindowList::iterator it = m_window_list.find(w);	    if (it == m_window_list.end())             return false;	    switch (e->type()) {	    case QEvent::Show:    		addWindow(w);   // If it was hidden when placed on workspace,	    	    		    // it will be added to the menu now		    break;	    case QEvent::Close:		    // we keep the window in the m_window_list, it might be show()n again.            if (*it != 0) {	    	    removeAction(*it);		                    groupWindows.removeAction(*it);            }		    *it = 0;		    if (isEmpty()) 	    	    setEnabled(false);		    break;	    case QEvent::WindowTitleChange:    		if (*it != 0)                 (*it)->setText(w->windowTitle());	    			    break;	    default: break;	    }    }    return false;}/*! \internal */void QtWindowListMenu::windowDestroyed(QObject *obj){    removeWindow((QWidget*)obj, true);}/*!     Enables or disables the window list menu, according to the value    of \a b. Normally it is not necessary to call this function, since    QtWindowListMenu automatically enables itself whenever there is    more than one window present in the workspace.    \sa QAction::setEnabled()*/void QtWindowListMenu::setEnabled(bool b){    if (m_menubar != 0)         m_my_action->setEnabled(b);}/*!    Sets \a icon as the icon of the menu item which closes the current window.    If \a icon is a null icon, then the menu item's icon will be cleared instead of set.*/void QtWindowListMenu::setCloseIcon(const QIcon &icon){    m_close_current_action->setIcon(icon);}/*!    Sets \a icon as the icon of the menu item which cascades the windows in the workspace.    If \a icon is a null icon, then the menu item's icon will be cleared instead of set.*/void QtWindowListMenu::setCascadeIcon(const QIcon &icon){    m_cascade_action->setIcon(icon);}/*!    Sets \a icon as the icon of the menu item which tiles the windows in the workspace.    If \a icon is a null icon, then the menu item's icon will be cleared instead of set.*/void QtWindowListMenu::setTileIcon(const QIcon &icon){    m_tile_action->setIcon(icon);}/*!    Sets \a icon as the icon of the menu item which closes all windows in the workspace.    If \a icon is a null icon, then the menu item's icon will be cleared instead of set.*/void QtWindowListMenu::setCloseAllIcon(const QIcon &icon) {    m_close_all_action->setIcon(icon);}

⌨️ 快捷键说明

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