[QT]使用Qt实现任一Widget对象阴影效果的方法


前言

最近在为学校开发一个成绩预览以及打印系统的客户端版本,应用到了Qt框架进行UI的开发,Qt框架中有一个相对完善的QSS(Qt Style Sheet)样式表,可相较于于Web开发端的CSS样式表来说,对于UI效果的支持有一定程度上的不完善,例如CSS中实用的box-shadow,text-shadow这两种阴影效果在QSS中是不可用的,但是阴影效果在大部分UI设计中都是提升用户体验的重要工具,所以在开发中查阅了部分相关资料寻找出了一种可行的方式实现了窗口阴影的效果,写篇博文为大家展示一下,互相交流,也帮助需要用到这个效果的同行小伙伴们达成需求~

一、实现方式

#include <QGraphicsEffect>

/// 方法封装了QGraphicsDropShadowEffect类,用来为QWidget绘制边框阴影
QGraphicsDropShadowEffect* CommonDrawAction::DrawShadow(QWidget* parent, qint32 offx, qint32 offy, qint32 blurRadius, QColor color){
    QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect(parent);
    shadowEffect->setOffset(offx, offy);
    shadowEffect->setBlurRadius(blurRadius);
    shadowEffect->setColor(color);

    return shadowEffect;
}

......

/// 对需要阴影的Frame绘制过程的封装
Frame::Frame(QWidget* parent, QString frameName, QRect size, bool isDrawShadow)
{
    QFrame *frame = new QFrame(parent);
    frame->setObjectName(frameName);
    frame->setGeometry(size);
    frame->setFrameShape(QFrame::StyledPanel);

    if(isDrawShadow == true){  //这里是绘制阴影的过程
        CommonDrawAction draw;  //实例化绘制对象
        frame->setGraphicsEffect(draw.DrawShadow(parent, 0, 0, 10, Qt::black)); 
        //调用绘制对象的DrawShadow方法进行阴影绘制
    }
}

二、使用步骤

1.阴影对象实例化

首先我们需要引入QGraphicsEffect这个头文件,这是Qt中有关UI视效的类声明,该文件中存放着QGraphicsDropShadowEffect类的声明,这个类是我们用于绘制阴影的类,我个人认为该类的原理是在目标窗口的父窗口上绘制一个与窗口大小相同的阴影。

QGraphicsDropShadowEffect的实例化需要在构造方法中传入一个父窗口指针,同时需要四个参数(或三个参数)对其对象进行设置,通过对这些参数的设置实现不同的阴影效果。

qreal blurRadius() const :阴影模糊参数
QColor color() const :阴影颜色
QPointF offset() const :阴影偏移参数
qreal xOffset() const :阴影在x轴上的偏移参数
qreal yOffset() cons :阴影在y轴上的偏移参数:

代码如下:

#include <QGraphicsEffect>

......
QGraphicsDropShadowEffect *shadowEffect = new QGraphicsDropShadowEffect(parent);
shadowEffect->setOffset(offx, offy);
//shadowEffect->setOffset(QPointF(offx,offy));  //或者使用QPointF设置偏移参数
shadowEffect->setBlurRadius(blurRadius);
shadowEffect->setColor(color);
......

2.为目标窗口设置显示效果

代码如下:

......
QWidget *widget = new Widget(parent);
widget.setGraphicsEffect(shadowEffect);

总结

Qt是利用C/C++进行现代化桌面应用程序开发几乎不可避免的技术栈,Qt为优化视觉效果提供了诸多方法,阴影只是其中之一,在这里分享出来,希望可以帮助大家少走弯路,达成自己想要的效果。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用PCL实现过滤空间任一角度矩形点云,可以使用PCL库提供的CropBox滤波器。CropBox滤波器可以根据一个定向的矩形框来滤波点云。下面是实现的步骤: 1. 创建一个PointCloud对象存储点云数据,假设为cloud。 2. 创建一个CropBox滤波器对象,假设为cropBox。 3. 设置CropBox滤波器的参数。需要设置矩形框的中心点、长、宽、高以及旋转角度。可以使用Eigen库提供的Affine3d对象来设置旋转角度。 4. 应用CropBox滤波器,将滤波后的点云存储在另一个PointCloud对象中,假设为cloud_filtered。 下面是示例代码: ```cpp #include <pcl/filters/crop_box.h> // 1. 创建PointCloud对象存储点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 2. 创建CropBox滤波器对象 pcl::CropBox<pcl::PointXYZ> cropBox; // 3. 设置CropBox滤波器的参数 cropBox.setMin(Eigen::Vector4f(-1.0, -1.0, -1.0, 1.0)); // 矩形框最小值 cropBox.setMax(Eigen::Vector4f(1.0, 1.0, 1.0, 1.0)); // 矩形框最大值 Eigen::Affine3d transform = Eigen::Affine3d::Identity(); // 旋转矩阵 transform.rotate(Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d::UnitZ())); // 绕z轴旋转45度 transform.translation() << 1, 1, 0; // 平移向量 cropBox.setTransform(transform); // 设置旋转矩阵和平移向量 // 4. 应用CropBox滤波器 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>); cropBox.setInputCloud(cloud); cropBox.filter(*cloud_filtered); ``` 其中,setMin()和setMax()方法用于设置矩形框的最小值和最大值。Eigen::Vector4f表示一个四维向量,前三个分量表示矩形框的长、宽、高,第四个分量默认为1.0。setTransform()方法用于设置旋转矩阵和平移向量。Eigen::Affine3d表示一个仿射变换矩阵,可以使用rotate()方法设置旋转角度,使用translation()方法设置平移向量。setInputCloud()方法用于设置输入点云,filter()方法用于应用滤波器,并将滤波后的点云存储在指定的PointCloud对象中。 如果要对任意角度的矩形进行滤波,可以根据矩形的中心点、长、宽、高和旋转角度来计算出矩形框的最小值和最大值。具体实现方法可以参考以下代码: ```cpp // 假设矩形的中心点为(1, 1, 0),长为2,宽为1,高为1,绕z轴旋转45度 Eigen::Vector3d center(1, 1, 0); Eigen::Vector3d length(2, 1, 1); Eigen::Quaterniond rotation(Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d::UnitZ())); // 计算矩形框的最小值和最大值 Eigen::Vector3f minPt, maxPt; Eigen::Vector3d maxLength = rotation*length; minPt << center - 0.5*maxLength.cast<float>(); maxPt << center + 0.5*maxLength.cast<float>(); ``` 其中,center表示矩形的中心点,length表示矩形的长、宽、高,rotation表示旋转角度。使用Quaterniond对象来表示旋转角度,可以使用AngleAxisd构造函数来构造一个旋转轴和旋转角度,然后将其转换成四元数形式。使用*运算符来对向量进行旋转变换。最后,根据矩形的最小值和最大值来设置CropBox滤波器的参数即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catalpa_ovis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值