【Qt自定义控件】

Qt自定义控件

  • [1. Qt自定义按钮](#1. Qt自定义按钮)
  • [2. Qt](#2. Qt)
  • [3. Qt](#3. Qt)
  • [4. Qt](#4. Qt)
  • [5. Qt](#5. Qt)

1. Qt自定义按钮

cpp 复制代码
void CButton::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
    paintBackground(&painter);
    paintIcon(&painter);
    paintTextBackground(&painter);
    paintText(&painter);
}

void CButton::paintBackground(QPainter * painter)
{
    painter->save();
    QPainterPath path;
    QBrush brush;
    brush.setStyle(Qt::NoBrush);
    QPen pen;
    pen.setStyle(Qt::SolidLine);
    pen.setWidth(m_BorderWidth);
    //整体外框也分别会有三种状态
    if (isChecked())
    {
        brush.setColor(m_CheckedBackgroundColor);
        pen.setColor(m_CheckedBorderColor);
    }
    else if(!isEnabled())
    {
        brush.setColor(m_DisabledBackgroundColor);
        pen.setColor(m_DisableBorderColor);
    }
    else
    {
        brush.setColor(m_NormalBackgroundColor);
        pen.setColor(m_NormalBorderColor);
    }
    painter->setBrush(brush);
    QRect rect = QRect(0,0,this->width(),this->height());
    painter->setPen(pen);
    path.addRoundedRect(rect, m_BorderRadius, m_BorderRadius);
    //设置允许裁剪,让圆角更自然
    painter->setClipPath(path);
    painter->setClipping(true);
    painter->drawPath(path);
    painter->restore();
}

void CButton::paintIcon(QPainter *painter)
{
    painter->save();
    int iXpos    = 0;
    int iYpos    = 0;
    QPixmap pixmap;
    if (isChecked())
    {
        pixmap = m_CheckedIconPixmap;
    }
    else if (!isEnabled())
    {
        pixmap = m_DisabledIconPixmap;
    }
    else
    {
        pixmap = m_IconPixmap;
    }
    int offsetWidth = 0;
    int offsetHeight = 0;
    QSize pixmapSize(pixmap.width(), pixmap.height());
    if (pixmap.width() > pixmap.height())
    {
        if (pixmap.width() > m_IconSize.rwidth())
        {
            int temp = m_IconSize.rwidth();
            offsetWidth = pixmap.width() - m_IconSize.rwidth();
            int tem = pixmap.height()-offsetWidth;
            pixmapSize=QSize(temp, tem);
        }
    }
    else if (pixmap.height() > pixmap.width())
    {
        if (pixmap.height() > m_IconSize.height())
        {
            int temp = m_IconSize.rheight();
            offsetHeight = pixmap.height() - m_IconSize.rheight();
            int tem = pixmap.width()-offsetHeight;
            pixmapSize=QSize(tem, temp);
        }
    }
    else
    {
        pixmapSize = QSize(pixmap.width(), pixmap.height());
    }
    switch (m_IconSeat)
    {
        case E_ICON_LEFT:
        {
            iXpos = m_IconMargin + ((m_IconSize.rwidth()- pixmapSize.rwidth()) / 2);
            iYpos = (this->rect().height() - pixmapSize.rheight()) / 2;
            pixmap = pixmap.scaled(pixmapSize, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
            painter->drawPixmap(iXpos, iYpos, pixmapSize.rwidth(), pixmapSize.rheight(), pixmap);
        }
            break;
    }
    painter->restore();
}

void CButton::paintTextBackground(QPainter * painter)
{
    painter->save();

    QBrush brush;
    brush.setStyle(Qt::SolidPattern);

    painter->setRenderHint(QPainter::Antialiasing);
    QPainterPath path;
    switch (m_IconSeat)
    {
        case E_ICON_LEFT:
        {
            int posX = m_IconSize.rwidth()+(2*m_IconMargin);
            int posY = m_TextPixmapMargin ;

            int textPixmapWidth = this->width()-m_IconSize.rwidth()-(2*m_IconMargin)-m_TextPixmapMargin;
            int textPixmapHeight = this->height()-(2*m_TextPixmapMargin);
            m_TextPixmapRect = QRectF(posX, posY, textPixmapWidth, textPixmapHeight);
            path.addRoundedRect(m_TextPixmapRect, m_BorderRadius, m_BorderRadius);
            //设置允许裁剪,让圆角更自然
            painter->setClipPath(path);
            painter->setClipping(true);
        }
            break;
    }
    painter->setPen(Qt::NoPen);

    if (isChecked())
    {
        brush.setColor(m_CheckedBackgroundColor);
    }
    else if(!isEnabled())
    {
        brush.setColor(m_DisabledBackgroundColor);
    }
    else
    {
        brush.setColor(m_NormalBackgroundColor);
    }

    painter->fillPath(path, brush);

    painter->drawPath(path);
    painter->restore();
}

void CButton::paintText(QPainter * painter)
{
    painter->save();

    painter->setFont(QFont(m_TextFont, m_TextSize));//设置字体
    QColor color;
    if (isChecked())
    {
        color = m_CheckedTextColor;
    }
    else if (!isEnabled())
    {
        color = m_DisabledTextColor;
    }
    else
    {
        color = m_TextColor;
    }
    painter->setPen(QPen(color, m_TextWidth, Qt::SolidLine));//设置字体颜色
    painter->drawText(m_TextPixmapRect, Qt::AlignHCenter | Qt::AlignVCenter, m_ButtonText);//画一行文字


    painter->restore();
}

2. Qt

3. Qt

4. Qt

5. Qt

相关推荐
菜鸟看点1 小时前
自定义Cereal XML输出容器节点
c++·qt
漫步企鹅2 小时前
【蓝牙】Linux Qt4查看已经配对的蓝牙信息
linux·qt·蓝牙·配对
new_zhou2 小时前
Windows qt打包编译好的程序
开发语言·windows·qt·打包程序
看到我,请让我去学习11 小时前
Qt编程-qml操作(js,c++,canvas)
开发语言·qt
哈市雪花12 小时前
相机:Camera原理讲解(使用OpenGL+QT开发三维CAD)
qt·3d·交互·相机·图形学·opengl·视角
津津有味道14 小时前
Qt C++串口SerialPort通讯发送指令读写NFC M1卡
linux·c++·qt·串口通信·serial·m1·nfc
feiyangqingyun16 小时前
全网唯一/Qt结合ffmpeg实现手机端采集摄像头推流到rtsp或rtmp/可切换前置后置摄像头/指定分辨率帧率
qt·智能手机·ffmpeg
随意02316 小时前
Qt 事件
开发语言·qt
鸥梨菌Honevid16 小时前
Qt自定义控件(1)——QPaintEvent
开发语言·qt
Mr_Xuhhh1 天前
网络基础(1)
c语言·开发语言·网络·c++·qt·算法