如何设置 QBrush 的颜色动画

2024-04-17

我想要动画颜色QBrush。更多详情请看下面的代码

这是我的 .h 文件

class Cell : public QObject, public QGraphicsRectItem
{
    Q_OBJECT
    Q_PROPERTY(QBrush brush READ brush WRITE set_Brush)
public:
    QBrush _brush() const;
    void set_Brush(const QBrush&);
    Cell(QGraphicsItem *parent = 0); //конструктор
}

这是我的 .cpp 文件

Cell::Cell(QGraphicsItem *parent)
    : QObject(), QGraphicsRectItem(parent) 
{
    this->setRect(0, 0, Scale, Scale); 
}

QBrush Cell::_brush() const
{
    return this->brush();
}

void Cell::set_Brush(const QBrush & brush)
{
    this->setBrush(brush);
}

这就是动画:

QPropertyAnimation* animation = new QPropertyAnimation(selectedCell, "brush");
animation->setDuration(10000);
animation->setStartValue(QBrush(QColor(255,0,0)));
animation->setEndValue(QBrush(QColor(0,255,0)));
animation->start();

但它不起作用,什么也没有发生,画笔的颜色和以前一样。我应该做什么来修复它?


QT 不知道如何在启动之间执行转换QBrush和结束QBrush. QBrush除了颜色之外还有更多属性,您可以设想一个颜色保持不变而仅图案发生变化的动画。因此,这种转换没有默认支持。 正如 @fscibe 暗示的那样,您可以编写自己的方法来执行转换,在其中指定要如何从一个转换QBrush到另一个。

粗略的例子:

QVariant myColorInterpolator(const QBrush &start, const QBrush &end, qreal progress)
{
  QColor cstart = start.color();
  QColor cend = end.color();
  int sh = cstart.hsvHue();
  int eh = cend.hsvHue();
  int ss = cstart.hsvSaturation();
  int es = cend.hsvSaturation();
  int sv = cstart.value();
  int ev = cend.value();
  int hr = qAbs( sh - eh );
  int sr = qAbs( ss - es );
  int vr = qAbs( sv - ev );
  int dirh =  sh > eh ? -1 : 1;
  int dirs =  ss > es ? -1 : 1;
  int dirv =  sv > ev ? -1 : 1;

  return QBrush(QColor::fromHsv( sh + dirh * progress * hr,
                             ss + dirs * progress * sr,
                             sv + dirv * progress * vr), progress > 0.5 ? Qt::SolidPattern : Qt::Dense6Pattern  );


}

这会执行颜色的过渡,但也会在过渡过程中更改图案。

那么这里将是代码中此转换的虚拟应用程序:

int main(int argc, char** argv)
{
  QApplication app(argc,argv);
  QGraphicsView *view = new QGraphicsView;
  QGraphicsScene *scene = new QGraphicsScene;
  QDialog *dialog = new QDialog;
  QGridLayout *layout = new QGridLayout;
  layout->addWidget(view);
  view->setScene(scene);
  scene->setSceneRect(-500,-500,1000,1000);
  dialog->setLayout(layout);
  dialog->show();

  Cell *selectedCell = new Cell;
  scene->addItem(selectedCell);

  qRegisterAnimationInterpolator<QBrush>(myColorInterpolator);
  QPropertyAnimation* animation = new QPropertyAnimation(selectedCell, "brush");
  animation->setDuration(10000);
  animation->setStartValue(QBrush(Qt::blue));
  animation->setEndValue(QBrush(Qt::red));
  animation->start();

  return app.exec();
}

显然,这是虚拟示例,对于颜色更改,正如您从 fscibe 答案中看到的那样,它正在重新发明轮子,但这是为了向您展示定义自己的转换方法,例如QBrush您可以做的不仅仅是改变颜色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置 QBrush 的颜色动画 的相关文章

