您现在的位置是:首页 > 技术文章网站首页技术文章

[Qt]自定义图标按钮02

  • WangYe
  • 2020-11-24 14:09:27
  • 253 次阅读
自定义图标按钮

效果图:

图片.png


stdafx.h

#include <QtWidgets>
#include <QtGui>

using namespace std;


Custom_control.h (主界面)

#pragma once

#include "stdafx.h"
#include <QtWidgets/QMainWindow>

#include "CIconButtonPix.h"

class Custom_control : public QWidget
{
    Q_OBJECT

public:
    Custom_control(QWidget *parent = Q_NULLPTR);
    ~Custom_control();

protected:
    void InitUi();

private slots:
    void slot_test03();

private:
    QVBoxLayout* m_pThisLayout; //创建底部布局
    QWidget* m_pThisWidget; //创建底部控件

    CIconButtonPix* m_TestButton03; //创建自定义按钮03
};


Custom_control.cpp (主界面)

#include "Custom_control.h"

Custom_control::Custom_control(QWidget *parent)
    : QWidget(parent)
{
    InitUi();
}

Custom_control::~Custom_control()
{
}

void Custom_control::InitUi()
{
    setMinimumSize(500,500);

    m_pThisLayout = new QVBoxLayout(this);  //创建底部布局
    //m_pThisLayout->setContentsMargins(0, 0, 0, 0);    //设置左侧、顶部、右侧和底部边距
    //m_pThisLayout->setSpacing(5);    //设置各个控件之间的上下间距
    //m_pThisLayout->setMargin(0);    //设置控件与窗体左右边距
    //m_pThisLayout->addStretch(0);    //增加伸缩量

    m_pThisWidget = new QWidget(this);  //创建底部控件
    m_pThisWidget->setContentsMargins(0, 0, 0, 0);  //设置上下左右间距
    m_pThisLayout->addWidget(m_pThisWidget);    //添加底部控件到布局

    m_TestButton03 = new CIconButtonPix(m_pThisWidget); //创建自定义按钮
    m_TestButton03->setText("Test03");  //设置文本
    m_TestButton03->setIconPath(":/Img/resources/Img/stars_24px.png");  //设置图标
    m_TestButton03->setContentsMargins(0, 0, 0, 0);
    m_TestButton03->setFixedSize(79,24);
    m_TestButton03->setBCenter(true);   //是否居中
    //m_TestButton03->setStyleSheet("border:2px solid red;");
    connect(m_TestButton03, SIGNAL(clicked()), this, SLOT(slot_test03()));
    m_pThisLayout->addWidget(m_TestButton03,0, Qt::AlignHCenter);

    m_pThisLayout->addStretch(1);   //添加拉伸
}

void Custom_control::slot_test03()  //按钮02点击处理
{
    qDebug() << "Hello HHHH~";
}


CIconButtonPix.h (自定义按钮)

/**
* @file CIconButtonPix.h
* @brief
*
* detail 可以设置图标的btn
*
* @version 1.0
* @author lxs
* @data [2016-8-2]
*/
#ifndef CICONBUTTONPIX_H
#define CICONBUTTONPIX_H

#include <QWidget>
#include <QLabel>
#include <QColor>
#include <QFont>

using namespace std;

class CIconButtonPix : public QLabel
{
    Q_OBJECT

public:
    CIconButtonPix(QWidget* parent = 0);
    ~CIconButtonPix();

public:
    /// 设置图标路径
    void setIconPath(string str);
    void setHoverIconPath(string str);
    /// 设置背景图片
    void setBackgroundPixMap(string str);
    /// 设置整体布局边距
    void setContentsMargins(int left, int top, int right, int bottom);
    /// 设置图标文字距离
    void setSpacing(int space);
    /// 设置图标文字是否居中
    void setBCenter(bool bCenter = true);
    /// 设置文字颜色
    void setTextColor(QColor color = QColor(37, 156, 243));
    /// 设置选中的文字的颜色
    void setTextHoverColor(QColor colorHover);
    /// 设置字体
    void setFont(QFont font);
    /// 设置icon的位置 在前面还是后面
    void setIconPos(bool bFront = true);
    /// 设置背景颜色
    void setBackgroundColor(QColor color = QColor(255, 255, 255));
    /// 设置距底部高度
    void setHightToBottom(int nBottom);
    // 设置文本
    void setText(const QString& Str);

protected:
    /// 鼠标进入事件
    void enterEvent(QEvent* ev);
    /// 鼠标离开事件
    void leaveEvent(QEvent* ev);
    /// 事件过滤器
    bool eventFilter(QObject* obj, QEvent* ev);
    /// 绘制函数
    void paintEvent(QPaintEvent* ev);

signals:
    /// 点击事件
    void clicked();
    void signal_clicked(string csId);
private:
    string m_icon_path;///< 图标路径
    string m_icon_path_hover;
    string m_bgPixmap_path; //背景图片
    QString m_str_text;///< btn显示文字
    int m_nLeft;///< 左边距
    int m_nTop;///< 上边距
    int m_nRight;///< 右边距
    int m_nBottom;///< 下边距
    int m_nSpace;///< 图标文字距离
    bool m_bCenter;///< 图标文字是否居中
    bool m_bNeedHoverColor; //是否需要hover颜色
    QColor m_text_color;///< 文字颜色
    QColor m_text_color_hover; //文字hover颜色
    QColor m_background_color;///< 背景颜色
    QPixmap* m_pPixmap;///< icon
    QPixmap* m_pixmapHover; /// icon hover
    QPixmap* m_pPixBackground; ///背景图片
    QFont m_font;///< 字体
    bool m_bIconPosFront;///< icon的位置是否在前面
    bool m_bHover; //是否hover状态
    int m_nToBottom; // 距底部距离
    bool m_bToBottom; // 是否设置了距离底部距离
};

