鼠标常用事件
鼠标进入 enterEvent
鼠标离开 leaveEvent
鼠标按下 mousePressEvent
鼠标释放 mouseReleaseEvent
鼠标移动 mouseMoveEvent
现创建一个Mylabel的c++类,然后在ui中弄一个Widget提升为MyLabel,在mylabel.h中继承QLabel:
mylabel.cpp文件检测状态
#include "mylabel.h"
#include<QDebug>
#include<QMouseEvent>
MyLabel::MyLabel(QWidget *parent)
: QLabel{parent}
{
//设置鼠标追踪状态,设置为true就可以不点击直接移动也可以追踪位置了
//this->setMouseTracking(true);
}
//鼠标进入
void MyLabel::enterEvent(QEnterEvent *event)
{
//qDebug()<<"鼠标进入了";
}
//鼠标离开
void MyLabel::leaveEvent(QEvent *event)
{
//qDebug()<<"鼠标离开了";
}
//鼠标按下事件
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
//如果是鼠标左键按下才打印信息
if(ev->button() == Qt::LeftButton)
{
QString str = QString(" 鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug()<< str;
}
}
//鼠标释放事件
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
QString str = QString(" 鼠标离开了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug()<< str;
}
//鼠标移动事件
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
//鼠标移动是一段距离
if(ev->buttons() & Qt::LeftButton)
{
QString str = QString(" 鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug()<< str;
}
}
事件分发器
event事件分发器,用于分发事件,在这里也可以做拦截,返回值bool如果返回的是true代表拦截处理,不在向下分发。
//事件分发器
bool MyLabel::event(QEvent *e)
{
if(e->type() == QEvent::MouseButtonPress)
{
//转换
QMouseEvent * ev = static_cast<QMouseEvent*>(e);
QString str = QString("在event中 鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
qDebug()<< str;
return true; //拦截事件,不向下分发事件
}
//其他事件交给父类
return QLabel::event(e);
}
事件过滤器
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//利用事件过滤器 拦截label的鼠标按下事件
//1、先给控件安装过滤器
ui->label->installEventFilter(this);
//2、重写过滤器事件
}
//过滤器事件
//参数一 判断控件 参数二 判断事件
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->x()).arg(ev->y());
qDebug()<< str;
return true; //拦截事件,不向下分发事件
}
//其他事件交给父类
return QWidget::eventFilter(watched,event);
}
}
定时器事件QTimerEvent
事件名称:void timerEvent(QTimerEvent *event);
由于每个计时器有单独的标号,所以使用两个计时器的话就可以用标号来区分。
效果:
代码:
#include "widget.h"
#include "ui_widget.h"
#include<QTimerEvent>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//启动定时器
this->m_Id1 = startTimer(1000); //单位是毫秒
this->m_Id2 = startTimer(2000);
}
//定时器事件
void Widget::timerEvent(QTimerEvent *event)
{
if(event->timerId()==m_Id1)
{
static int num=1;
ui->label->setText(QString::number(num++));
}
if(event->timerId()==m_Id2)
{
static int num2=1;
ui->label_2->setText(QString::number(num2++));
}
}
Widget::~Widget()
{
delete ui;
}
定时器类QTimer
这个比定时器对象更常用
效果:
代码:
//定时器类
QTimer * timer = new QTimer(this);
timer->start(500);
//监听定时器对象的信号
connect(timer,&QTimer::timeout,[=](){
static int num=1;
ui->label_3->setText(QString::number(num++));
});
补充:还可以在旁边放置一个暂停按钮,实现定时器的暂停
//点击暂停按钮,停止定时器
connect(ui->btn_stop,&QPushButton::clicked,[=](){
timer->stop();
});
基本绘图操作paintEvent
重写绘图事件:void paintEvent(QPaintEvent *event);
画家对象QPainter
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
//重写绘图事件
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::Dense4Pattern);
//画家使用画刷
painter.setBrush(brush);
//画线 编译器自动调用
painter.drawLine(QPoint(0,0),QPoint(100,100));
//画圆
painter.drawEllipse(QPoint(100,100),50,50);
//画矩形
painter.drawRect(QRect(20,20,50,50));
//写字
painter.setFont(QFont("华文彩云",20));
painter.drawText(QRect(0,200,300,100),"今天不能在偷懒了");
}
Widget::~Widget()
{
delete ui;
}
高级绘图操作
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
posX=0;
//点击移动按钮 移动图片
connect(ui->btn_move,&QPushButton::clicked,[=](){
posX+=10;
//重新画图 手动调用绘图事件
update();
});
//实现自动图片向右移动 定时器
QTimer * timer = new QTimer(this);
timer->start(1); //时间
connect(timer,&QTimer::timeout,[=](){
posX++;
update();
});
}
//重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
//要有画家
QPainter painter(this); //this代表绘图的设备,画家向当前窗口画画
//高级绘图///
// painter.drawEllipse(QPoint(200,150),100,100);
// 设置抗锯齿效果
// painter.setRenderHint(QPainter::Antialiasing);
// painter.drawEllipse(QPoint(500,150),100,100);
// painter.drawRect(QRect(100,300,50,50));
// painter.translate(100,0);//移动画家
// painter.save(); //保存状态
// painter.drawRect(QRect(100,300,50,50));
// painter.translate(100,0);//移动画家
// painter.restore(); //恢复状态
// painter.drawRect(QRect(100,300,50,50));
//画成品图案
QPixmap pix;
pix.load(":/Image/picture.ico");
if(posX > this->width())
{
//重置
posX = -pix.width();
}
painter.drawPixmap(posX,50,pix);
//基本绘图///
// //画笔
// QPen pen(QColor(255,0,0));
// //设置画笔的宽度
// pen.setWidth(2);
// //设置画笔的风格
// pen.setStyle(Qt::DotLine);
// //画家使用画笔
// painter.setPen(pen);
// //画刷 可以填充封闭的图案
// QBrush brush(Qt::cyan);
// //设置画刷风格
// brush.setStyle(Qt::Dense4Pattern);
// //画家使用画刷
// painter.setBrush(brush);
// //画线 编译器自动调用
// painter.drawLine(QPoint(0,0),QPoint(100,100));
// //画圆
// painter.drawEllipse(QPoint(100,100),50,50);
// //画矩形
// painter.drawRect(QRect(20,20,50,50));
// //写字
// painter.setFont(QFont("华文彩云",20));
// painter.drawText(QRect(0,200,300,100),"今天不能在偷懒了");
}
Widget::~Widget()
{
delete ui;
}
绘图设备
QImage与QPixmap的区别:
QPixmap主要用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O、图片访问和像素修改而设计的
QPixmap依赖于所在平台的绘图引擎,所以会有不同的显示效果,而QImage则相反
QImage是独立于硬件的
QPicture是一个可以记录和重现QPainter的命令的绘图设备,与平台无关,后缀名可以自定义。
#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//QPixmap做绘图设备
QPixmap pix(300,300);
pix.fill(Qt::white); //填充色
QPainter painter(&pix);
painter.setPen(QPen(Qt::gray));
painter.drawEllipse(QPoint(150,150),100,100);
pix.save("D:\\pix.png"); //保存在磁盘上
//QImage做绘图设备 专门为像素级的访问做优化
QImage img(300,300,QImage::Format_ARGB32);
img.fill(Qt::white);
QPainter painter(&pix);
painter.setPen(QPen(Qt::gray));
painter.drawEllipse(QPoint(150,150),100,100);
img.save("D:\\img.png"); //保存在磁盘上
//QPicture做绘图设备 记录和重现画家的绘图指令
QPicture pic;
QPainter painter;
painter.begin(&pic);
painter.setPen(QPen(Qt::cyan));
painter.drawEllipse(QPoint(150,150),100,100);
painter.end();
pic.save("D:\\pic.zt");
}
void Widget::paintEvent(QPaintEvent *event)
{
//重现QPicture的绘图指令
QPainter painter(this);
QPicture pic;
pic.load("D:\\pic.zt");
painter.drawPicture(0,0,pic);
}
Widget::~Widget()
{
delete ui;
}
文件读写QFile
#include "widget.h"
#include "ui_widget.h"
#include<QFileDialog> //文件对话框
#include<QMessageBox>
#include<QFile>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击选择文件按钮,弹出文件对话框,读取桌面文件,文件路径放入到lineEdit中,内容放在TextEdit中
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString filePath = QFileDialog::getOpenFileName(this,"打开文件","D:\\Desktop","(*.txt)");
//如果路径为空,即按了取消按钮
if(filePath.isEmpty())
{
QMessageBox::warning(this,"警告","路径不能为空");
}else{
ui->lineEdit->setText(filePath);
//读取文件信息
QFile file(filePath);
//指定打开的方式
file.open(QIODeviceBase::ReadOnly);
QByteArray arr;
//arr = file.readAll(); //读取全部信息
arr=file.readLine(); //读取单行数据
while(!file.atEnd())
{
arr+=file.readLine();
}
ui->textEdit->setText(arr);
//关闭文件
file.close();
//写文件
file.open(QIODevice::WriteOnly);
file.write("结束");
file.close();
}
});
}
Widget::~Widget()
{
delete ui;
}
效果:
文件信息读取QFileInfo
//文件信息类
QFileInfo info(filePath);
qDebug()<<"后缀名:"<<info.suffix().toUtf8().data()<<"大小:"<<info.size()
<<"文件名:"<<info.fileName()<<"文件路径:"<<info.filePath();
qDebug()<<"最后修改日期:"<<info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
可以显示文件的信息