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

📄 q3mainwindow.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the Qt3Support 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://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 "q3mainwindow.h"#ifndef QT_NO_MAINWINDOW#include "qapplication.h"#include "qbitmap.h"#include "qcursor.h"#include "qdatetime.h"#include "q3dockarea.h"#include "qevent.h"#include "qlayout.h"#include "qmap.h"#include "qmenubar.h"#include "qpainter.h"#include "q3popupmenu.h"#include "q3scrollview.h"#include "qstatusbar.h"#include "qstringlist.h"#include "qstyle.h"#include "qstyleoption.h"#include "qtimer.h"#include "q3toolbar.h"#include "qtooltip.h"#include "qwhatsthis.h"#ifdef Q_WS_MAC#  include <private/qt_mac_p.h>#endifclass QHideDock;#include <private/q3mainwindow_p.h>/* Q3MainWindowLayout, respects widthForHeight layouts (like the left  and right docks are)*/class Q3MainWindowLayout : public QLayout{    Q_OBJECTpublic:    Q3MainWindowLayout(Q3MainWindow *mw, QLayout* parent = 0);    ~Q3MainWindowLayout() {}    void addItem(QLayoutItem *);    void setLeftDock(Q3DockArea *l);    void setRightDock(Q3DockArea *r);    void setCentralWidget(QWidget *w);    bool hasHeightForWidth() const { return false; }    QSize sizeHint() const;    QSize minimumSize() const;    QLayoutItem *itemAt(int) const { return 0; } //###    QLayoutItem *takeAt(int) { return 0; } //###    int count() const { return 0; } //###protected:    void setGeometry(const QRect &r) {        QLayout::setGeometry(r);        layoutItems(r);    }private:    int layoutItems(const QRect&, bool testonly = false);    int extraPixels() const;    Q3DockArea *left, *right;    QWidget *central;    Q3MainWindow *mainWindow;};QSize Q3MainWindowLayout::sizeHint() const{    int w = 0;    int h = 0;    if (left) {        w += left->sizeHint().width();        h = qMax(h, left->sizeHint().height());    }    if (right) {        w += right->sizeHint().width();        h = qMax(h, right->sizeHint().height());    }    if (central) {        w += central->sizeHint().width();        int diff = extraPixels();        h = qMax(h, central->sizeHint().height() + diff);    }    return QSize(w, h);}QSize Q3MainWindowLayout::minimumSize() const{    int w = 0;    int h = 0;    if (left) {        QSize ms = left->minimumSizeHint().expandedTo(left->minimumSize());        w += ms.width();        h = qMax(h, ms.height());    }    if (right) {        QSize ms = right->minimumSizeHint().expandedTo(right->minimumSize());        w += ms.width();        h = qMax(h, ms.height());    }    if (central) {        QSize min = central->minimumSize().isNull() ?                    central->minimumSizeHint() : central->minimumSize();        w += min.width();        int diff = extraPixels();        h = qMax(h, min.height() + diff);    }    return QSize(w, h);}Q3MainWindowLayout::Q3MainWindowLayout(Q3MainWindow *mw, QLayout* parent)    : QLayout(parent), left(0), right(0), central(0){    mainWindow = mw;}void Q3MainWindowLayout::setLeftDock(Q3DockArea *l){    left = l;}void Q3MainWindowLayout::setRightDock(Q3DockArea *r){    right = r;}void Q3MainWindowLayout::setCentralWidget(QWidget *w){    central = w;}int Q3MainWindowLayout::layoutItems(const QRect &r, bool testonly){    if (!left && !central && !right)        return 0;    int wl = 0, wr = 0;    if (left)        wl = ((Q3DockAreaLayout*)left->QWidget::layout())->widthForHeight(r.height());    if (right)        wr = ((Q3DockAreaLayout*)right->QWidget::layout())->widthForHeight(r.height());    int w = r.width() - wr - wl;    if (w < 0)        w = 0;    int diff = extraPixels();    if (!testonly) {        QRect g(geometry());        if (left)            left->setGeometry(QRect(g.x(), g.y() + diff, wl, r.height() - diff));        if (right)            right->setGeometry(QRect(g.x() + g.width() - wr, g.y() + diff, wr, r.height() - diff));        if (central)            central->setGeometry(g.x() + wl, g.y() + diff, w, r.height() - diff);    }    w = wl + wr;    if (central)        w += central->minimumSize().width();    return w;}int Q3MainWindowLayout::extraPixels() const{    if (mainWindow->d_func()->topDock->isEmpty() &&         !(mainWindow->d_func()->leftDock->isEmpty() &&           mainWindow->d_func()->rightDock->isEmpty())) {        return 2;    } else {        return 0;    }}void Q3MainWindowLayout::addItem(QLayoutItem * /* item */){}/*  QHideToolTip and QHideDock - minimized dock*/#if 0class QHideToolTip : public QToolTip{public:    QHideToolTip(QWidget *parent) : QToolTip(parent) {}    void maybeTip(const QPoint &pos);};#endifclass QHideDock : public QWidget{    Q_OBJECTpublic:    QHideDock(Q3MainWindow *parent) : QWidget(parent, "qt_hide_dock") {        hide();        setFixedHeight(style()->pixelMetric(QStyle::PM_DockWidgetHandleExtent, 0, this) + 3);        pressedHandle = -1;        pressed = false;        setMouseTracking(true);        win = parent;#if 0        tip = new QHideToolTip(this);#endif    }    ~QHideDock()    {#if 0        delete tip;#endif    }protected:    void paintEvent(QPaintEvent *e) {        QObjectList childList = children();        if (childList.isEmpty())            return;        QPainter p(this);        p.setClipRegion(e->rect());        p.fillRect(e->rect(), palette().brush(QPalette::Window));        int x = 0;        for (int i = 0; i < childList.size(); ++i) {            QObject *o = childList.at(i);            Q3DockWindow *dw = qobject_cast<Q3DockWindow*>(o);            if (!dw || !dw->isVisible())                continue;            QStyleOptionQ3DockWindow opt;            opt.rect.setRect(x, 0, 30, 10);            opt.palette = palette();            opt.docked = dw->area();            opt.closeEnabled = dw->isCloseEnabled();            opt.state = QStyle::State_None;            if (i == pressedHandle)                opt.state |= QStyle::State_On;            style()->drawPrimitive(QStyle::PE_IndicatorToolBarHandle, &opt, &p, this);            x += 30;        }    }    void mousePressEvent(QMouseEvent *e) {        pressed = true;        QObjectList childList = children();        if (childList.isEmpty())            return;        mouseMoveEvent(e);        pressedHandle = -1;        if (e->button() == Qt::RightButton && win->isDockMenuEnabled()) {            // ### TODO: HideDock menu        } else {            mouseMoveEvent(e);        }    }    void mouseMoveEvent(QMouseEvent *e) {        QObjectList childList = children();        if (childList.isEmpty())            return;        if (!pressed)            return;        int x = 0;        if (e->y() >= 0 && e->y() <= height()) {            for (int i = 0; i < childList.size(); ++i) {                QObject *o = childList.at(i);                Q3DockWindow *dw = qobject_cast<Q3DockWindow*>(o);                if (!dw || !dw->isVisible())                    continue;                if (e->x() >= x && e->x() <= x + 30) {                    int old = pressedHandle;                    pressedHandle = i;                    if (pressedHandle != old)                        repaint();                    return;                }                x += 30;            }        }        int old = pressedHandle;        pressedHandle = -1;        if (old != -1)            repaint();    }    void mouseReleaseEvent(QMouseEvent *e) {        pressed = false;        if (pressedHandle == -1)            return;        QObjectList childList = children();        if (childList.isEmpty())            return;        if (e->button() == Qt::LeftButton) {            if (e->y() >= 0 && e->y() <= height()) {                QObject *o = childList.at(pressedHandle);                Q3DockWindow *dw = qobject_cast<Q3DockWindow*>(o);                if (dw) {                    dw->show();                    dw->dock();                }            }        }        pressedHandle = -1;        repaint();    }    bool eventFilter(QObject *o, QEvent *e) {        if (o == this || !o->isWidgetType())            return QWidget::eventFilter(o, e);        if (e->type() == QEvent::HideToParent ||             e->type() == QEvent::ShowToParent)            updateState();        return QWidget::eventFilter(o, e);    }    void updateState() {        bool visible = true;        QObjectList childList = children();        if (childList.isEmpty())            return;        for (int i = 0; i < childList.size(); ++i) {            QObject *o = childList.at(i);            Q3DockWindow *dw = qobject_cast<Q3DockWindow*>(o);            if (!dw)                continue;            if (dw->isHidden()) {                visible = false;                continue;            }            if (!dw->isVisible())                continue;            visible = true;            break;        }        if (visible)            show();        else            hide();        win->triggerLayout(false);        update();    }    void childEvent(QChildEvent *e) {        QWidget::childEvent(e);        if (e->type() == QEvent::ChildInserted)            e->child()->installEventFilter(this);        else            e->child()->removeEventFilter(this);        updateState();    }private:    Q3MainWindow *win;    int pressedHandle;    bool pressed;#if 0    QHideToolTip *tip;    friend class QHideToolTip;#endif};#if 0void QHideToolTip::maybeTip(const QPoint &pos){    if (!parentWidget())        return;    QHideDock *dock = (QHideDock*)parentWidget();    QObjectList dchilds = dock->children();    if (dchilds.isEmpty())        return;    int x = 0;    for (int i = 0; i < dchilds.size(); ++i) {        QObject *o = dchilds.at(i);        Q3DockWindow *dw = qobject_cast<Q3DockWindow*>(o);        if (!dw || !dw->isVisible())            continue;        if (pos.x() >= x && pos.x() <= x + 30) {            Q3DockWindow *dw = (Q3DockWindow*)o;            if (!dw->windowTitle().isEmpty())                tip(QRect(x, 0, 30, dock->height()), dw->windowTitle());            return;        }        x += 30;    }}#endif/*!    \class Q3MainWindow    \brief The Q3MainWindow class provides a main application window,    with a menu bar, dock windows (e.g. for toolbars), and a status    bar.

⌨️ 快捷键说明

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