国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

QT4.7自定義標題欄簡單實現

2019-11-08 03:26:56
字體:
來源:轉載
供稿:網友

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_OBJECTpublic:    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;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 商都县| 界首市| 永吉县| 资兴市| 堆龙德庆县| 甘谷县| 金平| 竹溪县| 新竹市| 成武县| 甘孜县| 前郭尔| 闵行区| 项城市| 和田市| 清水河县| 大洼县| 台州市| 黔南| 孟村| 凤庆县| 林州市| 怀化市| 江源县| 井研县| 轮台县| 博爱县| 平乐县| 宁安市| 长阳| 麻栗坡县| 许昌县| 武威市| 凤翔县| 安顺市| 盐源县| 丰宁| 巴林左旗| 会泽县| 南溪县| 镇雄县|