随机推荐

  • 如何在 OpenOffice BASIC 宏中通过鼠标单击获取文档坐标

    背景 我想在我用鼠标单击或悬停的位置 使用按键激活时 粘贴 如 CTRL V 任何内容 最好是图像 形状 我不知道该怎么做获取我单击的文档 X Y 上的位置 Apache OpenOffice SDraw Document OpenOffi
  • 当 git rebase 两个具有共享历史记录的分支时,有没有一种简单的方法可以让共同历史保持共同?

    假设我们有以下修订图 A X Z B C A 在 B 和 C 之前 进一步假设我从上游对 A 进行变基 创建一个新的提交 A 然后将 B 和 C 变基到 A 生成的修订图如下 A X Z B X Z C 请注意 共享历史记录不再共享 有没有
  • SQL中的条件外键

    我有一张名为 PartyChannel 的表 其中包含以下列 ID ChannelID ChannelType ChannelID stores MailID or PhoneID or EmailID取决于ChannelType 那么我如
  • 为什么 SQLAlchemy/associationproxy 重复我的标签?

    我正在尝试在与标签非常相似的情况下使用关联代理文档中的示例 http www sqlalchemy org docs 05 reference ext associationproxy html 这是我的架构的一个子集 它是一个博客 使用声
  • Websocket、Angular 2 和 JSON Web 令牌身份验证

    我的 Angular 2 应用程序 用打字稿编码 有一个简单的身份验证方案 用户登录 服务器返回 JSON Web 令牌 JWT abc123 在每次 API 调用时 应用程序都会将 JWT 发送到Authorization header
  • 将 SELECT DISTINCT ON 查询从 Postgresql 转换为 MySQL

    我一直在使用PostgreSQL现在迁移到MySQL 在我的查询中 我正在使用PostgreSQL s SELECT DISTINCT ON col1 col2 col3 我想知道这句话是否有对应的内容MySQL 没有完全等效的方法可以将使
  • C++ sizeof C 风格字符串/字符数组 - 优化

    我是一名大学学生 我主要使用 Java 工作 C 对我来说很陌生 所以我可能会犯很多愚蠢的错误 而且我还有即将到来的考试要应对 别对我太严厉 注意 我不能使用 C std string 因为由于大学任务我需要使用 C 字符串 参考我的研究和
  • java webapp配置策略

    我的网络应用程序的一部分涉及上传图像文件 在生产服务器上 文件需要写入 somepath on Production server images 对于本地开发 我想将文件写入 some different path images 处理这些配
  • 如何在 powershell 中转义大括号 {...}?

    我需要生成多行 xml 标记 其中包含 GUID
  • 如何在 jQuery 中检测复选框点击

    我无法检测到从下面的脚本中单击了何时以及哪个复选框 HTML 片段
  • 给定焦点和相机主中心,如何创建透视投影矩阵

    我设法使用 OpenCV 获取相机的内在和外在参数 因此我有 fx fy cx 和 cy 我还有屏幕 图像的宽度和高度 但是如何根据这些参数创建 OpenGL 透视投影矩阵呢 glFrustum 展示了如何在给定 Z 近 Z 远以及图像宽度
  • R fromJSON 无法打开连接

    我正在使用一种算法 R 它调用一个 Web 服务 该服务对数据库进行查询并返回一个 JSON 对象 url lt paste https example com id 1 document lt fromJSON content url m
  • 在 Apache Zeppelin 上运行 Pig 查询

    我正在 Apache Zeppelin 中运行以下 Pig 查询 pig query A load Pig data using PigStorage as ExamName ExamId BITSID StudentName Issue
  • 从函数中打开 fancybox

    我正在尝试从我拥有的函数中打开一个 fancybox 简而言之 我的 HTML 代码如下所示 a href modalMine click a 我的功能的一部分如下所示 function myfunction me me fancybox
  • 针对 unsafePerformIO 的部门限制

    工作中有人讨论过将其作为一项全部门政策 禁止使用unsafePerformIO及其同类 就我个人而言 我并不介意 因为我一直认为 如果我发现自己想要使用它 通常意味着我需要重新考虑我的方法 这个限制听起来合理吗 我似乎记得在某处读到它主要是
  • iOS:如何打开带有动画效果的相机?

    我想以动画效果打开相机 以便看起来相机仅在父屏幕中打开 我正在使用相机覆盖屏幕 在父屏幕中单击按钮事件时 相机覆盖屏幕正在打开 在相机覆盖屏幕中有一个取消按钮可以关闭相机 因此在再次关闭相机时我需要显示动画效果看起来现在相机在同一个父屏幕中
  • Python 类中的属性初始化/声明:将它们放在哪里?

    我想知道在 Python 中初始化对象属性的最佳实践是什么 在类的主体中还是在 init 功能 i e class A object foo None vs class A object def init self self foo Non
  • 在 postgresql 中生成自动 ID

    用户表 ID Name 1 usr1 2 usr2 3 usr3 上表中 ID为主键 我的要求是在将数据插入表中时 我只想指定 名字像INSERT INTO user VALUES usr4 执行查询后 有没有办法自动为 usr4 创建ID
  • ACRA 行号不正确

    我使用 android proguard ACRA 谁能告诉我为什么我收到的崩溃报告的行号不正确 行号显然指向错误的陈述 我无法知道崩溃的确切行号 因此无法修复用户报告的错误 这真的很烦人 谢谢 PS 我使用的是我发布的版本对应的映射文件
  • 如何设置 QBrush 的颜色动画

    我想要动画颜色QBrush 更多详情请看下面的代码 这是我的 h 文件 class Cell public QObject public QGraphicsRectItem Q OBJECT Q PROPERTY QBrush brush