QStyle 自定义QSpinBox外观

点击查看详细介绍

 

头文件

#ifndef SPINBOX_STYLE_1_H
#define SPINBOX_STYLE_1_H

#include <QProxyStyle>
#include <QStyleOptionComplex>
#include <QPainter>

class spinbox_1 : public QProxyStyle
{
    Q_OBJECT

public:
    spinbox_1();
    ~spinbox_1();

public:
    void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const;
    void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
    QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const;

private:
    void drawSpinBox(SubControl sc,const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0)const;


};

#endif // SPINBOX_STYLE_1_H

cpp

#include "spinbox_style_1.h"
#include <QDebug>

spinbox_1::spinbox_1()
{
}

spinbox_1::~spinbox_1()
{

}

void spinbox_1::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
    if(control == CC_SpinBox)
    {
        drawSpinBox(SC_SpinBoxDown,option,painter,widget);
        drawSpinBox(SC_SpinBoxUp,option,painter,widget);

        QRect editFiled = subControlRect(CC_SpinBox,option,SC_SpinBoxEditField,widget).adjusted(-10,-10,+10,+10);
        painter->save();
        QLinearGradient ga(0,0,editFiled.width(),editFiled.height());
        ga.setColorAt(0.0,QColor("#381FE4"));
        ga.setColorAt(1.0,QColor("#99EC93"));
        painter->setBrush(ga);
        painter->setPen(Qt::NoPen);

        int diameter =12;
        QRect roundRect = editFiled.adjusted(1,1,-1,-1);
        int cx = 100 * diameter / roundRect.width();
        int cy = 100 * diameter / roundRect.height();

        painter->drawRoundedRect(roundRect,cx,cy);//绘制编辑框四周
        painter->restore();

        QRect frameRect = subControlRect(CC_SpinBox,option,SC_SpinBoxFrame,widget);
        painter->save();
        painter->setPen(QPen(QColor(Qt::blue),2));
        painter->drawRect(frameRect);//绘制SpinBox外围边框
        painter->restore();
    }
    else
    {
        QProxyStyle::drawComplexControl(control,option,painter,widget);
    }
}

void spinbox_1::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
{
    if(element == PE_IndicatorSpinPlus)
    {
        painter->save();
        painter->translate(option->rect.x(),option->rect.y());
        QPainterPath pa;
        pa.moveTo(option->rect.width()/2,0);
        pa.lineTo(0,option->rect.height());
        pa.lineTo(option->rect.width(),option->rect.height());
        pa.lineTo(option->rect.width()/2,0);
        painter->setPen(QPen(QColor("#128bf1"), 2));
        painter->drawPath(pa);
        painter->restore();
        return;
    }
    else if(element == PE_IndicatorSpinMinus)
    {
        painter->save();
        painter->translate(option->rect.x(),option->rect.y());
        QPainterPath pa;
        pa.moveTo(0,0);
        pa.lineTo(option->rect.width(),0);
        pa.lineTo(option->rect.width()/2,option->rect.height());
        pa.lineTo(0,0);
        painter->setPen(QPen(QColor("#128bf1"), 2));
        painter->drawPath(pa);
        painter->restore();
        return;
    }
    return QProxyStyle::drawPrimitive(element,option,painter,widget);
}

QRect spinbox_1::subControlRect(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QStyle::SubControl sc, const QWidget *widget) const
{
    if(cc == CC_SpinBox)
    {
        switch (sc) {
        case SC_SpinBoxUp:
            return QRect(opt->rect.x(),0,opt->rect.width()/2,opt->rect.height()*0.4).adjusted(1,1,-1,-1);
        case SC_SpinBoxDown:
            return QRect(opt->rect.width()/2,0,opt->rect.width()/2,opt->rect.height()*0.4).adjusted(1,1,-1,-1);
        case SC_SpinBoxEditField:
            return QRect(opt->rect.x(),opt->rect.height()*0.4,opt->rect.width(),opt->rect.height()*0.6).adjusted(10,10,-10,-10);
        case SC_SpinBoxFrame:
            return opt->rect;
        default:
            break;
        }
    }
    return QProxyStyle::subControlRect(cc,opt,sc,widget);
}

