Qt之实现移动的方块(蚂蚁线)

QT实现简单的2d游戏地图编辑器 QT实现简单的2d游戏地图编辑器 我写的这个地图编辑器主要实现了用键盘配合鼠标点击屏幕,间接生成一个二维数组,再将这个二维数组写入到文件中的操作,以直观、方便地对二维数组进行更改,以用作2d游戏的地图数组。 该程序最多向数组中添加19种(0-18)不同的数据。 运行效果: 创建初始地图界面: 地图编辑界面: 将地图数据写入到文件后地图信息界面: 除基本功能外,在程序中还实现了在按下移动鼠标左... 阅读详情

一、简介

移动的小方块或者说是类似移动的蚂蚁线,从一篇文章看到的,挺有趣的就自己做了一个,可以自由添加方块的个数,起始位置,方块的宽度,方块移动速度等待参数,下方是实现的代码,如果有需要新增的参数可以自行添加。

效果图

在这里插入图片描述

二、代码之路

AntsLineWidget.h

#pragma once

#include <QtWidgets/QWidget>
#include <QTimer>

class AntsLineWidget : public QWidget
{
    Q_OBJECT

public:
    AntsLineWidget(QWidget *parent = Q_NULLPTR);

    // 设置方块的宽度;
    void setBlockWidth(int width);

    // 根据起始位置生成方块;
    void generateBlockPath(int startPos);

    // 设置绿色位置;
    void setGreenPos(int greenPos);

    // 设置移动速度;
    void setMoveSpeed(int moveSeed);

private slots:
    // 更新位置;
    void updatePos();

private:
    void paintEvent(QPaintEvent *event);

    void resizeEvent(QResizeEvent *event);

private:
    // 方块移动时钟;
    QTimer m_moveTimer;
    // 方块绘制Path;
    QList<QPainterPath> m_blockPathList;
    // 方块宽度;
    int m_blockWidth;
    // 方块变绿位置;
    int m_greenPos;
    // 方块移动速度;
    int m_moveSpeed;
};


AntsLineWidget.cpp

#include "AntsLineWidget.h"
#include <QPainter>

#define SPACE_WIDTH 20

AntsLineWidget::AntsLineWidget(QWidget *parent)
    : QWidget(parent)
    , m_blockWidth(80)
    , m_greenPos(200)
    , m_moveSpeed(50)
{
    connect(&m_moveTimer, SIGNAL(timeout()), this, SLOT(updatePos()));
    m_moveTimer.start(m_moveSpeed);
}

void AntsLineWidget::setBlockWidth(int width)
{
    m_blockWidth = width;
}

void AntsLineWidget::generateBlockPath(int startPos)
{
    QPainterPath path;
    path.addRect(QRect(startPos, 2, m_blockWidth, this->height() - 3));
    m_blockPathList.append(path);
}

void AntsLineWidget::setGreenPos(int greenPos)
{
    m_greenPos = greenPos;
}

void AntsLineWidget::setMoveSpeed(int moveSpeed)
{
    m_moveSpeed = moveSpeed;
    m_moveTimer.setInterval(m_moveSpeed);
}

void AntsLineWidget::updatePos()
{
    for (int i = 0; i < m_blockPathList.count(); i++)
    {
        QPainterPath& path = m_blockPathList[i];
        // 移动步长;
        path.translate(QPoint(-2, 0));
        if (path.boundingRect().right() < SPACE_WIDTH)
        {
            QPainterPath pathNew;
            pathNew.addRect(QRect(this->width() - SPACE_WIDTH - m_blockWidth, 2, m_blockWidth, this->height() - 3));
            path = pathNew;
        }
    }

    update();
}

void AntsLineWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setPen(QPen(QColor(57, 141, 255), 3));

    painter.drawLine(QPoint(0, 0), QPoint(this->width(), 0));

    for (int i = 0; i < m_blockPathList.count(); i++)
    {
        QPainterPath path = m_blockPathList[i];
        if (path.boundingRect().left() < SPACE_WIDTH)
        {
            int headPathWidth = m_blockWidth - SPACE_WIDTH + path.boundingRect().left();
            int tailPathWidth = m_blockWidth - headPathWidth;
            QPainterPath newPath;
            newPath.addRect(QRect(SPACE_WIDTH, 2, headPathWidth, this->height() - 3));
            newPath.addRect(QRect(this->width() - SPACE_WIDTH - tailPathWidth, 2, tailPathWidth, this->height() - 3));
            if (newPath.contains(QPoint(m_greenPos, this->height() / 2)))
            {
                painter.fillPath(newPath, Qt::green);
            }
            else
            {
                painter.fillPath(newPath, Qt::gray);
            }
        }
        else
        {
            if (path.contains(QPoint(m_greenPos, this->height() / 2)))
            {
                painter.fillPath(path, Qt::green);
            }
            else
            {
                painter.fillPath(path, Qt::gray);
            }
        }
    }

    painter.setPen(QPen(Qt::red, 2));
    painter.drawLine(QPoint(m_greenPos, this->height() - 1), QPoint(m_greenPos, this->height() - 20));
    painter.setPen(QPen(QColor(57, 141, 255), 1));
    painter.drawLine(QPoint(SPACE_WIDTH, this->height() - 1), QPoint(this->width() - SPACE_WIDTH, this->height() - 1));
}

