1. 定时器

timerEvent

1.1 定时器1

事件:void timerEvent(QTimerEvent *ev)
启动定时器:startTimer(1000) 单位ms
startTimer的返回值是定时器的唯一标识 使用ev->timerId() == id2比较

  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. //启动定时器
  9. //参数1 间隔 单位 毫秒
  10. id1 = startTimer(1000);
  11. id2 = startTimer(2000);
  12. }
  13. //实现
  14. void Widget::timerEvent(QTimerEvent *ev)
  15. {
  16. //设置未静态局部变量
  17. if(ev->timerId() == id1)
  18. {
  19. static int num = 1;
  20. //每隔1秒+1
  21. ui->label_2->setText( QString::number(num++));
  22. }
  23. if(ev->timerId() == id2)
  24. {
  25. static int num = 2;
  26. //每隔2秒+1
  27. ui->label_3->setText( QString::number(num++));
  28. }
  29. }
  30. Widget::~Widget()
  31. {
  32. delete ui;
  33. }

1.2 定时器类

  1. //定时器第二种方式
  2. QTimer *time = new QTimer(this);
  3. time->start(500);
  4. connect(time, &QTimer::timeout, [=](){
  5. static int num = 1;
  6. //每隔1秒+1
  7. ui->label_4->setText( QString::number(num++));
  8. });
  9. //停止时间
  10. connect(ui->pushButton, &QPushButton::clicked, [=](){
  11. time->stop();
  12. });

2.event事件分发器和过滤器

不建议拦截
image.png

2.1 事件分发器

  1. #include "mylabel.h"
  2. #include <QDebug>
  3. Mylabel::Mylabel(QWidget *parent) : QLabel(parent)
  4. {
  5. //开启鼠标实时的追踪 如果不开启 默认是按下鼠标移动才会触发mouseMoveEvent
  6. setMouseTracking(true);
  7. }
  8. //鼠标进入时间
  9. void Mylabel::enterEvent(QEvent *event)
  10. {
  11. qDebug() << "鼠标进入";
  12. }
  13. //鼠标离开时间
  14. void Mylabel::leaveEvent(QEvent *event)
  15. {
  16. qDebug() << "鼠标离开";
  17. }
  18. //鼠标移动
  19. void Mylabel::mouseMoveEvent(QMouseEvent *ev)
  20. {
  21. // &
  22. if(ev->buttons() & Qt::LeftButton)
  23. qDebug() << "鼠标移动";
  24. }
  25. //鼠标按下
  26. void Mylabel::mousePressEvent(QMouseEvent *ev)
  27. {
  28. //QString格式化输出 1 2 对应的是位置 位置是基于控件的
  29. //QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());
  30. //相当于屏幕的
  31. //鼠标左键
  32. if(ev->button() == Qt::LeftButton)
  33. {
  34. QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());
  35. qDebug() << str;
  36. }
  37. }
  38. //鼠标释放
  39. void Mylabel::mouseReleaseEvent(QMouseEvent *ev)
  40. {
  41. qDebug() << "鼠标释放";
  42. }
  43. .//事件分发器
  44. bool Mylabel::event(QEvent *e)
  45. {
  46. //鼠标按下,在event中进行拦截操作
  47. if(e->type() == QEvent::MouseButtonPress)
  48. {
  49. QMouseEvent *ev = static_cast<QMouseEvent *>(e);
  50. QString str = QString("Event鼠标按下了 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());
  51. qDebug() << str;
  52. //代表用户自己处理,不进行分发
  53. return true;
  54. }
  55. //其它事件交给父类默认处理
  56. return QLabel::event(e);
  57. }

2.2* 事件过滤器(补充点)

在事件分发到事件分发器前,进行过滤
1.给控件安装事件过滤器
2.重写eventfilter事件

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QTimer>
  5. #include <QDebug>
  6. namespace Ui {
  7. class Widget;
  8. }
  9. class Widget : public QWidget
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit Widget(QWidget *parent = 0);
  14. ~Widget();
  15. //重写定时器事件
  16. void timerEvent(QTimerEvent *ev);
  17. int id1; //定时器1
  18. int id2; //定时器2
  19. //重写事件
  20. bool eventFilter(QObject *watched, QEvent *event);
  21. private:
  22. Ui::Widget *ui;
  23. };
  24. #endif // WIDGET_H
  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. //给label1 安装过滤器
  9. //1.给控件安装事件过滤器
  10. ui->label->installEventFilter(this);
  11. //2.重写eventfilter事件
  12. }
  13. bool Widget::eventFilter(QObject *watched, QEvent *event)
  14. {
  15. //判断是哪个控件
  16. if(watched == ui->label)
  17. {
  18. if(event->type() == QEvent::MouseButtonPress)
  19. {
  20. QMouseEvent *ev = static_cast<QMouseEvent *>(event);
  21. QString str = QString("事件过滤器鼠标按下了 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());
  22. qDebug() << str;
  23. //代表用户自己处理,不进行分发
  24. return true;
  25. }
  26. }
  27. //其它默认处理
  28. return QWidget::eventFilter(watched, event);
  29. }

3.绘图事件

3.1 基本操作

1.绘图事件 void paintEvent(QPaintEvent *event) 会自动调用
2.声明画家的对象 QPainter painter(this); this指定画布
3.画线、圆、矩形、文字等
4.设置画笔 QPen 设置宽度 风格等
5.设置画刷,画刷的风格

  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. }
  9. void Widget::paintEvent(QPaintEvent *event)
  10. {
  11. //自动调用
  12. //实例一个画家对象 this制定绘图的画布
  13. QPainter painter(this);
  14. //设置画笔
  15. QPen pen(QColor(255, 0, 0));
  16. //设置画笔风格
  17. pen.setStyle(Qt::DotLine);
  18. //设置画刷
  19. QBrush brush(Qt::green);
  20. //设置风格
  21. brush.setStyle(Qt::Dense4Pattern);
  22. //画家使用画刷
  23. painter.setBrush(brush);
  24. //画家使用笔
  25. painter.setPen(pen);
  26. //画了一个线
  27. painter.drawLine(QPoint(0, 0), QPoint(100, 100));
  28. //画圆 椭圆
  29. painter.drawEllipse(QPoint(100, 100), 50, 50);
  30. //画矩形
  31. painter.drawRect(QRect(20, 20, 50, 50));
  32. //写字
  33. painter.drawText(QRect(10,200,150,100), "好好学习,天天向上");
  34. }
  35. Widget::~Widget()
  36. {
  37. delete ui;
  38. }

