Qt自定義按鈕及不同狀態(tài)下圖片的切換-創(chuàng)新互聯(lián)

    好久沒(méi)有使用Qt了,最近在做窗體時(shí)做了一個(gè)自定義的鈕銨,剛開始是想通過(guò)修改其MASK和ICON的
方式來(lái)實(shí)現(xiàn)。確發(fā)現(xiàn)效果總是不太如意,如是干脆自已定義了一個(gè)XPushButton。也將其實(shí)現(xiàn)方式記錄發(fā)
布出來(lái)。以方便日后自已使用和給有相應(yīng)問(wèn)題的朋友一個(gè)小小的提示。
    為了實(shí)現(xiàn)任意形狀的窗體和保留QPushButton的特性,繼承QPushButton創(chuàng)建一個(gè)子類。

class QtXPushButton : public QPushButton
{
    Q_OBJECT

public:
    QtXPushButton(QString strImagePath, QWidget *parent = NULL);
    ~QtXPushButton();
}

   為了方便描述按鈕正常、鼠標(biāo)滑動(dòng)、選取狀態(tài)、禁止點(diǎn)擊狀態(tài)定義一個(gè)狀態(tài)枚舉。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、稷山網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、稷山網(wǎng)絡(luò)營(yíng)銷、稷山企業(yè)策劃、稷山品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供稷山建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

//按鈕狀態(tài)
enum XBUTTONSTATE
{
    NORMAL = 0X01,//正常狀態(tài)
    HOVER = 0X02,//鼠標(biāo)滑過(guò)狀態(tài)
    SELECTED = 0X04,//選中狀態(tài)
    DISABLE = 0X08//禁止點(diǎn)擊狀態(tài)
};

為了方便設(shè)置個(gè)程狀態(tài)的圖標(biāo),添加狀態(tài)圖標(biāo)設(shè)置接口,并設(shè)置一個(gè)標(biāo)識(shí)表明設(shè)置了哪些狀態(tài)。

//設(shè)置正常圖標(biāo)
void SetNormalPixmap(QString strImagePath);
//設(shè)置鼠標(biāo)滑動(dòng)圖片
void SetHoverPixmap(QString strImagePath);
//設(shè)置選中狀態(tài)圖片
void SetSelectedPixmap(QString strImagePath);
//設(shè)置禁止點(diǎn)擊圖標(biāo)
void SetDisablePixmap(QString strImagePath);
//設(shè)置按鈕當(dāng)前狀態(tài)

void SetBtnState(XBUTTONSTATE state);
//設(shè)置圖片大小
 void SetSize(QSize sz);

   至此一個(gè)具有設(shè)置正常、鼠標(biāo)滑動(dòng)、選中、禁止點(diǎn)擊功能的按鈕的接口就定義好了。這個(gè)子類的最終定義如下。

#pragma once

#include <QPushButton>
#include <QString>
#include <QWidget>
#include <QPixmap>

//按鈕狀態(tài)
enum XBUTTONSTATE
{
    NORMAL = 0X01,//正常狀態(tài)
    HOVER = 0X02,//鼠標(biāo)滑過(guò)狀態(tài)
    SELECTED = 0X04,//選中狀態(tài)
    DISABLE = 0X08//禁止點(diǎn)擊狀態(tài)
};

class QtXPushButton : public QPushButton
{
    Q_OBJECT

public:
    QtXPushButton(QString strImagePath, QWidget *parent = NULL);
    ~QtXPushButton();

