Linux Qt4.8.6中控件阴影实现(使用带阴影图片)

1 篇文章 0 订阅

最近遇到一个linux项目,系统中只能支持qt4.8.6。使用阴影的时候遇到一些问题,处理解决后留个笔记。

Qt中实现的阴影方式有:

  1. QGraphicsDropShadowEffect
  2. paintEvent绘制
  3. 使用带阴影效果的图片

Qt4.8.6中不支持QGraphicsDropShadowEffect效果,使用paintEvent方式繁琐自己画的效果也不好。所以我采用了带应用效果的图片编辑了一个阴影类。效果如下图:

使用方式:

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    resize(400,400);
    //设备背景颜色
    setObjectName("widget_main");
    setStyleSheet("QWidget#widget_main{background:#FFFFFF;}");

    //创建一个窗口控件
    QWidget *test1=new QWidget(this);
    test1->setObjectName("test1");
    test1->setStyleSheet("QWidget#test1{background:#FFFF00;border-radius:10px;}");
    test1->setFixedSize(100,100);
    test1->move(50,50);

    //创建一个窗口控件
    QWidget *test2=new QWidget(this);
    test2->setObjectName("test2");
    test2->setStyleSheet("QWidget#test2{background:#FFFF00;border-radius:10px;}");
    test2->setFixedSize(100,100);
    test2->move(200,50);

    //创建一个窗口控件
    QWidget *test3=new QWidget(this);
    test3->setObjectName("test3");
    test3->setStyleSheet("QWidget#test3{background:#FFFF00;border-radius:10px;}");
    test3->setFixedSize(100,100);
    test3->move(50,200);

    //添加阴影
    CShadowWidget *shadow=new CShadowWidget(test2,2);
    shadow->setOffset(10,10,40,40);
    new CShadowWidget(test3,1);
    new CShadowWidget(test1,0);
}

cshadowwidget.h内容:

#ifndef CSHADOWWIDGET_H
#define CSHADOWWIDGET_H

#include <QWidget>
#include <QTimer>

class CShadowWidget : public QWidget
{
    Q_OBJECT
public:
    explicit CShadowWidget(QWidget *parent = 0);
    CShadowWidget(QWidget *parent,int model);
    void setDecorate(QWidget*);                 //设置修饰的目标
    void setShowModel(int);                     //设置显示模式
    void setShadowWidth(int);                   //设置阴影的宽度
    void paintEvent(QPaintEvent *event);        //重绘函数
    void setOffset(int l,int t,int r,int d);    //设置偏移
private:
    void initMsg();                             //数据初始化
    void initUI();                              //界面初始化
private:
    QWidget* m_widget;      //需要修饰的目标
    QWidget* m_shadow;      //显示背景图片的控件
    int m_shadowwidth;      //阴影宽度
    int m_model;            //显示模式 0:所有  1:下右 2:存在偏移

    int m_lwidth;
    int m_rwidth;
    int m_twidth;
    int m_dwidth;
};

#endif // CSHADOWWIDGET_H

cshadowwidget.cpp内容:

#include "cshadowwidget.h"
#include <QDebug>
#include <QHBoxLayout>

CShadowWidget::CShadowWidget(QWidget *parent) :
    QWidget(parent)
{
    initMsg();
    initUI();
}
CShadowWidget::CShadowWidget(QWidget *parent,int model):
    QWidget(parent->parentWidget())
{
    initMsg();
    initUI();
    setShowModel(model);
    setDecorate(parent);
}
void CShadowWidget::initMsg()
{
    m_model=0;
    m_shadowwidth=40;
    m_lwidth=0;
    m_twidth=0;
    m_rwidth=0;
    m_dwidth=0;
    m_shadow=NULL;
    m_widget=NULL;
}
void CShadowWidget::initUI()
{
    setFixedSize(100,100);
    m_shadow=new QWidget(this);
    m_shadow->setObjectName("shadow");
    m_shadow->setStyleSheet("QWidget#shadow{border-image:url(\":/images/icon_shadow3.png\");}");
    m_shadow->show();
    QHBoxLayout* layout=new QHBoxLayout();
    layout->setContentsMargins(0,0,0,0);
    layout->setSpacing(0);
    layout->addWidget(m_shadow);
    this->setLayout(layout);
}
void CShadowWidget::setDecorate(QWidget* p)
{
    m_widget=p;
    //将图像移动到该目标的背后
    stackUnder(p);
}

void CShadowWidget::setShowModel(int m)
{
    m_model=m;
    if(m==1)
    {
        m_shadow->setStyleSheet("QWidget#shadow{border-image:url(\":/images/icon_shadow3.png\");}");
    }
    else
    {
        m_shadow->setStyleSheet("QWidget#shadow{border-image:url(\":/images/icon_shadow2.png\");}");
    }
}
void CShadowWidget::setOffset(int l,int t,int r,int d)
{
    m_lwidth=l;
    m_twidth=t;
    m_rwidth=r;
    m_dwidth=d;
    m_model=2;
    setShowModel(2);
    update();
}
void CShadowWidget::setShadowWidth(int w)
{
    m_shadowwidth=w;
    update();
}
void CShadowWidget::paintEvent(QPaintEvent *event)
{
    if(m_widget==NULL)
        return;
    int w=m_widget->width();
    int h=m_widget->height();
    if(m_model==1)
    {
        //下、右有阴影
        setFixedSize(w+m_shadowwidth,h+m_shadowwidth);
        move(m_widget->pos().x(),m_widget->pos().y());
    }
    else if(m_model==2)
    {
        //四边距离调整
        setFixedSize(w+m_lwidth+m_rwidth,h+m_twidth+m_dwidth);
        move(m_widget->pos().x()-m_lwidth,m_widget->pos().y()-m_twidth);
    }
    else
    {
        //四边都有阴影
        setFixedSize(w+m_shadowwidth*2,h+m_shadowwidth*2);
        move(m_widget->pos().x()-m_shadowwidth,m_widget->pos().y()-m_shadowwidth);
    }

}

个人使用的透明阴影图片资源:

纯记录,不喜勿喷!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS2015是指Visual Studio 2015,它是由微软公司推出的一款集成开发环境(IDE),主要用于开发各种类型的应用程序。VS2015具有强大的功能,包括代码编辑器、调试器、图形化界面设计工具和版本控制等,能够提高开发效率和代码质量。 Qt4.8.6是指Qt开发框架的一个版本,Qt是一套跨平台的C++应用程序开发框架,能够快速地创建高质量的图形用户界面和功能丰富的应用程序。Qt4.8.6Qt框架的一个比较早期的版本,虽然现在已经有了更高版本的Qt,但它仍然被一些开发者广泛使用使用VS2015结合Qt4.8.6进行开发,可以将两者的优势结合起来,实现更多功能和更好的开发体验。VS2015提供了强大的开发工具和调试功能,能够帮助开发者更轻松地编写和调试Qt应用程序的代码。而Qt4.8.6则提供了丰富的自定义控件和图形界面设计工具,能够快速构建各种不同风格的界面。 在使用VS2015和Qt4.8.6进行开发时,可以使用VS2015的开发环境来编写和调试Qt应用程序的代码,同时利用Qt提供的工具和组件来创建界面和添加功能。这样可以提高开发效率,减少不必要的代码重复和错误。 总之,VS2015与Qt4.8.6结合使用,可以提供更好的开发体验和更丰富的功能选择,帮助开发者快速构建高质量的应用程序。当然,如果有更高版本的Qt可用,也可以考虑升级到最新版本,以获取更多的优化和新特性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值