void AntsLineWidget::resizeEvent(QResizeEvent *event)
{
    for (int i = 0; i < m_blockPathList.count(); i++)
    {
        QPainterPath& path = m_blockPathList[i];
        QPainterPath pathNew;
        QRectF rect = path.boundingRect();
        rect.setHeight(this->height() - 3);
        pathNew.addRect(rect);
        path = pathNew;
    }
}

main.cpp

include "AntsLineWidget.h"
#include <QtWidgets/QApplication>
#include <QHBoxLayout>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 测试代码;
    QWidget * widget = new QWidget;
    QHBoxLayout* hLayout = new QHBoxLayout(widget);
    widget->resize(1000, 150);
    AntsLineWidget w(widget);
    w.generateBlockPath(20);
    w.generateBlockPath(160);
    w.generateBlockPath(300);
    hLayout->addWidget(&w);

    widget->show();
    return a.exec();
}


尾

以前就是全部的实现代码和测试代码,整个工程代码大家也可以加群311750285进行下载,更多好玩,有趣的在等着你 ^ _ ^ 。

控件闪烁_Qt编写自定义控件22-蚂蚁线 一、前言关于蚂蚁线控件,相信很多用过PS的人都知道,在选中某个区域以后,边上的线条会有一种动态流动的效果,这种效果就叫做蚂蚁线,百科的解释是:动物的一种本能现象,领头的蚂蚁以随机的路线走向食物或洞穴,第二只蚂蚁紧跟其后以相同的路线行走,每一个后来的蚂蚁紧跟前面蚂蚁行走,排成一条线的现象。在图像影像软件中表示选区的动态虚线,因为虚线闪烁的样子像是一群蚂蚁在跑,所以俗称蚂蚁线。在Photoshop,A... 阅读详情

相关推荐

Qt之实现物体移动(QPainter)

【代码】Qt之实现物体移动(QPainter)

我不是码农的博客~~~ 1030

qt让图片自动沿着路线移动_用scratch做自动驾驶的四种方法

授权转载 |scratch思维训练gh_4c8856b43407原文作者 |冰比冰水冰原文标题 | 少儿创意编程(特27)用scratch来做自动驾驶标签:难度中级;人工智能;侦测;广播;旋转;自动驾驶;巡线行走;时下大家都在谈论人工智能,我们就用scratch来实现人工智能中较热门的自动驾驶吧!一、简单的在公路内移动。如上图,小车在白色的公路上自动行驶,碰到绿地会旋转方向。这是全...

weixin_36216860的博客 2486

“打造炫酷的蚂蚁线特效——Qt实现“

首先,我们需要引入Qt的绘图类QPainter。在类的构造函数中,我们需要创建一个定时器,用于不断刷新界面的蚂蚁线特效。接下来,我们需要定义一个QPainterPath类型的成员变量,用于保存蚂蚁线路径。在定时器的槽函数中,将画笔设置为红色,并绘制蚂蚁线路径。完成以上步骤后,我们需要在界面上显示出蚂蚁线特效,这可以通过QWidget窗口部件的paintEvent方法来实现。在本文中,我们将使用Qt框架来打造一个炫酷的蚂蚁线特效,并附上相应的源代码。通过以上的步骤,我们已经成功地实现了一个简单的蚂蚁线特效。

TechRoar的博客 467

QT绘制动态蚂蚁线

#ifndef WIDGET_H #define WIDGET_H #include #include #include #include class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); protected: void paintEvent(QPaintEvent *event) override; void timerEvent(QTimerEvent *e

SUPERAIN丶的博客 1084

Qt/C++编写自定义控件22-蚂蚁线