#endif // CICONBUTTONPIX_H


CIconButtonPix.cpp (自定义按钮)

#include "CIconButtonPix.h"
#include <QEvent>
#include <QPainter>

#define TOCH(str) QString::fromLocal8Bit(str) //中文字符显示

CIconButtonPix::CIconButtonPix(QWidget* parent)
    : QLabel(parent)
{
    m_nLeft = 4;
    m_nTop = 4;
    m_nRight = 4;
    m_nBottom = 4;
    m_nSpace = 5;
    m_bCenter = true;
    m_bIconPosFront = true;
    m_bNeedHoverColor = false;
    m_bToBottom = false;
    m_text_color = QColor(105, 105, 105);
    m_bHover = false;
    m_pixmapHover = new QPixmap;
    m_pPixmap = NULL;
    m_pPixBackground = new QPixmap;

    m_str_text = this->text();

    m_pPixmap = new QPixmap;

    m_font.setPixelSize(12);
    m_font.setBold(false);
    m_font.setFamily(TOCH("SimSun"));

    this->installEventFilter(this);
}

CIconButtonPix::~CIconButtonPix()
{

}

void CIconButtonPix::setIconPath(string str)
{
    m_icon_path = str;
    if (m_pPixmap != NULL)
    {
        m_pPixmap->load(TOCH(m_icon_path.c_str()));
    }
}

void CIconButtonPix::setContentsMargins(int left, int top, int right, int bottom)
{
    m_nLeft = left;
    m_nTop = top;
    m_nRight = right;
    m_nBottom = bottom;

    m_bCenter = false;
}

void CIconButtonPix::setSpacing(int space)
{
    m_nSpace = space;
}

void CIconButtonPix::setBCenter(bool bCenter)
{
    m_bCenter = bCenter;
}

void CIconButtonPix::enterEvent(QEvent* ev)
{
    this->setCursor(Qt::PointingHandCursor);
    m_bHover = true;
    update();
    QLabel::enterEvent(ev);
}

void CIconButtonPix::leaveEvent(QEvent* ev)
{
    this->setCursor(Qt::ArrowCursor);
    m_bHover = false;
    update();
    QLabel::leaveEvent(ev);
}

bool CIconButtonPix::eventFilter(QObject* obj, QEvent* ev)
{
    if (obj == this)
    {
        if (ev->type() == QEvent::MouseButtonRelease)
        {
            if (this->isEnabled())
            {
                emit clicked();
                //emit signal_clicked(GetId());
            }
        }
    }
    return QLabel::eventFilter(obj, ev);
}