    //設(shè)置正常圖標(biāo)
    void SetNormalPixmap(QString strImagePath);
    //設(shè)置鼠標(biāo)滑動(dòng)圖片
    void SetHoverPixmap(QString strImagePath);
    //設(shè)置選中狀態(tài)圖片
    void SetSelectedPixmap(QString strImagePath);
    //設(shè)置禁止點(diǎn)擊圖標(biāo)
    void SetDisablePixmap(QString strImagePath);
    //設(shè)置按鈕當(dāng)前狀態(tài)
    void SetBtnState(XBUTTONSTATE state);
    //設(shè)置圖片大小
    void SetSize(QSize sz);

protected:
    virtual void paintEvent(QPaintEvent *event);
    virtual void enterEvent(QEvent *event);
    virtual void leaveEvent(QEvent *event);

private:
    QtXPushButton(const QtXPushButton& btn);
    QtXPushButton& operator=(const QtXPushButton& btn);

private:
    QPixmap m_NormalPix;//正常圖標(biāo)
    QPixmap m_HoverPix;//鼠標(biāo)滑動(dòng)圖標(biāo)
    QPixmap m_SelectedPix;//選中狀態(tài)圖標(biāo)
    QPixmap m_DisablePix;//禁止點(diǎn)擊圖標(biāo)
    int m_iMask;//包含1則啟動(dòng)正常圖標(biāo),包含2啟用滑動(dòng)圖標(biāo),包含4啟用選中狀態(tài)圖標(biāo),包含8啟用禁止點(diǎn)擊圖標(biāo),默認(rèn)標(biāo)為1.
    XBUTTONSTATE m_curState;//當(dāng)前狀態(tài)
    XBUTTONSTATE m_lastState;//上一次狀態(tài)
};

   接下來(lái)實(shí)現(xiàn)其相應(yīng)功能。實(shí)現(xiàn)一個(gè)不規(guī)則的窗體大至需要做兩個(gè)動(dòng)作。

(1)通過(guò)REGON或者M(jìn)ASK確定其邊框,在構(gòu)造函數(shù)中添加如下代碼:

QtXPushButton::QtXPushButton(QString strImagePath, QWidget *parent)
    :QPushButton(parent)
{
    m_NormalPix.load(strImagePath);
    resize(m_NormalPix.size());
    setMask(QBitmap(m_NormalPix.mask()));
    m_iMask = XBUTTONSTATE::NORMAL;
    m_curState = XBUTTONSTATE::NORMAL;
    m_lastState = XBUTTONSTATE::NORMAL;
}

(2)在窗體繪制時(shí)將圖片繪制于其上,重載其繪圖函數(shù),添加如下代碼。

void QtXPushButton::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawPixmap(0, 0, m_NormalPix);
}

       上面兩個(gè)步驟可以實(shí)現(xiàn)一個(gè)任意規(guī)則的自定義窗體,其下來(lái)實(shí)現(xiàn)其在不同狀態(tài)下的圖片的切換。

設(shè)置不同狀態(tài)的圖片,這里以鼠標(biāo)滑動(dòng)方式為例。由于鼠標(biāo)進(jìn)入窗體區(qū)域后就應(yīng)當(dāng)設(shè)置為鼠標(biāo)滑動(dòng)狀態(tài),重載窗體的鼠標(biāo)進(jìn)入和鼠標(biāo)離開區(qū)域來(lái)監(jiān)測(cè)其狀態(tài)。

//設(shè)置鼠標(biāo)滑動(dòng)圖片
void QtXPushButton::SetHoverPixmap(QString strImagePath)
{
    m_HoverPix.load(strImagePath);
    m_iMask |= XBUTTONSTATE::HOVER;
}

//重載鼠標(biāo)進(jìn)入和移出事件

void QtXPushButton::enterEvent(QEvent *event)
{
    SetBtnState(XBUTTONSTATE::HOVER);
    QPushButton::enterEvent(event);
    update();
}

void QtXPushButton::leaveEvent(QEvent *event)
{
    m_curState = m_lastState;
    QPushButton::leaveEvent(event);
    update();
}

//用指定圖片重繪窗體

void QtXPushButton::paintEvent(QPaintEvent *event)
{
    QPixmap drawPix;

    if (m_curState == XBUTTONSTATE::NORMAL)
    {
        drawPix = m_NormalPix;
    }
    else if (m_curState == XBUTTONSTATE::HOVER)
    {
        int iValue = m_iMask&XBUTTONSTATE::HOVER;
        drawPix = (0 == iValue) ? m_NormalPix : m_HoverPix;
    }
    else if (m_curState == XBUTTONSTATE::SELECTED)
    {
        int iValue = m_iMask&XBUTTONSTATE::SELECTED;
        drawPix = (0 == iValue) ? m_NormalPix : m_SelectedPix;
    }
    else if (m_curState == XBUTTONSTATE::DISABLE)
    {
        int iValue = m_iMask&XBUTTONSTATE::DISABLE;
        drawPix = (0 == iValue) ? m_NormalPix : m_DisablePix;
    }

    QPainter painter(this);
    painter.drawPixmap(0, 0, drawPix);
}

       經(jīng)過(guò)上述過(guò)程鼠標(biāo)進(jìn)入按鈕區(qū)域,按鈕會(huì)顯示HOVER圖片。鼠標(biāo)移出按鈕區(qū)域,按鈕會(huì)顯示鼠標(biāo)進(jìn)入之前的狀態(tài)。