一、前言 关于蚂蚁线控件,相信很多用过PS的人都知道,在选中某个区域以后,边上的线条会有一种动态流动的效果,这种效果就叫做蚂蚁线,百科的解释是:动物的一种本能现象,领头的蚂蚁以随机的路线走向食物或洞穴,第二只蚂蚁紧跟其后以相同的路线行走,每一个后来的蚂蚁紧跟前面蚂蚁行走,排成一条线的现象。在图像影像软件中表示选区的动态虚线,因为虚线闪烁的样子像是一群蚂蚁在跑,所以俗称蚂蚁线。在Photoshop,...

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 2030

Qt自定义控件之蚂蚁线——实现拖动选区的动态边框效果

在这个示例中,我们创建了一个Widget类,处理鼠标点击、移动和释放事件,并在鼠标拖动期间调用AntLine的setRect函数更新其位置和大小。这时候,我们可以通过绘制一条“蚂蚁线”的方式,让用户预览拖动后的选区位置和大小,从而更加直观地进行操作。在AntLine的构造函数中,我们需要初始化一些变量,如蚂蚁线的颜色、线宽等信息。最后,我们需要提供一个接口函数setRect,用于外部传入选区的位置、大小和角度信息,并在其中调用update函数更新蚂蚁线的显示。完整的源代码请见附录。

CyberBladeX的博客 333

【Qt】蚂蚁线绘制实现

蚂蚁线是一种常见的UI元素,用于表示选择区域或边界,具有动态移动的虚线效果

weixin_43510208的博客 651

Qt画动画蚂蚁线框.zip

用Qt画类似PhotoShop中的蚂蚁线

Qt编写自定义控件22-蚂蚁线

一、前言 关于蚂蚁线控件,相信很多用过PS的人都知道,在选中某个区域以后,边上的线条会有一种动态流动的效果,这种效果就叫做蚂蚁线,百科的解释是:动物的一种本能现象,领头的蚂蚁以随机的路线走向食物或洞穴,第二只蚂蚁紧跟其后以相同的路线行走,每一个后来的蚂蚁紧跟前面蚂蚁行走,排成一条线的现象。在图像影像软件中表示选区的动态虚线,因为虚线闪烁的样子像是一群蚂蚁在跑,所以俗称蚂蚁线。在Photoshop,...

weixin_34375251的博客 235

Qt蚂蚁线-表格

QTableWidget单元格蚂蚁线,类似于excel复制时的蚂蚁线。讲解文章:https://www.cnblogs.com/swarmbees/p/9288902.html

INMP441麦克风与ESP32的I2S音频采集实战指南

本文提供了INMP441数字麦克风与ESP32开发板通过I2S接口进行高质量音频采集的完整实战指南。详细讲解了硬件连接、软件配置、数据读取及基础处理,并分享了常见的避坑技巧与性能优化建议,帮助开发者快速构建物联网音频应用。

weixin_28396629的博客 598

qt定时器暂停与重新开始_Qt编写自定义控件22-蚂蚁线

一、前言关于蚂蚁线控件,相信很多用过PS的人都知道,在选中某个区域以后,边上的线条会有一种动态流动的效果,这种效果就叫做蚂蚁线,百科的解释是:动物的一种本能现象,领头的蚂蚁以随机的路线走向食物或洞穴,第二只蚂蚁紧跟其后以相同的路线行走,每一个后来的蚂蚁紧跟前面蚂蚁行走,排成一条线的现象。在图像影像软件中表示选区的动态虚线,因为虚线闪烁的样子像是一群蚂蚁在跑,所以俗称蚂蚁线。在Photoshop,A...

weixin_39900468的博客 625

基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统

增加了模型的绑定,利用Mediapipe这个强大的库可以实现识别面部表情的捕捉和人体结构运动的捕捉,基于以上的特性加入到Unity的人物模型中,实现实时的面部表情和人体运行的捕捉

BIgbossyii的博客 1万+

qt 橡皮筋线

在图形编辑应用中常会用到橡皮筋线,如选择图形的某个区域等,最常见的就是在系统桌面上用鼠标拖动,可以绘制一个类似蚂蚁线的选区,并且选区线能够跟随鼠标的移动而伸缩,因此叫作橡皮筋线。 qt 中用于描绘橡皮筋线的类是QRubberBand,当然单有一个QRubberBand 类还是不能做出橡皮筋的效果出来, 另外还要有鼠标事件的配合,与QRubberBand 配合的鼠标事件有 鼠标单击,拖动...

mike_digilink的专栏 3918