void CIconButtonPix::paintEvent(QPaintEvent* ev)
{
    QPainter dc(this);
    dc.setFont(m_font);
    if (NULL != m_pPixmap)
    {
        int nWidth = m_pPixmap->width() + m_nSpace + dc.fontMetrics().width(m_str_text) + 8;
        if (m_str_text.isEmpty())
        {
            nWidth = m_pPixmap->width();
            m_nSpace = 0;
        }
        this->setMinimumWidth(nWidth);
    }

    /// 背景色
    if (m_background_color.isValid())
    {
        dc.fillRect(rect(), m_background_color);
    }
    /// 背景图
    if (NULL != m_pPixBackground && !m_pPixBackground->isNull())
    {
        dc.fillRect(rect(), Qt::transparent);
        dc.drawPixmap(rect(), *m_pPixBackground);
    }
    QPixmap* pPixmap = NULL;
    if (m_bHover && m_bNeedHoverColor)
    {
        dc.setPen(m_text_color_hover);
        pPixmap = m_pixmapHover;
    }
    else
    {
        dc.setPen(m_text_color);
        pPixmap = m_pPixmap;
    }

    int x = 0;
    int y = 0;

    /// icon
    if (m_bCenter)
    {
        if (NULL != pPixmap)
        {
            if (m_bIconPosFront)
            {
                x = (rect().width() - pPixmap->width() - m_nSpace - dc.fontMetrics().width(m_str_text)) / 2;
                y = rect().height() / 2 - pPixmap->height() / 2;

                dc.drawPixmap(x, y, pPixmap->width(), pPixmap->height(), *pPixmap);
                x += pPixmap->width() + m_nSpace;
                y = rect().height() / 2 - m_font.pixelSize() / 2;
                if (pPixmap->height() % 2 == 1)
                {
                    y += 1;
                }
                dc.drawText(x, y, this->width() - x, m_font.pixelSize(), Qt::AlignLeft | Qt::AlignVCenter, m_str_text);
            }
            else
            {
                x = (rect().width() - pPixmap->width() - m_nSpace - dc.fontMetrics().width(m_str_text)) / 2;
                y = rect().height() / 2 - m_font.pixelSize() / 2;
                dc.drawText(x, 0, width() - x, height(), Qt::AlignLeft | Qt::AlignVCenter, m_str_text);

                x += dc.fontMetrics().width(m_str_text) + m_nSpace;
                y = rect().height() / 2 - pPixmap->height() / 2;
                dc.drawPixmap(x, y, pPixmap->width(), pPixmap->height(), *pPixmap);
            }
        }
        else
        {
            x = (rect().width() - dc.fontMetrics().width(m_str_text)) / 2;
            y = rect().height() / 2 - m_font.pixelSize() / 2;
            dc.drawText(x, y, dc.fontMetrics().width(m_str_text), m_font.pixelSize(), Qt::AlignLeft | Qt::AlignVCenter, m_str_text);
        }
    }
    else
    {
        if (NULL != m_pPixmap)
        {
            if (m_bIconPosFront)
            {
                if (m_bToBottom)
                {
                    x = m_nLeft;
                    y = rect().height() - m_nToBottom - m_pPixmap->height();
                    dc.drawPixmap(x, y, pPixmap->width(), m_pPixmap->height(), *pPixmap);

                    x = rect().width() - m_nRight - dc.fontMetrics().width(m_str_text);
                    if (pPixmap->height() % 2 == 1)
                    {
                        y += 1;
                    }
                    dc.drawText(x, y, width() - x, dc.fontMetrics().height(), Qt::AlignLeft | Qt::AlignBottom, m_str_text);
                }
                else
                {
                    x = m_nLeft;
                    y = (height() - m_pPixmap->height()) / 2;
                    dc.drawPixmap(x, y, pPixmap->width(), m_pPixmap->height(), *pPixmap);

                    x = rect().width() - m_nRight - dc.fontMetrics().width(m_str_text);
                    if (pPixmap->height() % 2 == 1)
                    {
                        y += 1;
                    }
                    dc.drawText(x, 0, width() - x, height(), Qt::AlignLeft | Qt::AlignVCenter, m_str_text);
                }
            }
            else
            {
                if (m_bToBottom)
                {
                    x = m_nLeft;
                    y = rect().height() - m_nToBottom - dc.fontMetrics().height();
                    dc.drawText(x, y, dc.fontMetrics().width(m_str_text), m_font.pixelSize(), Qt::AlignLeft | Qt::AlignBottom, m_str_text);

                    x = rect().width() - m_nRight - pPixmap->width();
                    dc.drawPixmap(x, y, pPixmap->width(), pPixmap->height(), *pPixmap);
                }
                else
                {
                    x = m_nLeft;
                    y = (height() - m_font.pixelSize()) / 2;
                    dc.drawText(x, y, dc.fontMetrics().width(m_str_text), m_font.pixelSize(), Qt::AlignLeft | Qt::AlignVCenter, m_str_text);

                    x += dc.fontMetrics().width(m_str_text) + 5;
                    y = (height() - m_pPixmap->height()) / 2;
                    dc.drawPixmap(x, y, pPixmap->width(), pPixmap->height(), *pPixmap);
                }
            }
        }
        else
        {
            x = m_nLeft;
            y = (height() - m_font.pixelSize()) / 2;
            dc.drawText(x, y, dc.fontMetrics().width(m_str_text), m_font.pixelSize(), Qt::AlignLeft | Qt::AlignVCenter, m_str_text);
        }
    }
}

void CIconButtonPix::setText(const QString& Str)
{
    m_str_text = Str;
    update();
}

void CIconButtonPix::setFont(QFont font)
{
    m_font = font;
}

void CIconButtonPix::setTextColor(QColor color /*= QColor(37, 156,243)*/)
{
    m_text_color = color;
}

void CIconButtonPix::setIconPos(bool bFront /*= true*/)
{
    m_bIconPosFront = bFront;
}

void CIconButtonPix::setBackgroundColor(QColor color /*= QColor(255, 255,255)*/)
{
    m_background_color = color;
}

void CIconButtonPix::setTextHoverColor(QColor colorHover)
{
    m_bNeedHoverColor = true;
    m_text_color_hover = colorHover;
}

void CIconButtonPix::setHoverIconPath(string str)
{
    m_icon_path_hover = str;
    m_pixmapHover->load(TOCH(str.c_str()));
}

void CIconButtonPix::setHightToBottom(int nBottom)
{
    m_nToBottom = nBottom;
    m_bToBottom = true;
    m_bCenter = false;
}

void CIconButtonPix::setBackgroundPixMap(string str)
{
    m_bgPixmap_path = str;
    m_pPixBackground->load(TOCH(str.c_str()));
}


文章评论 (0)



Top