• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            The titlebar belongs to the OS and we don't have control over that one. You can create your own titlebar, but note that this requires some work. In order to create your own titlebar then make a QWidget subclass that contains three toolbuttons that handle the close, minimize and maximize events in addition to the moving of the window. Then make a QFrame subclass which does not have a titlebar provided via the window system. This is done by setting theQt::FramelessWindowHint window flag, however this will make it impossible to resize or move the window via the window system. What can be done is you can add your custom titlbar as a private member to the frame and add the it first to the frame's vertical layout. The frame also needs a content widget which allows widgets to be added to it. Finally the QFrame subclass needs to reimplement the mouse events to handle the resizing and moving of the window. The example below demonstrates how this can be achieved.

            #include <QApplication>

            #include <QtGui>

            #include <QLayout>

            #include <QStyle>


            class TitleBar : public QWidget {

                Q_OBJECT

            public:

                TitleBar(QWidget *parent) {

                    // Don't let this widget inherit the parent's backround color

                    setAutoFillBackground(true);

                    // Use a brush with a Highlight color role to render the background 

                    setBackgroundRole(QPalette::Highlight);

                    

                    minimize = new QToolButton(this);

                    maximize = new QToolButton(this);

                    close= new QToolButton(this);

                    

                    // Use the style to set the button pixmaps

                    QPixmap pix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton);

                    close->setIcon(pix);

                    

                    maxPix = style()->standardPixmap(QStyle::SP_TitleBarMaxButton);

                    maximize->setIcon(maxPix);

                    

                    pix = style()->standardPixmap(QStyle::SP_TitleBarMinButton);

                    minimize->setIcon(pix);

                    

                    restorePix = style()->standardPixmap(QStyle::SP_TitleBarNormalButton);

                    

                    minimize->setMinimumHeight(20);

                    close->setMinimumHeight(20);

                    maximize->setMinimumHeight(20);

                    

                    

                    QLabel *label = new QLabel(this);

                    label->setText("Window Title");

                    parent->setWindowTitle("Window Title");

                    

                    QHBoxLayout *hbox = new QHBoxLayout(this);

                    

                    hbox->addWidget(label);

                    hbox->addWidget(minimize);

                    hbox->addWidget(maximize);

                    hbox->addWidget(close);

                    

                    hbox->insertStretch(1, 500);

                    hbox->setSpacing(0);

                    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

                    

                    maxNormal = false;

                    

                    connect(close, SIGNAL( clicked() ), parent, SLOT(close() ) );

                    connect(minimize, SIGNAL( clicked() ), this, SLOT(showSmall() ) );

                    connect(maximize, SIGNAL( clicked() ), this, SLOT(showMaxRestore() ) );

                }

                

            public slots:

                void showSmall() {

                    parentWidget()->showMinimized();

                }

                

                void showMaxRestore() {

                    if (maxNormal) {

                        parentWidget()->showNormal();

                        maxNormal = !maxNormal;

                        maximize->setIcon(maxPix);

                    } else {

                        parentWidget()->showMaximized();

                        maxNormal = !maxNormal;

                        maximize->setIcon(restorePix);

                    }

                }

            protected:

                void mousePressEvent(QMouseEvent *me) {

                    startPos = me->globalPos();

                    clickPos = mapToParent(me->pos());

                }

                void mouseMoveEvent(QMouseEvent *me) {

                    if (maxNormal)

                        return;

                    parentWidget()->move(me->globalPos() - clickPos);

                }

                

            private:

                QToolButton *minimize;

                QToolButton *maximize;

                QToolButton *close;

                QPixmap restorePix, maxPix;

                bool maxNormal;

                QPoint startPos;

                QPoint clickPos;

            };


            class Frame : public QFrame {

            public:

                

                Frame() {

                    m_mouse_down = false;

                    setFrameShape(Panel);

                    

                    // Make this a borderless window which can't

                    // be resized or moved via the window system

                    setWindowFlags(Qt::FramelessWindowHint);

                    setMouseTracking(true);

                    

                    m_titleBar = new TitleBar(this);

                    

                    m_content = new QWidget(this);

                    

                    QVBoxLayout *vbox = new QVBoxLayout(this);

                    vbox->addWidget(m_titleBar);

                    vbox->setMargin(0);

                    vbox->setSpacing(0);

                    

                    QVBoxLayout *layout = new QVBoxLayout(this);

                    layout->addWidget(m_content);

                    layout->setMargin(5);

                    layout->setSpacing(0);

                    vbox->addLayout(layout);

                }

                

                // Allows you to access the content area of the frame

                // where widgets and layouts can be added

                QWidget *contentWidget() const { return m_content; }

                

                TitleBar *titleBar() const { return m_titleBar; }

                

                void mousePressEvent(QMouseEvent *e) {

                    m_old_pos = e->pos();

                    m_mouse_down = e->button() == Qt::LeftButton;

                }

                

                void mouseMoveEvent(QMouseEvent *e) {

                    int x = e->x();

                    int y = e->y();

                    

                    if (m_mouse_down) {

                        int dx = x - m_old_pos.x();

                        int dy = y - m_old_pos.y();

                        

                        QRect g = geometry();

                        

                        if (left)

                            g.setLeft(g.left() + dx);

                        if (right)

                            g.setRight(g.right() + dx);

                        if (bottom)

                            g.setBottom(g.bottom() + dy);

                        

                        setGeometry(g);

                        

                        m_old_pos = QPoint(!left ? e->x() : m_old_pos.x(), e->y());

                    } else {

                        QRect r = rect();

                        left = qAbs(x - r.left()) <= 5;

                        right = qAbs(x - r.right()) <= 5;

                        bottom = qAbs(y - r.bottom()) <= 5;

                        bool hor = left | right;

                        

                        if (hor && bottom) {

                            if (left)

                                setCursor(Qt::SizeBDiagCursor);

                            else 

                                setCursor(Qt::SizeFDiagCursor);

                        } else if (hor) {

                            setCursor(Qt::SizeHorCursor);

                        } else if (bottom) {

                            setCursor(Qt::SizeVerCursor);

                        } else {

                            setCursor(Qt::ArrowCursor);

                        }

                    }

                }

                

                void mouseReleaseEvent(QMouseEvent *e) {

                    m_mouse_down = false;

                }

                

            private:

                TitleBar *m_titleBar;

                QWidget *m_content;

                QPoint m_old_pos;

                bool m_mouse_down;

                bool left, right, bottom;

            };



            #include "main.moc"


            int main(int argc, char **argv) {

                QApplication app(argc, argv);

                

                Frame box;

                box.move(0,0);

                

                QVBoxLayout *l = new QVBoxLayout(box.contentWidget());

                l->setMargin(0);

                QTextEdit *edit = new QTextEdit(box.contentWidget());

                l->addWidget(edit);

                

                box.show();

                return app.exec();    

            }


            From: http://qt.nokia.com/developer/faqs/535

            posted on 2009-11-07 17:37 逛奔的蝸牛 閱讀(1866) 評論(0)  編輯 收藏 引用 所屬分類: Qt
            久久精品无码专区免费| 国内精品久久久久影院日本 | 国产香蕉久久精品综合网| 婷婷国产天堂久久综合五月| 亚洲av伊人久久综合密臀性色| 久久99精品国产99久久| 久久久久久久久波多野高潮| 久久99久久99小草精品免视看| 亚洲精品久久久www| 99久久婷婷国产一区二区| 亚洲精品乱码久久久久久久久久久久 | 久久久黄片| 青青草原综合久久| 亚洲精品乱码久久久久66| 国产视频久久| 久久噜噜电影你懂的| 久久综合香蕉国产蜜臀AV| 久久亚洲精品国产精品婷婷| 色综合久久最新中文字幕| 久久精品国产第一区二区三区| 伊人色综合久久天天人守人婷| 9191精品国产免费久久| 国产成人精品久久一区二区三区 | 久久精品视屏| 亚洲午夜久久影院| 国产精品久久久久国产A级| 亚洲AV无码久久| 久久久久se色偷偷亚洲精品av| 一本大道久久东京热无码AV| 精品无码久久久久久久动漫| 国产成人AV综合久久| 99久久国产亚洲高清观看2024| 国内精品久久九九国产精品| AAA级久久久精品无码片| 久久精品天天中文字幕人妻| 久久99国产综合精品免费| 丁香五月网久久综合| 久久久国产精品福利免费| 国产视频久久| 伊人久久五月天| 色8久久人人97超碰香蕉987|