鱼C论坛

 找回密码
 立即注册
查看: 5011|回复: 2

[争议讨论] 用QT绘图动态画个正方形

[复制链接]
发表于 2017-2-17 15:01:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这只是我自己练习写的一个程序,其实做动画,QT有专用的qt quick application创建文件,用QML做出有很流畅效果的动画来。我因为是初学先练一下简单的线程绘图,里面有许多BUG只供大家参考
widget.cpp
  1. #include "widget.h"
  2. #include "ui_widget.h"

  3. Widget::Widget(QWidget *parent) :
  4.     QWidget(parent),
  5.     ui(new Ui::Widget)
  6. {
  7.     ui->setupUi(this);
  8.     time = new QTimer(this);

  9.     connect(ui->pushButton,&QPushButton::clicked,this,&Widget::startT);//启动计时器
  10.     initOne();//线程初始化
  11.     connect(this,&Widget::destroyed,this,&Widget::closeThread);//程序退出后关闭进程
  12. }

  13. Widget::~Widget()
  14. {
  15.     delete ui;
  16. }
  17. void Widget::getImage(QImage image)
  18. {
  19.     myImage = image;
  20.     update();
  21. }

  22. void Widget::paintEvent(QPaintEvent *)
  23.    {
  24.     QPainter p(this);
  25.     p.drawImage(50,50,myImage);
  26.    }
  27. void Widget::closeThread()
  28.    {
  29.        thread->quit();
  30.        thread->wait();
  31.        delete myt;

  32.    }
  33. void Widget::initOne()
  34.    {
  35.        myt = new MyThread;//给我新建的继承QObject的类分配空间
  36.        thread = new QThread(this);//创建一个线程对象
  37.        myt->moveToThread(thread);//把我的对象挂载到线程上
  38.        thread->start();//启动线程
  39.        /*通过每秒发送QTimer的timeout信号来调用我线程里画图函数*/
  40.        connect(time,&QTimer::timeout,myt,&MyThread::drawImage);
  41.        /*画图函数里发送的信号来给getImage槽函数传值*/
  42.        connect(myt,&MyThread::updataImage,this,&Widget::getImage);

  43.    }
  44. void Widget::startT()
  45.    {
  46.        time->start(100);
  47.    }


  48. void Widget::on_pushButton_2_clicked()//通过ui界面的转到槽功能来停止计时器
  49. {
  50.     time->stop();
  51. }
复制代码

mythread.cpp
  1. #include "mythread.h"
  2. #include <Qt>
  3. #include <QPainter>
  4. #include <qmath.h>
  5. MyThread::MyThread(QObject *parent) : QObject(parent)
  6. {


  7.     x1=10,y1=10,x2=10,y2=10;

  8.     points[0]=QPoint(10,10);
  9.     points[1]=QPoint(10,90);



  10. }
  11. void MyThread::drawImage()
  12. {

  13.     QImage image(100,100,QImage::Format_ARGB32);
  14.     QPen pen(Qt::SolidLine);
  15.     pen.setColor(Qt::red);
  16.     pen.setWidth(5);
  17.     p = new QPainter(&image);
  18.     p->setPen(pen);
  19.     drawLine();
  20.     emit updataImage(image);
  21.     delete p;

  22. }
  23. /*以下画方形的代码BUG很多
  24. * 我只是瞎写的~
  25. */
  26. void MyThread::drawLine()
  27. {
  28.     if(y2<90&&x2==10)
  29.     {

  30.         p->drawLine(x1,y1,x2,y2);
  31.         y2++;

  32.     }else if(x2<90&&y2>10)
  33.     {
  34.        p->drawPolyline(points,2);
  35.        p->drawLine(10,90,x2,y2);
  36.         x2++;
  37.     }else if(y2>10&&x2==90)
  38.     {
  39.         points[2] = QPoint(90,90);
  40.         p->drawPolyline(points,3);
  41.         p->drawLine(90,90,x2,y2);
  42.         y2--;
  43.     }else
  44.     {
  45.         points[3] = QPoint(90,10);
  46.         p->drawPolyline(points,4);
  47.         p->drawLine(90,10,x2,y2);
  48.         x2--;
  49.     }
  50. }


复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
不二如是 + 5 + 5 Q Canvas。。。

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-17 15:02:59 | 显示全部楼层
widget.h
  1. #ifndef WIDGET_H
  2. #define WIDGET_H

  3. #include <QWidget>
  4. #include "mythread.h"
  5. #include <QThread>
  6. #include <QEvent>
  7. #include <QPainter>
  8. #include <QTimer>
  9. namespace Ui {
  10. class Widget;
  11. }

  12. class Widget : public QWidget
  13. {
  14.     Q_OBJECT

  15. public:
  16.     explicit Widget(QWidget *parent = 0);
  17.     ~Widget();

  18. private:
  19.     Ui::Widget *ui;
  20.     MyThread *myt;
  21.     QThread *thread;
  22.     QImage myImage;
  23.     QTimer *time;
  24.     void getImage(QImage image);
  25.     void getImage2(QImage image);
  26.     void closeThread();
  27.     void initOne();
  28.     void startT();
  29. protected:
  30.     void paintEvent(QPaintEvent *);
  31. private slots:
  32.     void on_pushButton_2_clicked();
  33. };

  34. #endif // WIDGET_H
复制代码


mythread.h
  1. #ifndef MYTHREAD_H
  2. #define MYTHREAD_H

  3. #include <QObject>
  4. #include <QImage>
  5. #include <QPen>
  6. #include <QPainter>
  7. #include <QMutex>

  8. class MyThread : public QObject
  9. {
  10.     Q_OBJECT
  11. public:
  12.     explicit MyThread(QObject *parent = 0);
  13.     void drawImage();

  14. signals:
  15.     void updataImage(QImage image);
  16. private:

  17.     QPainter *p;
  18.     int x1,y1,x2,y2;
  19.     QPoint points[];

  20.     void drawLine();


  21. public slots:
  22. };

  23. #endif // MYTHREAD_H
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-14 09:51:43 | 显示全部楼层
跟着楼主学qt
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-28 02:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表