首页 > 其他分享 >自定义的Qt控件特效

自定义的Qt控件特效

时间:2023-08-22 13:44:24浏览次数:40  
标签:控件 Qt 自定义 特效 offset MTestEffect painter

实现自定义特效的方法一般是继承QGraphicsEffect类,重写它的draw(...)函数。如果特效需要扩展目标的外矩形则还要重写boundingRectFor(...)函数。使用时用QWidget::setGraphicsEffect(...)函数把特效加到控件上就行了。在不扩展目标外矩形的情况下按照Qt帮助的写法直接绘制就可以,而在需要扩展外矩形的情况则有坑需要注意。这里给出一个需要扩展目标外矩形的例子。实现目标是在控件外部的左上角显示一个绿色的正方形。效果如下:

下面是头文件:

class MTestEffect : public QGraphicsEffect
{
    Q_OBJECT

public:
    MTestEffect(QObject* parent = 0);

private:
    QRectF boundingRectFor(const QRectF &sourceRect) const override;

    void draw(QPainter *painter) override;
};

CPP文件:

MTestEffect::MTestEffect(QObject* parent) : 
    QGraphicsEffect(parent)
{
}

QRectF MTestEffect::boundingRectFor(const QRectF &sourceRect) const
{
    return sourceRect.adjusted(0, -7, 0, 0);
}

void MTestEffect::draw(QPainter *painter)
{
    QPoint offset;
    QPixmap pixmap = sourcePixmap(Qt::DeviceCoordinates, &offset);
    painter->save();
    painter->setWorldTransform(QTransform());

    painter->fillRect(offset.x(), offset.y(), 6, 6, Qt::green);
    painter->drawPixmap(offset, pixmap);
    painter->restore();
}

这里需要着重看的是draw(...)函数,它取pixmap用的是Qt::DeviceCoordinates而不是Qt::LogicalCoordinates,而且绘制之前要先把worldTransform清空。经过测试在需要扩展目标外矩形的情况下必须这样写,否则绘制效果会出问题。

另外,外扩外矩形只针对子控件,对于顶层窗口是无效的。因为特效不能显示在顶层窗口的外面。

标签:控件,Qt,自定义,特效,offset,MTestEffect,painter
From: https://www.cnblogs.com/mengxiangdu/p/17647613.html

相关文章

  • ios app分享微信h5二次转发无法自定义标题icon问题的解决方法
     我的实现场景是打开app的时候ios走universallink,安卓走微信jssdk。安卓二次转发自定义标题有效,ios则不行。参考了微信开放社区,竞品的分享方法。一直摸不到头绪,后面把限制打开app安卓走jssdk限制的代码注释,让ios也走微信jssdk,二次分享自定义样式终于可行,问题解决。......
  • windows 桌面GUI自动化-4. pywinauto 操作窗口控件child_window()
    前言桌面应用的操作都是基于控件操作,先找到对应的窗口,基于操控查找框架即可操作了。查看窗口控件先学会如何查看窗口框架,可以用inspect.exe查看窗口的层级结构以打开的记事本为例也可以通过print_ctrl_ids()方法(另外一个print_control_identifiers()功能一样)查看当前......
  • Qt 信号槽管理方式
    连接信号槽connect函数的第五个参数ConnectionType是一个定义在Qtnamespace中的一个枚举,具体内容如下:enumConnectionType{ AutoConnection, DirectConnection, QueuedConnection, BlockingQueuedConnection, UniqueConnection=0x80};Qt::AutoConnection:默认......
  • 控件背景颜色设置为透明的方法
    引言在项目开发中,有时需要将控件的背景颜色设置为透明,比如label控件。那么,如何将控件的背景颜色设置为透明呢?是否只需将控件的BackColor属性设为Transparent即可呢?答案是否定的。想要解决这个问题,首先要了解在C#中什么叫做透明。this.TransparencyKey=Color.Red;this......
  • Qt 多线程简单应用
    声明:QThread*thread;初始化:thread=newQThread();thread->start();将对象放到线程中去:moveToThread(thread);readTimer.moveToThread(thread);readTimer.setSingleShot(true);连接消亡信号:connect(thread,SIGNAL(finished()),this,SLOT(thread_done()));注......
  • QT资源文件的使用
    QT资源文件的使用将资源打包进工程中,方便使用按步实操建立好工程,在工程名下右键菜单AddNew... 选择QT->QtResourceFile输入资源名称按提示一步步操作到完成在工程中就可以看到Resources资源文件夹,这里有我们刚添加myres资源文件了,这里我们可以先在到工程目录下建一个images,......
  • qt 配置过程记录
    1. source命令用于执行被修改的配置文件,使最新配置更新到操作系统 通常有如下命令source~/.profilesource~/.bash_profilesource/etc/profile如果碰到sudo:source:commandnotfound问题,主要是因为系统中的很多命令需要声明式配置,才能在终端调用这些命令。解决方法:su......
  • 为什么使用HashMap的键存的是自定义的键时需要重写hashcode和equals方法?
    当hashMap的键存的是自定义的键时需要重写对象的hashcode和equals方法存入的是对象时,应该hashMapd的键不能存储的值不能相同,如果重写方法的hashcode()方法,他会默认调用object类的hashcode方法,但是object的hashcode方法时地址值计算出来的hash值,并不是内容,这个时候就需要重......
  • Apipost中自定义接口字段如何配置
    Apipost项目设置中可以配置接口文档中的自定义接口字段,创建状态码字典。分享分档时会展示到文档页面状态码字典在状态码字典中可以自定义状态码即其含义自定义的状态码会在分享的API文档中展示接口属性接口属性中可以自定义接口和接口文档展示字段,在接口属性中添加一个时间类型字段......
  • Apipost中自定义接口字段如何配置
    Apipost项目设置中可以配置接口文档中的自定义接口字段,创建状态码字典。分享分档时会展示到文档页面状态码字典在状态码字典中可以自定义状态码即其含义 自定义的状态码会在分享的API文档中展示 接口属性接口属性中可以自定义接口和接口文档展示字段,在接口属性中添加一......