Qt制作18帧丘比特表白意中人、是你的丘比特嘛!!!

欢迎小伙伴的点评✨✨,相互学习、互关必回、全天在线🍳🍳🍳
博主🧑🧑 本着开源的精神交流Qt开发的经验、将持续更新续章,为社区贡献博主自身的开源精神👩‍🚀
🏛 🏛博主主页👉主页

💘Qt制作18帧丘比特表白意中人

红酥手,黄縢酒。满城春色宫墙柳。东风恶,欢情薄。一怀愁绪,几年离索。错、错、错。

春如旧,人空瘦。泪痕红浥鲛绡透。桃花落,闲池阁。山盟虽在,锦书难托。莫、莫、莫。、

世情薄,人情恶。雨送黄昏花易落。晓风乾,泪痕残。欲笺心事,独语斜阑。难、难、难。

人成各,今非昨。病魂尝似秋千索。角声寒,夜阑珊。怕人寻问,咽泪装欢。瞒、瞒、瞒。
此时此景,请丘比特大人展现才艺了。

💘18帧丘比特之心,那一帧是奔向爱情的怀抱(GIF动图效果如下)

在这里插入图片描述

工程文件(包含图片)已经上传到github,直接用git拉取即可,命令如下

git clone  https://github.com/dhn111/Qt.git 

图一
在这里插入图片描述
图二
在这里插入图片描述

💘代码实现及详解

💘mainwindow.h详解(看注释“铁汁”)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
   void timerEvent(QTimerEvent* event); //使用timerEvent 定时器接口,对图片的播放进行延迟

   void  InitPixmap();        //读入照片的名称,获取路径,加载到QPixmap 数组中

   void  paintEvent(QPaintEvent* event);  //当定时器定时通过timerEvent结束后触发接口

   int eventID;

   int curIndex;

private slots:
   //void on_pushButton_clicked();

private:
     QPixmap pixmap[18];    //声明全局变量
    Ui::MainWindow *ui;
    QString filename;
    QPixmap map;
};
#endif // MAINWINDOW_H


💘动图GIf制作思路

第一步:加载图片
第二步:使用定时器延时
第三步:循环第一步和第二步做的事情

💘QPixmap(加载图片)和startTimer(延时)及其他接口详解

/************************************************************************/
QRect可以用一组左、顶、宽和高整数来构造,也可以用QPoint和QSize来构造。
QRect r1(640, 640, 20, 20);
QRect r2(QPoint(640, 640), QSize(20, 20));
/************************************************************************/
 QPainter painter(this);      //声明一个QPainter类型,使用 repaint();重新载入达到循环的目的
 QPixmap map(":/res/1.png");                 
 QRect q2(20,20,width(),height()); //设置图片在窗口的位置
 painter.drawPixmap(q2,pixmap[curIndex],q2); //把变量中图片的路径用数组的方式画出来。
 /************************************************************************/   
 int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer);
 功能:启动一个定时器延时结束后触发接口timerEvent(QTimerEvent *event);
 interval:定时器的触发时间(触发的间隔时间)

virtual void timerEvent(QTimerEvent *event);

功能:启动定时器后自动调用的函数(虚函数需要重写)
参数说明:event:事件(可用于判断当前发生的事件等)
/************************************************************************/
paintEvent(QPaintEvent*event)函数是QWidget类中的虚函数,
用于ui的绘制,会在多种情况下被其他函数自动调用,比如repaint()函数或者update()函数被调用时;
/************************************************************************/

💘mainwindow.cpp详解(看注释“铁汁”)

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPainter>
#include<QPixmap>
#include<QFileDialog>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    resize(500,500);
    eventID=startTimer(100); //延时100ms
    curIndex=0;
    InitPixmap();          //
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timerEvent(QTimerEvent*event)
{
    curIndex++;     //GIF动图加载的间隔为 100ms 每隔100ms 加载一帧图片,循环18次,就实现了动图
    if(curIndex>=18)    //curIndex 用在 pixmap[curIndex]中,使其循环画图
    {
        curIndex=0;
    }
    repaint();   //当定时器startTimer(100) 定时结束时触发 timerEvent(QTimerEvent*event)接口
                 //用于重载paintEvent(QPaintEvent *event);
}
 void  MainWindow::InitPixmap()
 {
     for(int i=0;i<18;i++)
     {
         filename=QString(":/res/%1.png").arg(i+1);
         //1_%1:切换到下一张
         QPixmap map(filename);         //循环获取18图片路径 ,并拷贝到数组中

         pixmap[i]=map;
     }
 }
 void MainWindow::paintEvent(QPaintEvent *event)
 {
     QPainter painter(this);      //声明一个QPainter类型,使用 repaint();重新载入达到循环的目的
     //QRect q(30,30,500,500);
     QRect q2(20,20,width(),height()); //设置图片在窗口的位置
     painter.drawPixmap(q2,pixmap[curIndex],q2); //把变量中图片的路径用数组的方式画出来。
 }



#if 0      
void MainWindow::on_pushButton_clicked()      //保存图片到标准路径
{

   QString filename = QFileDialog::getSaveFileName(this,
       tr("Save Image"),
       "",
       tr("*.bmp;; *.png;; *.jpg;; *.tif;; *.GIF")); //选择路
   pixmap->save(filename);
}
#endif

💘GIF动图心得

