1. 定时器
1.1 定时器1
事件:void timerEvent(QTimerEvent *ev)
启动定时器:startTimer(1000) 单位ms
startTimer的返回值是定时器的唯一标识 使用ev->timerId() == id2比较
#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);//启动定时器//参数1 间隔 单位 毫秒id1 = startTimer(1000);id2 = startTimer(2000);}//实现void Widget::timerEvent(QTimerEvent *ev){//设置未静态局部变量if(ev->timerId() == id1){static int num = 1;//每隔1秒+1ui->label_2->setText( QString::number(num++));}if(ev->timerId() == id2){static int num = 2;//每隔2秒+1ui->label_3->setText( QString::number(num++));}}Widget::~Widget(){delete ui;}
1.2 定时器类
//定时器第二种方式QTimer *time = new QTimer(this);time->start(500);connect(time, &QTimer::timeout, [=](){static int num = 1;//每隔1秒+1ui->label_4->setText( QString::number(num++));});//停止时间connect(ui->pushButton, &QPushButton::clicked, [=](){time->stop();});
2.event事件分发器和过滤器
2.1 事件分发器
#include "mylabel.h"#include <QDebug>Mylabel::Mylabel(QWidget *parent) : QLabel(parent){//开启鼠标实时的追踪 如果不开启 默认是按下鼠标移动才会触发mouseMoveEventsetMouseTracking(true);}//鼠标进入时间void Mylabel::enterEvent(QEvent *event){qDebug() << "鼠标进入";}//鼠标离开时间void Mylabel::leaveEvent(QEvent *event){qDebug() << "鼠标离开";}//鼠标移动void Mylabel::mouseMoveEvent(QMouseEvent *ev){// &if(ev->buttons() & Qt::LeftButton)qDebug() << "鼠标移动";}//鼠标按下void Mylabel::mousePressEvent(QMouseEvent *ev){//QString格式化输出 1 2 对应的是位置 位置是基于控件的//QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->x()).arg(ev->y());//相当于屏幕的//鼠标左键if(ev->button() == Qt::LeftButton){QString str = QString("鼠标按下了 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}}//鼠标释放void Mylabel::mouseReleaseEvent(QMouseEvent *ev){qDebug() << "鼠标释放";}.//事件分发器bool Mylabel::event(QEvent *e){//鼠标按下,在event中进行拦截操作if(e->type() == QEvent::MouseButtonPress){QMouseEvent *ev = static_cast<QMouseEvent *>(e);QString str = QString("Event鼠标按下了 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());qDebug() << str;//代表用户自己处理,不进行分发return true;}//其它事件交给父类默认处理return QLabel::event(e);}
2.2* 事件过滤器(补充点)
在事件分发到事件分发器前,进行过滤
1.给控件安装事件过滤器
2.重写eventfilter事件
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QTimer>#include <QDebug>namespace Ui {class Widget;}class Widget : public QWidget{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();//重写定时器事件void timerEvent(QTimerEvent *ev);int id1; //定时器1int id2; //定时器2//重写事件bool eventFilter(QObject *watched, QEvent *event);private:Ui::Widget *ui;};#endif // WIDGET_H
#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);//给label1 安装过滤器//1.给控件安装事件过滤器ui->label->installEventFilter(this);//2.重写eventfilter事件}bool Widget::eventFilter(QObject *watched, QEvent *event){//判断是哪个控件if(watched == ui->label){if(event->type() == QEvent::MouseButtonPress){QMouseEvent *ev = static_cast<QMouseEvent *>(event);QString str = QString("事件过滤器鼠标按下了 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());qDebug() << str;//代表用户自己处理,不进行分发return true;}}//其它默认处理return QWidget::eventFilter(watched, event);}
3.绘图事件
3.1 基本操作
1.绘图事件 void paintEvent(QPaintEvent *event) 会自动调用
2.声明画家的对象 QPainter painter(this); this指定画布
3.画线、圆、矩形、文字等
4.设置画笔 QPen 设置宽度 风格等
5.设置画刷,画刷的风格
#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);}void Widget::paintEvent(QPaintEvent *event){//自动调用//实例一个画家对象 this制定绘图的画布QPainter painter(this);//设置画笔QPen pen(QColor(255, 0, 0));//设置画笔风格pen.setStyle(Qt::DotLine);//设置画刷QBrush brush(Qt::green);//设置风格brush.setStyle(Qt::Dense4Pattern);//画家使用画刷painter.setBrush(brush);//画家使用笔painter.setPen(pen);//画了一个线painter.drawLine(QPoint(0, 0), QPoint(100, 100));//画圆 椭圆painter.drawEllipse(QPoint(100, 100), 50, 50);//画矩形painter.drawRect(QRect(20, 20, 50, 50));//写字painter.drawText(QRect(10,200,150,100), "好好学习,天天向上");}Widget::~Widget(){delete ui;}
3.2 高级操作
1.抗锯齿 setRenderHint
2.移动画家位置 translate
3.保存画家位置 save
4.还原状态restore
void Widget::paintEvent(QPaintEvent *event){/* 高级设置 */QPainter painter(this);// painter.drawEllipse(QPoint(100, 50), 50 ,50);// //设置抗锯齿 效率变低// painter.setRenderHint(QPainter::Antialiasing);// painter.drawEllipse(QPoint(200, 50), 50, 50);//画矩形painter.drawRect(QRect(20, 20, 50, 50));//画家移动位置painter.translate(100, 0);//保存画家状态painter.save();painter.drawRect(QRect(20, 20, 50, 50));//还原状态painter.restore();painter.drawRect(QRect(10, 20, 50, 50));}
3.3手动调用绘图事件
使用pinter来添加图片
可以设置图片移动
#include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);//点击移动按钮,移动图片connect(ui->pushButton, &QPushButton::clicked, [=](){//手动调用绘图事件,有update更新posX += 20;this->update();});//定时器QTimer *timer = new QTimer(this);timer->start(200);connect(timer, &QTimer::timeout, [=](){posX += 20;this->update();});}void Widget::paintEvent(QPaintEvent *event){QPainter painter(this);//超出屏幕 从0开始if(posX > this->width()){posX = 0;}painter.drawPixmap(posX ,20, QPixmap(":/Image/Luffy.png"));}Widget::~Widget(){delete ui;}
3.4 绘图设备(画布)
绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别
是QPixmap、QBitmap、QImage和QPicture。其中,
- QPixmap专门为图像在屏幕上的显示做了优化
- QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。
- QImage专门为图像的像素级访问做了优化。 ->比较强大
- QPicture则可以记录和重现QPainter的各条命令。 ->记录步骤
3.4.1QPixmap
QPixmap pix(300, 300);
QPainter painter(&pix);
painter.setPen(QPen(Qt::green));
painter.drawEllipse(QPoint(150, 150), 100, 100);
#include "widget.h"#include "ui_widget.h"#include <QPixmap>#include <QPainter>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);//pixmap 绘图设备 专门为平台做了显示的优化QPixmap pix(300, 300);//填充颜色pix.fill(Qt::white);QPainter painter(&pix);painter.setPen(QPen(Qt::green));painter.drawEllipse(QPoint(150, 150), 100, 100);//保存到电脑上pix.save("/home/haitao/pix.png");}Widget::~Widget(){delete ui;}
3.4.1 QImage
同理
//多个一个选择颜色的值QImage img(300, 300, QImage::Format_RGB32);img.fill(Qt::white);QPainter painter(&img);painter.setPen(QPen(Qt::blue));painter.drawEllipse(QPoint(150, 150), 100, 100);img.save("/home/haitao/img.png");
此外Image可以对像素进行访问
#include "widget.h"#include "ui_widget.h"#include <QPixmap>#include <QPainter>#include <QImage>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);}//绘图事件void Widget::paintEvent(QPaintEvent *event){QPainter painter(this);//利用QImage 对像素修改QImage img;img.load(":/Image/Luffy.png");//修改像素点for(int i = 50; i< 100; i++){for(int j = 0; j< 100; j++){QRgb value = qRgb(255, 0, 0);img.setPixel(i, j ,value);}}painter.drawImage(0, 0, img);}Widget::~Widget(){delete ui;}
3.5 QPictue
Qpicture 用来记录和重现绘图的指令
#include "widget.h"#include "ui_widget.h"#include <QPixmap>#include <QPainter>#include <QImage>#include <QPicture>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);//QPicture 绘图设备 记录和重现绘图指令QPicture pic;QPainter painter;//开始画painter.begin(&pic);painter.setPen(QPen(Qt::cyan));painter.drawEllipse(QPoint(150, 150), 100, 100);//结束painter.end();//保存pic.save("/home/haitao/img.zt");}//绘图事件void Widget::paintEvent(QPaintEvent *event){QPainter painter(this);//重现绘图指令QPicture pic;pic.load("/home/haitao/img.zt");painter.drawPicture(0, 0, pic);}Widget::~Widget(){delete ui;}
qmake /sougou/QtXlsxWriter-master/qtxlsx.pro -spec linux-g++ CONFIG+=debug CONFIG+=qml_debug && /usr/bin/make qmake_all
