QT4.7自定义标题栏简单实现

QT4.7自定标题栏简单实现:功能尚未完成,但提供了编写模版。实现:窗口拖动、标题长按。

1、定义

#ifndef QTITLEBAR_H
#define QTITLEBAR_H

#include <QWidget>

class QHBoxLayout;
class QLabel;
class QPalette;
class QPixmap;
class QBrush;
class QPoiint;
class QIcon;
class QCursor;
class QMouseEvent;

class QTitleBar : public QWidget
{
    Q_OBJECT
public:
    explicit QTitleBar(QWidget *parent = 0);
    ~QTitleBar();
    void setSize(QSize size);
    void setIcon(QString sFile,QSize iconSize);
    void setBackground(QString sFile);
    void setText(QString sText);
    void setTitle(QString sTitle);
    bool isEnable();
    //标题栏自定功能,可继续完善

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void enterEvent(QEvent *event);
    void leaveEvent(QEvent *event);

private:
    void initControl();

signals:
    void longPressSignal(QPoint point);

private slots:
    void onTimeOut();

private:
    bool m_bEnable;
    //响应拖动
    QHBoxLayout *m_pLayout;
    QLabel *m_pIcon;//图标
    QLabel *m_pText;//标题
    bool m_bMousePressed;
    QPoint m_oMousePressPos;
    QPoint m_oMouseReleasePos;
    QPoint m_oMouseMovePos;
    //响应长按
    QTimer *m_pTimer;
    unsigned m_uTimerCntSet;
    unsigned m_uTimerCnt;

};

#endif // QTITLEBAR_H

 2、实现 

#include <QHBoxLayout>
#include <QLabel>
#include <QPalette>
#include <QPixmap>
#include <QBrush>
#include <QPoint>
#include <QIcon>
#include <QCursor>
#include <QMouseEvent>
#include <QTimer>
#include "QTitleBar.h"
#include "QHelper.h"

QTitleBar::QTitleBar(QWidget *parent) :
    QWidget(parent)
{
    m_bEnable = true;
    m_pLayout = NULL;
    m_pIcon = NULL;
    m_pText = NULL;
    m_bMousePressed = false;
    m_pTimer = NULL;
    m_uTimerCntSet = 1;
    m_uTimerCnt = 0;

    this->initControl();
}

void QTitleBar::initControl()
{
    m_pLayout = new QHBoxLayout(this);
    m_pIcon = new QLabel(this);
    m_pText = new QLabel(this);
    m_pTimer = new QTimer(this);
    if(NULL == m_pLayout || NULL == m_pIcon
       || NULL == m_pText || NULL == m_pTimer)
    {
        m_bEnable = false;
    }
    else
    {
        m_bEnable = true;
        m_pLayout->addWidget(m_pIcon);
        m_pLayout->addWidget(m_pText);
        m_pLayout->setContentsMargins(0,0,0,0);
        m_pLayout->setStretchFactor(m_pIcon,1);
        m_pLayout->setStretchFactor(m_pText,10);
        m_pLayout->setSpacing(0);

        m_pIcon->setVisible(false);
        m_pText->setVisible(false);

        connect(m_pTimer,SIGNAL(timeout()),this,SLOT(onTimeOut()));
    }
}

QTitleBar::~QTitleBar()
{
    QHelper::deleteP(m_pLayout);
    QHelper::deleteP(m_pIcon);
    QHelper::deleteP(m_pText);
    QHelper::deleteP(m_pTimer);
}

void QTitleBar::setSize(QSize size)
{
    this->setFixedSize(size);
}

void QTitleBar::setIcon(QString sFile, QSize iconSize)
{
    if(!isEnable())
        return ;
    QPixmap pixmap(sFile);
    m_pIcon->setPixmap(pixmap.scaled(iconSize));
    if(NULL != this->parentWidget())
    {
        this->parentWidget()->setWindowIcon(QIcon(sFile));
    }
    m_pIcon->setVisible(true);
}

void QTitleBar::setBackground(QString sFile)
{
    this->setAutoFillBackground(true);
    QPalette palette(this->palette());
    QPixmap pixmap(sFile);
    palette.setBrush(QPalette::Window,QBrush(pixmap));
    this->setPalette(palette);
}

void QTitleBar::setText(QString sText)
{
    if(!isEnable())
        return ;
    m_pText->setText(sText);
    m_pText->setVisible(true);
}

void QTitleBar::setTitle(QString sTitle)
{
    if(NULL != this->parentWidget())
    {
        this->parentWidget()->setWindowTitle(sTitle);
    }
}

void QTitleBar::mousePressEvent(QMouseEvent *event)
{
    if(NULL == event || !isEnable())
        return ;
    switch(event->button())
    {
    case Qt::LeftButton:
        {
            m_bMousePressed = true;
            //响应拖动
            m_oMousePressPos = event->globalPos();//使用全局坐标
            m_oMouseMovePos = event->globalPos();//原始坐标,判断鼠标是否有移动
            //响应长按
            if(!m_pTimer->isActive())
            {
                m_uTimerCnt = 0;
                m_pTimer->start(1000);
            }
        }
        break;
    case Qt::RightButton:
        break;
    default:
        break;
    }

    return QWidget::mousePressEvent(event);
}

void QTitleBar::mouseReleaseEvent(QMouseEvent *event)
{
    if(NULL == event || !isEnable())
        return ;
    switch(event->button())
    {
    case Qt::LeftButton:
        {
            m_bMousePressed = false;
            //响应长按
            if(m_pTimer->isActive())
            {
                m_uTimerCnt = 0;
                m_pTimer->stop();
            }
        }
        break;
    case Qt::RightButton:
        break;
    default:
        break;
    }
    return QWidget::mouseReleaseEvent(event);
}

void QTitleBar::mouseMoveEvent(QMouseEvent *event)
{
    if(NULL == event || !m_bMousePressed || !isEnable())
        return ;
    //响应拖动
    //move event产生的button是nobutton,所以不用判断button类型
    QPoint point = event->globalPos();//新位置
    int iX = point.x()-m_oMouseMovePos.x();//x位移
    int iY = point.y()-m_oMouseMovePos.y();//y位移
    m_oMouseMovePos = event->globalPos();//更新鼠标当前位置
    if(NULL != this->parentWidget())
    {
        QPoint win = this->parentWidget()->pos();
        int x = win.x()+iX;//窗口x应该位移
        int y = win.y()+iY;//窗口y应该位移
        this->parentWidget()->move(x,y);
    }
    //响应长按
    if(m_pTimer->isActive())
    {
        m_uTimerCnt = 0;
        m_pTimer->stop();
    }

    return QWidget::mouseMoveEvent(event);
}

void QTitleBar::enterEvent(QEvent *event)
{
    if(NULL == event || !isEnable())
        return ;
    this->setCursor(Qt::OpenHandCursor);
}

void QTitleBar::leaveEvent(QEvent *event)
{
    if(NULL == event || !isEnable())
        return ;
    this->setCursor(Qt::ArrowCursor);
}

void QTitleBar::onTimeOut()
{
    //响应鼠标长按1秒事件
    if(!m_bMousePressed || (++m_uTimerCnt) < m_uTimerCntSet || !isEnable())
        return ;
    m_uTimerCnt = 0;
    m_pTimer->stop();
    //当外部窗口响应长按信号时若使用模态对话框,则会阻断mouseReleaseEvent,所以此处直接false
    m_bMousePressed = false;
    emit longPressSignal(m_oMouseMovePos);
}

bool QTitleBar::isEnable()
{
    return m_bEnable;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值