python 成语接龙-连接数据库

from xpinyin import Pinyin import pymysql while 1: conn = pymysql.connect( host='localhost', #本地连接 user='root', #数据库账户名 password='password', #数据库密码 db='dic',

Hero2902的博客 598

V.PhyloMaker实战:从物种列表到维管束植物系统发育树的完整流程

本文详细介绍了使用V.PhyloMaker工具包,从物种列表快速构建维管束植物系统发育树的完整实战流程。内容涵盖R包安装、物种名标准化、核心函数phylo.maker的三种构建方案选择、结果树的可视化与导出,以及与picante包的联动分析,为生态学和生物地理学研究提供了高效解决方案。

weixin_29057237的博客 376

Roson的Qt之旅#66 QPainter绘制滚动的圆环

QPainter绘制滚动的圆环,绘制动态图形,QPen设置自定义样式,QPen设置偏移

Allen Roson 1116

3D视觉-结构光测量-线结构光测量

线结构光测量中,由激光器射出的激光光束透过柱面透镜扩束,再经过准直,产生一束片状光。这片光束像刀刃一样横切在待测物体表面,因此线结构光法又被成为光切法。线结构光测量常采用二维面阵CCD作为接受器件,因此只要通过增加垂直于面阵探测器的第三维度方向,就可以实现对三维物体的测量。

qq_20660115的博客 3129

qt中橡皮筋类 QRubberBand

在图形编辑应用中常会用到橡皮筋线,如选择图形的某个区域等,最常见的就是在系统桌面上用鼠标拖动,可以绘制一个类似蚂蚁线的选区,并且选区线能够跟随鼠标的移动而伸缩,因此叫作橡皮筋线。 qt 中用于描绘橡皮筋线的类是QRubberBand,当然单有一个QRubberBand 类还是不能做出橡皮筋的效果出来, 另外还要有鼠标事件的配合,与QRubberBand 配合的鼠标事件有 鼠标单击,拖动及释放

证券指标的专栏 8157

高通GAIA V3命令参考手册的研读学习(15):自定制命令的详细工作描述

里的示例一样,手机APP发出这个GetManuFacturer的命令发0x0000,那么耳机回复:0x8000, 同时在回复的playload部分,用最多15个字节的ACSII码来表达制造商信息(因此最多15个字母)。那么这个APP在通过GAIA协议控制这个耳机时,不仅可以通过前面讲过的vendor ID来识别,也可以更进一步通过这个命令来识别这个耳机,到底是不是本公司的。通过这个可变长度的playload,真的是可以传达极多的事先约定的信息,相当的灵活,真是不错!这个命令用来得到设备的制造商信息。

qq_37191547的博客 398

瑞数jsvmp算法还原流程讲解

​ 又是很久没写文章了,今天水一篇文章吧,鉴于之前有看到过别人的文章被警告的案例,所以这篇文章就仅写一下还原瑞数vmp的大概流程吧(仅记录下自己还原的思路)

博客 6608

VTK:利用qt实现体绘制剪裁

VTK:利用qt实现体绘制剪裁 做体绘制渲染一定少不了交互剪裁的功能。一般又两种方式: 搞一个包围盒,移动包围盒实现体渲染的剪裁 像小蚂蚁一样可以在屏幕画任意多边形实现剪裁 结果跟狗啃的一样主要是因为数据尺寸比较小(像素40* 40 * 40),直接抹黑像素肯定很烂 原文 VTK:利用qt实现体绘制剪裁 1 项目地址 在官方案例基础上改的 包围盒案例 https://kitware.github.io/vtk-examples/site/Cxx/Widgets/BoxWidget2/ 体渲染

Beyond欣 6428

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

QT 类及其实现效果(8)--橡皮筋线,Graphics view

一、选择图形的某个区域,绘制一个类似蚂蚁线的选区。使用类QRubberBand  if (!rubberBand)      rubberBand = new QRubberBand(QRubberBand::Rectangle, this);     rubberBand->setGeometry(QRect(origin, QSize()));     rubberBand->show

tianyu的专栏 - Linux site:blog.youkuaiyun.com/wishfly 1599

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

QT QList<T>介绍与应用、详解、使用说明、官方手册翻译

QT QList<T>介绍与应用、详解、使用说明、官方手册翻译

ken2232的博客 3431

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: Qt之如何使用matlab库对mat文件进行读写操作
下一篇: Qt小动画之实现控件上下移动
前行中的小猪
前行中的小猪 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄10年 4万+粉丝 134原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值