QT界面简单的图形移动和鼠标绘图

QT界面图形移动及鼠标绘图

0.首先头文件:

#include <QPainter>
#include <QMouseEvent>
#include <QKeyEvent>

1. 常用事件集合:

//绘图事件
void paintEvent(QPaintEvent *event);
//定时事件
void timerEvent(QTimerEvent *event);
//鼠标按下事件
void mousePressEvent(QMouseEvent *event);
//鼠标按下移动事件
void mouseMoveEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
//键盘按下事件
void keyPressEvent(QKeyEvent *event);

2. 使用鼠标画出图形(每次画一个图形);

2.1 在类中定义两个QPoint对象来存放点,并初始化为(0,0)
QPoint p1,p2;
p1 = QPoint(0,0);
p2 = QPoint(0,0);//QPoint构造函数
2.2 在鼠标按下事件中获取按下时的坐标点存入p1
p1 = event->pos();//event->pos()的返回值就是QPoint类
2.3 在鼠标移动事件中不断获得当前鼠标的点存入p2,然后调用update()函数刷新界面
p2 = event->pos();
update();//刷新界面
2.4 在绘图事件中画出线条
QLine line(p1,p2);
p.drawLine(line);
2.5 矩形和椭圆类似,获取的两个点分别是左上角顶点和右下角顶点。
QRect rect(p1,p2);
p.drawRect(rect);

3. 在2的基础上画出图形并留在界面上

3.1 思路是使用一个容器将之前画的线条或者矩形存放在容器中。
QList<QLine> lines;//Qt容器
3.2 在每次鼠标释放后将两个点确定的线条存放进容器中
lines.append(QLine(p1,p2));
3.3 在每次调用绘图事件时就将容器中的所有线条都画出来即可。
p.drawLines(lines);

4. 让画出的矩形能随着时间移动

4.1 使用到了定时器事件:
    4.1.1 事件名:void timerEvent(QTimerEvent *event);
    4.1.2 开启事件timerId = startTimer(x)
    x为每隔多少秒调用该事件,单位毫秒。
    返回值是一个int型的定时器标签id
    4.1.3 停止定时器killTimer(timeId),关闭指定id的定时器
4.2 先开启定时器,在绘图事件中绘制出需要移动的矩形,记得要将矩形的某个量设置为变量。
QRect rect1(x,10,20,20);
QRect rect2(x+20,10,20,20);
QRect rect3(x+40,10,20,20);
p.drawRect(rect1);
p.drawRect(rect2);
p.drawRect(rect3);
4.3 在定时器事件中改变该变量的值,再调用update()函数
x += 5;
update();
4.4 同样思路可以用于扇形的旋转
 QRectF rectangle(10.0,10.0,width()-20,height()-40);
int startAngle = x * 16 ;
int spanAngle = 110 * 16;

p.drawPie(rectangle,startAngle,spanAngle);
4.5 加上键盘后可以简单的控制移动的暂停和开始
    4.5.1 使用键盘按下事件取到键值和空格对比,相同则暂停(killTimer()).
    4.5.2 需要一个标志位来显示当前的状态
    4.5.3 使用event->key()可以得到按下键的键值
if(event->key() == Qt::Key_Space)
    {
        //暂停启动定时器
        if(isrunning)
        {
            killTimer(timerId);
            isrunning = 0;
        }
        else
        {
            timerId = startTimer(100);
            isrunning = 1;
        }
    }
  • 11
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值