QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备
注意这里的QWidget后面要改成QLabel
#include "mylabel.h"
#include <QDebug>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}
// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{
qDebug() << "鼠标进入了";
}
// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{
qDebug() << "鼠标离开了";
}
基于控件的
头文件
#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
// 鼠标进入
void enterEvent(QEvent *event);
// 鼠标离开
void leaveEvent(QEvent *);
// 鼠标放下和释放
virtual void mousePressEvent(QMouseEvent *ev);
virtual void mouseReleaseEvent(QMouseEvent *ev);
// 鼠标的移动
virtual void mouseMoveEvent(QMouseEvent *ev);
signals:
};
#endif // MYLABEL_H
cpp文件
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
}
// 鼠标进入
void myLabel::enterEvent(QEvent *event)
{
// qDebug() << "鼠标进入了";
}
// 鼠标离开
void myLabel::leaveEvent(QEvent *)
{
// qDebug() << "鼠标离开了";
}
// 鼠标放下和释放
void myLabel::mousePressEvent(QMouseEvent *ev)
{
// 鼠标左键按下打印
if(ev->button() == Qt::LeftButton){
QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
.arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
qDebug() << "鼠标释放";
}
// 鼠标的移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
if(ev->buttons() & Qt::LeftButton)
{
qDebug() << "鼠标移动";
}
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 重写定时器事件
void timerEvent(QTimerEvent *);
int id1; // 定时器1的唯一标识
int id2; // 定时器2的唯一标识
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);
// 启动定时器
// 参数1 间隔 单位 毫秒
id1 = startTimer(1000);
id2 = startTimer(2000);
}
void Widget::timerEvent(QTimerEvent * ev)
{
if(ev->timerId()==id1){
static int num =1;
// label1 每间隔1秒
ui->label_2->setText(QString::number(num++));
}
// label2 每间隔2s
if(ev->timerId()==id2){
static int num2 = 1;
ui->label_3->setText(QString::number(num2++));
}
// label3 每间隔3s
}
Widget::~Widget()
{
delete ui;
}
#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器
// 参数1 间隔 单位 毫秒
id1 = startTimer(1000);
id2 = startTimer(2000);
// 定时器的第二种方式,实例化,加到对象树上
QTimer *timer = new QTimer(this);
// 启动定时器
timer->start(500); // 每隔500ms
connect(timer,&QTimer::timeout,
[=](){
static int num = 1;
ui->label_4->setText(QString::number(num++));
});
// 点击暂停按钮,停止定时器
connect(ui->btnStop,&QPushButton::clicked,
[=](){
timer->stop();
});
}
void Widget::timerEvent(QTimerEvent * ev)
{
if(ev->timerId()==id1){
static int num =1;
// label1 每间隔1秒
ui->label_2->setText(QString::number(num++));
}
// label2 每间隔2s
if(ev->timerId()==id2){
static int num2 = 1;
ui->label_3->setText(QString::number(num2++));
}
// label3 每间隔3s
}
Widget::~Widget()
{
delete ui;
}
静态类型转换方法
bool myLabel::event(QEvent *e)
{
// 如果是鼠标按下,在event事件分发中做拦截操作
if(e->type()==QEvent::MouseButtonPress)
{
QString str1 = QString("鼠标按下了,在event事件分发中处理");
qDebug() << str1;
// 需要进行类型转换
QMouseEvent * ev = static_cast<QMouseEvent *>(e);
QString str = QString("鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
.arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
return true; // 代表用户自己处理,不向下分发
}
// 其他事件,交给父类处理,默认处理
return QLabel::event(e);
}
这里有两个参数,obj 和 e,一个用于判断控件,另一个用来判断事件
#include "widget.h"
#include "ui_widget.h"
#include <QTimer> // 定时器的类
#include <QDebug>
#include <QMouseEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器
// 参数1 间隔 单位 毫秒
id1 = startTimer(1000);
id2 = startTimer(2000);
// 定时器的第二种方式,实例化,加到对象树上
QTimer *timer = new QTimer(this);
// 启动定时器
timer->start(500); // 每隔500ms
connect(timer,&QTimer::timeout,
[=](){
static int num = 1;
ui->label_4->setText(QString::number(num++));
});
// 点击暂停按钮,停止定时器
connect(ui->btnStop,&QPushButton::clicked,
[=](){
timer->stop();
});
}
void Widget::timerEvent(QTimerEvent * ev)
{
if(ev->timerId()==id1){
static int num =1;
// label1 每间隔1秒
ui->label_2->setText(QString::number(num++));
}
// label2 每间隔2s
if(ev->timerId()==id2){
static int num2 = 1;
ui->label_3->setText(QString::number(num2++));
}
// 给label1安装事件过滤器
// 步骤1:安装事件的过滤器
ui->label->installEventFilter(this);
}
bool Widget::eventFilter(QObject * obj, QEvent * e){
if(obj == ui->label){
if(e->type() == QEvent::MouseButtonPress){
QMouseEvent * ev = static_cast<QMouseEvent *>(e);
QString str = QString("事件过滤器===鼠标按下了,x=%1,y=%2; global坐标为:x=%3,y=%4")
.arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
return true;
}
}
// 其他默认处理
return QWidget::eventFilter(obj,e);
}
Widget::~Widget()
{
delete ui;
}
新建一个窗口应用程序
选择MinGW32
void Widget::paintEvent(QPaintEvent *event){
// 实例化画家对象
QPainter painter(this); // this指定的是绘图设备
// 设置画笔
QPen pen(QColor(255,0,0));
pen.setWidth(2);
pen.setStyle(Qt::DotLine);
// 让画家使用笔
painter.setPen(pen);
// 设置画刷
QBrush brush(Qt::cyan);
brush.setStyle(Qt::Dense7Pattern);
//画家使用画刷
painter.setBrush(brush);
// 线
painter.drawLine(QPoint(0,0),QPoint(100,100));
// 画一个圆
painter.drawEllipse(QPoint(100,100),100,50); // 椭圆
// 画一个矩阵
painter.drawRect(QRect(20,20,50,50));
// 画文字
painter.drawText(QRect(10,200,200,50),"好好学习,天天吃饭");
}
painter.drawEllipse(QPoint(100,100),50,50);
// 设置抗锯齿能力,效率低
painter.setRenderHint(QPainter::Antialiasing);
painter.drawEllipse(QPoint(200,100),50,50);
painter.drawRect(QRect(20,20,50,50));
// 移动画家
painter.translate(100,0);
painter.drawRect(QRect(20,20,50,50));
////////////////// 高级的设置 ///////////////////////////
QPainter painter(this); // this指定的是绘图设备
// painter.drawEllipse(QPoint(100,100),50,50);
// // 设置抗锯齿能力,效率低
// painter.setRenderHint(QPainter::Antialiasing);
// painter.drawEllipse(QPoint(200,100),50,50);
painter.drawRect(QRect(20,20,50,50));
// 移动画家
painter.translate(100,0);
// 保存画家状态
painter.save();
painter.drawRect(QRect(20,20,50,50));
painter.translate(100,0);
// 还原画家的保存状态
painter.restore();
painter.drawRect(QRect(20,20,50,50));
右键,添加新文件
右键,open in Editor
int posX = 0; // 横坐标默认是0,每次点击右移
////////////////// 画家画图片 ////////////////
QPainter painter(this); // this指定的是绘图设备
// 如果超出屏幕,从0开始
if(posX > this->width()){
posX = 0;
}
painter.drawPixmap(posX,0,QPixmap(":/OtherSceneBg.png"));
#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);
// 声明画家
QPainter painter(&pix);
painter.setPen(QPen(Qt::green));
painter.drawEllipse(QPoint(150,150),100,100);
// 保存
pix.save("./qtpix.png");
}
Widget::~Widget()
{
delete ui;
}
// 修改填充颜色
pix.fill(Qt::white);
// QImage的使用
QImage img(300,300,QImage::Format_RGB32);
img.fill(Qt::gray);
// 声明画家,画家在 img 中画
QPainter painter(&img);
painter.setPen(QPen(Qt::red));
painter.drawEllipse(QPoint(150,150),100,100);
// 保存
img.save("./img.png");
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
// 利用QImage 对像素进行修改
QImage img;
img.load(":/Image/OtherSceneBg.png");
// 画之前修改像素点
for(int i=50;i<100;i++){
for(int j=50;j<100;j++){
QRgb value = qRgb(255,0,0);
img.setPixel(i,j,value);
}
}
painter.drawImage(0,0,img);
}
// QPicture 绘图设备,可以记录和重现绘图指令
QPicture pic;
QPainter painter;
painter.begin(&pic); // 开始进行画图
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150),100,100);
painter.end(); // 画图结束
// 保存
pic.save("./pic.wj");
// 进行重现
QPainter painter(this);
QPicture pic;
pic.load("./pic.wj");
painter.drawPicture(0,0,pic);
QT入门学习——从鼠标事件,定时器事件到绘图学习,绘图设备
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。