程序完全源碼如下:

#include "QtXPushButton.h"
#include <QBitmap>
#include <QPainter>

QtXPushButton::QtXPushButton(QString strImagePath, QWidget *parent)
    :QPushButton(parent)
{
    m_NormalPix.load(strImagePath);
    resize(m_NormalPix.size());
    setMask(QBitmap(m_NormalPix.mask()));
    m_iMask = XBUTTONSTATE::NORMAL;
    m_curState = XBUTTONSTATE::NORMAL;
    m_lastState = XBUTTONSTATE::NORMAL;
}

QtXPushButton::~QtXPushButton()
{
}

//設(shè)置正常圖標(biāo)
void QtXPushButton::SetNormalPixmap(QString strImagePath)
{
    m_NormalPix.load(strImagePath);
    m_iMask |= XBUTTONSTATE::NORMAL;
}

//設(shè)置鼠標(biāo)滑動(dòng)圖片
void QtXPushButton::SetHoverPixmap(QString strImagePath)
{
    m_HoverPix.load(strImagePath);
    m_iMask |= XBUTTONSTATE::HOVER;
}

//設(shè)置選中狀態(tài)圖片
void QtXPushButton::SetSelectedPixmap(QString strImagePath)
{
    m_SelectedPix.load(strImagePath);
    m_iMask |= XBUTTONSTATE::SELECTED;
}

//設(shè)置禁止點(diǎn)擊圖標(biāo)
void QtXPushButton::SetDisablePixmap(QString strImagePath)
{
    m_DisablePix.load(strImagePath);
    m_iMask |= XBUTTONSTATE::DISABLE;
}

//設(shè)置按鈕當(dāng)前狀態(tài)
void QtXPushButton::SetBtnState(XBUTTONSTATE state)
{
    m_lastState = m_curState;
    m_curState = state;
}

//設(shè)置圖片大小
void QtXPushButton::SetSize(QSize sz)
{
    m_NormalPix = m_NormalPix.scaled(sz);
    int iValue = m_iMask&XBUTTONSTATE::HOVER;

    if (iValue != 0)
    {
        m_HoverPix = m_HoverPix.scaled(sz);
    }

    iValue = m_iMask&XBUTTONSTATE::SELECTED;

    if (iValue != 0)
    {
        m_SelectedPix = m_SelectedPix.scaled(sz);
    }

    iValue = m_iMask&XBUTTONSTATE::DISABLE;

    if (iValue != 0)
    {
        m_DisablePix = m_DisablePix.scaled(sz);
    }
}

void QtXPushButton::paintEvent(QPaintEvent *event)
{
    QPixmap drawPix;

    if (m_curState == XBUTTONSTATE::NORMAL)
    {
        drawPix = m_NormalPix;
    }
    else if (m_curState == XBUTTONSTATE::HOVER)
    {
        int iValue = m_iMask&XBUTTONSTATE::HOVER;
        drawPix = (0 == iValue) ? m_NormalPix : m_HoverPix;
    }
    else if (m_curState == XBUTTONSTATE::SELECTED)
    {
        int iValue = m_iMask&XBUTTONSTATE::SELECTED;
        drawPix = (0 == iValue) ? m_NormalPix : m_SelectedPix;
    }
    else if (m_curState == XBUTTONSTATE::DISABLE)
    {
        int iValue = m_iMask&XBUTTONSTATE::DISABLE;
        drawPix = (0 == iValue) ? m_NormalPix : m_DisablePix;
    }

    QPainter painter(this);
    painter.drawPixmap(0, 0, drawPix);
}

void QtXPushButton::enterEvent(QEvent *event)
{
    SetBtnState(XBUTTONSTATE::HOVER);
    QPushButton::enterEvent(event);
    update();
}

void QtXPushButton::leaveEvent(QEvent *event)
{
    m_curState = m_lastState;
    QPushButton::leaveEvent(event);
    update();
}

網(wǎng)站標(biāo)題:Qt自定義按鈕及不同狀態(tài)下圖片的切換-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://muchs.cn/article20/dejsjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、定制開發(fā)、網(wǎng)站營(yíng)銷、做網(wǎng)站網(wǎng)站策劃、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)