Qt去除标题实现可以移动

#include <QtGui>
 
class TitleBar : public QWidget
{
    Q_OBJECT
public:
    TitleBar(QWidget *parent)
    {
        // 不继承父组件的背景色
        setAutoFillBackground(true);
        // 使用 Highlight 作为背景色
        setBackgroundRole(QPalette::Highlight);
 
        minimize = new QToolButton(this);
        maximize = new QToolButton(this);
        close= new QToolButton(this);
 
        // 设置按钮图像的样式
        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()
    {
        mouseDown = false;
        setFrameShape(Panel);
 
        // 设置无边框窗口
        // 这会导致该窗口无法改变大小或移动
        setWindowFlags(Qt::FramelessWindowHint);
        setMouseTracking(true);
 
        titleBar = new TitleBar(this);
 
        content = new QWidget(this);
 
        QVBoxLayout *vbox = new QVBoxLayout(this);
        vbox->addWidget(titleBar);
        vbox->setMargin(0);
        vbox->setSpacing(0);
 
        QVBoxLayout *layout = new QVBoxLayout;
        layout->addWidget(content);
        layout->setMargin(5);
        layout->setSpacing(0);
        vbox->addLayout(layout);
    }
 
    // 通过 getter 允许外界访问 frame 的 content 区域
    // 其它子组件应该添加到这里
    QWidget *contentWidget() const { return content; }
 
    TitleBar *titleBar() const { return titleBar; }
 
    void mousePressEvent(QMouseEvent *e)
    {
        oldPos = e->pos();
        mouseDown = e->button() == Qt::LeftButton;
    }
 
    void mouseMoveEvent(QMouseEvent *e)
    {
        int x = e->x();
        int y = e->y();
 
        if (mouseDown) {
            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)
    {
        mouseDown = false;
    }
 
private:
    TitleBar *titleBar;
    QWidget *content;
    QPoint oldPos;
    bool mouseDown;
    bool left, right, bottom;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值