这个Demo制作动图后,无法保存到本地,不过我们可以使用专业的GIF录制工具,录制动图形成GIF保存即可,这里给大家推荐一款(GIF录制工具,链接放下面了)
screentogif官方网站

在这里插入图片描述

### 回答1: Qt是一个跨平台的应用程序框架,它提供了丰富的库和工具,可以简化软件开发的过程。在Qt中,可以使用C++语言编写代码来实现各种功能,包括爱心代码。 编写Qt爱心代码需要使用Qt的图形库和绘图功能。可以通过继承QWidget类来创建一个自定义的窗口,并在窗口上绘制爱心图案。 首先,需要在窗口的构造函数中设置窗口的大小和标题。然后,在窗口的paintEvent函数中实现绘图功能。 在绘图功能中,可以使用Qt的绘制函数来绘制爱心图案。例如,可以使用QPainter类的drawEllipse函数绘制出两个圆形,表示爱心的两个部分。然后,使用QPainter类的drawLine函数连接这两个圆形,形成爱心的形状。 除了绘制爱心图案,还可以通过设置爱心的颜色、线条粗细等属性,来实现不同样式的爱心效果。 最后,通过在main函数中创建爱心窗口的实例,并调用show函数显示窗口,即可展示出爱心图案。 总之,通过使用Qt的图形库和绘图功能,结合C++语言编写代码,我们可以实现一个简单的爱心程序。这个程序可以创建一个自定义窗口,并在窗口上绘制出漂亮的爱心图案。这是一个很好的练习,也能为我们的编程技能和创造力增添乐趣。 ### 回答2: Qt是一种跨平台的应用程序开发框架,可以用于开发桌面应用程序、移动应用程序和嵌入式应用程序等。Qt提供了丰富的库和工具集,使得开发者可以便捷地进行各种功能的实现。 要在Qt中使用爱心代码,可以按照以下步骤进行: 1. 创建一个新的Qt项目。可以选择Qt Creator等集成开发环境进行创建。在创建项目时,选择C++语言作为开发语言。 2. 打开项目后,在主窗口的设计视图中设计一个控件,作为显示爱心的容器。可以选择一个QPushButton控件作为例子。 3. 在源文件中,导入所需的头文件。 ```cpp #include <QPushButton> ``` 4. 为按钮设置一个槽函数,用于在用户点击按钮时触发显示爱心的操作。 ```cpp void showHeart() { QPushButton* button = qobject_cast<QPushButton*>(sender()); QString unicodeHeart = QString::fromUtf8("\u2665"); button->setText(unicodeHeart); } ``` 5. 在构造函数或其他需要的地方,将按钮与槽函数进行连接。 ```cpp QPushButton* button = new QPushButton("Click me"); connect(button, &QPushButton::clicked, this, &MyWindow::showHeart); ``` 6. 运行程序,点击按钮即可显示爱心图标。 通过以上步骤,我们可以在Qt中使用C++语言编程实现一个简单的爱心代码。当用户点击按钮时,爱心图标会显示在按钮上。当然,上述代码只是一个示例,开发者可以根据自己的具体需求进行修改和扩展。 ### 回答3: Qt爱心代码可以使用C++编程语言实现。下面是一个简单的示例代码: ```c++ #include <QApplication> #include <QWidget> #include <QPainter> #include <QTimer> class HeartWidget : public QWidget { public: HeartWidget(QWidget *parent = nullptr) : QWidget(parent) { resize(400, 400); timer = new QTimer(this); connect(timer, &QTimer::timeout, this, QOverload<>::of(&HeartWidget::update)); timer->start(100); } protected: void paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing, true); painter.setPen(Qt::NoPen); qreal width = 2 * height() / 3; qreal x = (this->width() - width) / 2; qreal y = (this->height() - height()) / 2; QPainterPath path; path.moveTo(qreal(x + width / 2), y + height() * 0.2); path.cubicTo(x + width * 0.7, y, x + width, y + height() * 0.5, x + width / 2, y + height()); path.cubicTo(x, y + height() * 0.5, x, y + height() * 0.2, x + width / 2, y + height() * 0.2); QGradientStops stops; stops << QGradientStop(0, Qt::red) << QGradientStop(0.5, Qt::white) << QGradientStop(1, Qt::red); QConicalGradient gradient(x + width / 2, y, 0); gradient.setStops(stops); painter.setBrush(gradient); painter.drawPath(path); } private: QTimer *timer; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); HeartWidget w; w.show(); return a.exec(); } ``` 这段代码使用了Qt的绘图功能来绘制一个爱心形状的图案。在`paintEvent`函数中,我们创建了一个`QPainter`对象,设置了抗锯齿效果,并设置了画笔为无笔画。 然后,我们确定了爱心的位置和尺寸,创建了一个`QPainterPath`对象来描述爱心的形状,并使用贝塞尔曲线来绘制出心形。 接下来,我们创建了一个`QConicalGradient`对象,并设置渐变色为红色到白色再到红色。将该渐变设置为画笔的刷子,并使用`drawPath`函数绘制出爱心图案。 在`main`函数中,我们创建了一个`QApplication`对象和一个`HeartWidget`对象,将`HeartWidget`显示在屏幕上。 运行该代码,将会在窗口中看到一个逐渐改变颜色的爱心图案。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

东.'

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

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

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

打赏作者

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

抵扣说明:

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

余额充值