void spinbox_1::drawSpinBox(QStyle::SubControl sc, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
{
    QRect buttonRect = option->rect;
    PrimitiveElement pe;
    if(sc == SC_SpinBoxUp)
    {
        pe = PE_IndicatorSpinPlus;
        buttonRect.translate(0,0);
    }
    else
    {
        pe = PE_IndicatorSpinMinus;
        buttonRect.translate(option->rect.width()/2,0);
    }
    buttonRect.setWidth(option->rect.width()/2);
    buttonRect.setHeight(option->rect.height()*0.4);

    painter->save();
    painter->setClipRect(buttonRect);

   // painter->setPen(Qt::NoPen);
    QLinearGradient gradient(0,0,0,option->rect.height());
    gradient.setColorAt(0.0,QColor("#5ee7df"));
    gradient.setColorAt(1.0,QColor("#b490ca"));
    painter->setBrush(gradient);
    QRect bgRect = buttonRect.adjusted(1,1,-1,-1);
    int diameter = 12;
    int cx = 100 * diameter / buttonRect.width();
    int cy = 100 * diameter / buttonRect.height();
    painter->drawRoundedRect(bgRect,cx,cy);

    QPoint p = widget->mapFromGlobal(QCursor::pos());//鼠标点击位置转换

    if(option->state &(State_On | State_Sunken)&&bgRect.contains(p))//鼠标按下位置
    {
        QColor pressColor(0,0,0,63);
        painter->setBrush(pressColor);
        painter->drawRoundedRect(bgRect,cx,cy);
    }
    painter->restore();

    QStyleOption plusIcon(*option);
    QRect subRect = subControlRect(CC_SpinBox,option,sc,widget);
    plusIcon.rect = subRect.adjusted(subRect.width()*0.3,subRect.height()*0.3,-subRect.width()*0.3,-subRect.height()*0.3);

    drawPrimitive(pe,&plusIcon,painter,widget);
   // QProxyStyle::drawPrimitive(pe,&plusIcon,painter,widget);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QStyle 是 Qt 框架中的类,用于定义控件的外观和行为。如果想将 QStyle 对象转换为字符串,可以使用 QStyle 的 metaObject() 方法获取其元对象,然后调用元对象的 className() 方法获取类名。 示例代码如下: ```c++ QStyle* myStyle = new QStyle(); QString styleName = myStyle->metaObject()->className(); qDebug() << styleName; // 输出 "QStyle" ``` 这样就可以将 QStyle 对象转换为字符串了。 ### 回答2: QStyle是Qt框架中的一个类,用于提供用户界面的样式和外观。它可以用来定制应用程序窗口、按钮、文本框等控件的外观和风格。 要将QStyle对象转换为字符串,我们可以使用QStyle 的typename()方法。typename()方法返回一个QString,包含了QStyle的类型名。 以下是一个示例代码: ```cpp #include <QStyle> #include <QDebug> int main() { QStyle* style = new QStyle(); // 创建一个QStyle对象 QString styleTypeName = style->typeName(); // 将QStyle对象转换为字符串 qDebug() << "QStyle类型名:" << styleTypeName; delete style; return 0; } ``` 运行这段代码后,会输出类似以下的结果: ``` QStyle类型名: QStyle ``` 这样就实现了将QStyle对象转换为字符串的功能。请注意,QStyle对象的字符串表示仅包含其类型名,而不包含其他属性或方法。如果需要获取更多关于QStyle对象的信息,可以使用其他成员函数和属性来检索。 ### 回答3: QStyle是Qt框架中的一个类,用于界面风格的管理和绘制。要将QStyle对象转换成字符串,可以使用QStyle的objectName属性来获取其名称,并通过QString的toStdString()方法将其转换为标准字符串。 下面是一个示例代码: ```cpp QStyle* style = QApplication::style(); // 获取当前应用程序的界面风格 QString styleName = style->objectName(); // 获取QStyle对象的名称 std::string styleStr = styleName.toStdString(); // 将QString转换为标准字符串 ``` 在这个例子中,首先获取当前应用程序的界面风格,然后使用objectName属性获取其名称,并将其转换为标准字符串。最终得到的styleStr就是QStyle对象的字符串表示。 需要注意的是,上述代码只能在已经创建了QApplication对象之后才能正常运行,因为QStyle的获取依赖于QApplication。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值