image.png

3.2 高级操作

1.抗锯齿 setRenderHint
2.移动画家位置 translate
3.保存画家位置 save
4.还原状态restore

  1. void Widget::paintEvent(QPaintEvent *event)
  2. {
  3. /* 高级设置 */
  4. QPainter painter(this);
  5. // painter.drawEllipse(QPoint(100, 50), 50 ,50);
  6. // //设置抗锯齿 效率变低
  7. // painter.setRenderHint(QPainter::Antialiasing);
  8. // painter.drawEllipse(QPoint(200, 50), 50, 50);
  9. //画矩形
  10. painter.drawRect(QRect(20, 20, 50, 50));
  11. //画家移动位置
  12. painter.translate(100, 0);
  13. //保存画家状态
  14. painter.save();
  15. painter.drawRect(QRect(20, 20, 50, 50));
  16. //还原状态
  17. painter.restore();
  18. painter.drawRect(QRect(10, 20, 50, 50));
  19. }

3.3手动调用绘图事件

使用pinter来添加图片
可以设置图片移动

  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. //点击移动按钮,移动图片
  9. connect(ui->pushButton, &QPushButton::clicked, [=](){
  10. //手动调用绘图事件,有update更新
  11. posX += 20;
  12. this->update();
  13. });
  14. //定时器
  15. QTimer *timer = new QTimer(this);
  16. timer->start(200);
  17. connect(timer, &QTimer::timeout, [=](){
  18. posX += 20;
  19. this->update();
  20. });
  21. }
  22. void Widget::paintEvent(QPaintEvent *event)
  23. {
  24. QPainter painter(this);
  25. //超出屏幕 从0开始
  26. if(posX > this->width())
  27. {
  28. posX = 0;
  29. }
  30. painter.drawPixmap(posX ,20, QPixmap(":/Image/Luffy.png"));
  31. }
  32. Widget::~Widget()
  33. {
  34. delete ui;
  35. }

