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秒+1
ui->label_2->setText( QString::number(num++));
}
if(ev->timerId() == id2)
{
static int num = 2;
//每隔2秒+1
ui->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秒+1
ui->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)
{
//开启鼠标实时的追踪 如果不开启 默认是按下鼠标移动才会触发mouseMoveEvent
setMouseTracking(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_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
//重写定时器事件
void timerEvent(QTimerEvent *ev);
int id1; //定时器1
int 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