3.4 绘图设备(画布)

绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别
是QPixmap、QBitmap、QImage和QPicture。其中,

  • QPixmap专门为图像在屏幕上的显示做了优化
  • QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。
  • QImage专门为图像的像素级访问做了优化。 ->比较强大
  • QPicture则可以记录和重现QPainter的各条命令。 ->记录步骤

image.png

3.4.1QPixmap

QPixmap pix(300, 300);
QPainter painter(&pix);
painter.setPen(QPen(Qt::green));
painter.drawEllipse(QPoint(150, 150), 100, 100);

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPixmap>
  4. #include <QPainter>
  5. Widget::Widget(QWidget *parent) :
  6. QWidget(parent),
  7. ui(new Ui::Widget)
  8. {
  9. ui->setupUi(this);
  10. //pixmap 绘图设备 专门为平台做了显示的优化
  11. QPixmap pix(300, 300);
  12. //填充颜色
  13. pix.fill(Qt::white);
  14. QPainter painter(&pix);
  15. painter.setPen(QPen(Qt::green));
  16. painter.drawEllipse(QPoint(150, 150), 100, 100);
  17. //保存到电脑上
  18. pix.save("/home/haitao/pix.png");
  19. }
  20. Widget::~Widget()
  21. {
  22. delete ui;
  23. }

image.png

3.4.1 QImage

同理

  1. //多个一个选择颜色的值
  2. QImage img(300, 300, QImage::Format_RGB32);
  3. img.fill(Qt::white);
  4. QPainter painter(&img);
  5. painter.setPen(QPen(Qt::blue));
  6. painter.drawEllipse(QPoint(150, 150), 100, 100);
  7. img.save("/home/haitao/img.png");

此外Image可以对像素进行访问

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPixmap>
  4. #include <QPainter>
  5. #include <QImage>
  6. Widget::Widget(QWidget *parent) :
  7. QWidget(parent),
  8. ui(new Ui::Widget)
  9. {
  10. ui->setupUi(this);
  11. }
  12. //绘图事件
  13. void Widget::paintEvent(QPaintEvent *event)
  14. {
  15. QPainter painter(this);
  16. //利用QImage 对像素修改
  17. QImage img;
  18. img.load(":/Image/Luffy.png");
  19. //修改像素点
  20. for(int i = 50; i< 100; i++)
  21. {
  22. for(int j = 0; j< 100; j++)
  23. {
  24. QRgb value = qRgb(255, 0, 0);
  25. img.setPixel(i, j ,value);
  26. }
  27. }
  28. painter.drawImage(0, 0, img);
  29. }
  30. Widget::~Widget()
  31. {
  32. delete ui;
  33. }

image.png

3.5 QPictue

Qpicture 用来记录和重现绘图的指令

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QPixmap>
  4. #include <QPainter>
  5. #include <QImage>
  6. #include <QPicture>
  7. Widget::Widget(QWidget *parent) :
  8. QWidget(parent),
  9. ui(new Ui::Widget)
  10. {
  11. ui->setupUi(this);
  12. //QPicture 绘图设备 记录和重现绘图指令
  13. QPicture pic;
  14. QPainter painter;
  15. //开始画
  16. painter.begin(&pic);
  17. painter.setPen(QPen(Qt::cyan));
  18. painter.drawEllipse(QPoint(150, 150), 100, 100);
  19. //结束
  20. painter.end();
  21. //保存
  22. pic.save("/home/haitao/img.zt");
  23. }
  24. //绘图事件
  25. void Widget::paintEvent(QPaintEvent *event)
  26. {
  27. QPainter painter(this);
  28. //重现绘图指令
  29. QPicture pic;
  30. pic.load("/home/haitao/img.zt");
  31. painter.drawPicture(0, 0, pic);
  32. }
  33. Widget::~Widget()
  34. {
  35. delete ui;
  36. }

qmake /sougou/QtXlsxWriter-master/qtxlsx.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug && /usr/bin/make qmake_all