Ⅰ.鼠标事件
1.创建一个QWidget窗口
2.创建一个MyLabel的模板
3.在widget.ui中添加一个label
4.将MyLabel提升
5.在mylabel.h文件中声明函数
1.鼠标进入函数
void enterEvent(QEvent *event);
2.鼠标离开函数
void leaveEvent(QEvent *);
3.鼠标摁下函数
void mousePressEvent(QMouseEvent *ev);
4.鼠标释放函数
void mouseReleaseEvent(QMouseEvent *ev);
5.鼠标移动函数
void mouseMoveEvent(QMouseEvent *ev);
6.在mylabel.cpp文件中重写以上函数
1.鼠标进入函数
void MyLabel::enterEvent(QEvent *event){
qDebug()<<"鼠标进入";
}
2.鼠标离开函数
void MyLabel::leaveEvent(QEvent *){
qDebug()<<"鼠标离开";
}
3.鼠标摁下函数
void MyLabel::mousePressEvent(QMouseEvent *ev){
if(ev->button() == Qt::LeftButton)
{
QString str = QString("鼠标摁下了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
4.鼠标释放函数
void MyLabel::mouseReleaseEvent(QMouseEvent *ev){
QString str = QString("鼠标释放了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
5.鼠标移动函数
void MyLabel::mouseMoveEvent(QMouseEvent *ev){
if(ev->buttons() & Qt::LeftButton)
{
QString str = QString("鼠标移动了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
7.解释
1.arg添加
QString str = QString("鼠标摁下了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
- ev->x()是相对于label的左上角的横坐标
- ev->x()是相对于label的右上角的纵坐标
- ev->globalX()是相对于桌面屏幕左上角的横坐标
- ev->globalY()是相对于桌面屏幕右上角的纵坐标
2.button和buttons、==和&
if(ev->button() == Qt::LeftButton)
if(ev->buttons() & Qt::LeftButton)
- 使用button 和 ==:鼠左键只要摁下就行
- 使用butons 和 & :只有鼠标左键摁下才行
Ⅱ.定时器
1.在widget.h文件中声明函数
void timerEvent(QTimerEvent *);
2.在widget.cpp文件中重写函数,并添加定时器
startTimer(1000);
void Widget::timerEvent(QTimerEvent * ){
static int num = 1;
ui->label_2->setText( QString::number(num++));
}
- 效果:1s中刷新一次,在label中从1开始递增
3.用变量标记定时器,使两个label拥有自己的定时器
1.在widget.h文件中声明变量
int ev1;
int ev2;
2.在widget.cpp文件中定位计时器
ev1 = startTimer(1000);
ev2 = startTimer(2000);
3.使对应的定时器标记对应的label
void Widget::timerEvent(QTimerEvent * ev){
if(ev->timerId() == ev1)
{
static int num = 1;
ui->label_2->setText( QString::number(num++));
}
if(ev->timerId() == ev2)
{
static int num = 1;
ui->label_3->setText( QString::number(num++));
}
}
4.另外一种定时器应用方法
QTimer * timer = new QTimer(this);
timer->start(500);
connect(timer, &QTimer::timeout, [=](){
static int num = 1;
ui->label_4->setText( QString::number(num++));
});
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});
Ⅲ.event事件
1.event分发和过滤总纲
2.event分发
1.在mylabel.h文件中声明函数
bool event(QEvent * e);
2.在mylabel.cpp文件中实现函数
bool MyLabel::event(QEvent * e){
if(e->type() == QEvent::MouseButtonPress){
QMouseEvent *ev = static_cast<QMouseEvent *>(e);
QString str = QString("EVENT鼠标摁下了 x = %1 y = %2 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;
}
return QLabel::event(e);//其他事件交给父类处理
}
3.event过滤
1.在widget.h文件中声明函数
bool eventFilter(QObject * obj,QEvent * e);
2.在widget.cpp文件中实现函数
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
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 globalX = %3 glablY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;
}
}
return QWidget::eventFilter(obj,e);
}
Ⅳ.绘图事件
1.基础
1.在widget.h中声明函数
void paintEvent(QPaintEvent *);
2.在widget.cpp中重写函数,实例化画家对象
void paintEvent(QPaintEvent *){
QPainter painter(this);
}
3.画线
painter.drawLine(QPoint(0,0), QPoint(100,100));
4.画椭圆
painter.drawEllipse( QPoint(100,100),50,50);
5.画矩形
painter.drawRect(QRect(20,20,50,50));
6.画文字
painter.drawText(QRect(10,200,100 ,50),"好好学习,天天向上");
7.设置画笔
1.设置画笔颜色
QPen pen(QColor(255,0,0));
painter.setPen(pen);//画家使用画笔
2.画笔宽度
pen.setWidth(3);
3.画笔风格
pen.setStyle(Qt::DotLine);
8.设置画刷
1.设置画刷类型
QBrush brush(Qt::cyan);
painter.setBrush(brush);//画家使用画刷
2.设置画刷风格
brush.setStyle(Qt::Dense6Pattern);
2.高级设置
1.抗锯齿
2.移动画家
painter.translate(100,0);
3.保存画家状态
painter.save();
4.还原画家状态
painter.restore();
3.手动调用绘图事件
1.画一幅画
QPainter painter(this); painter.drawPixmap(20,100,QPixmap(":/new/prefix2/image/2.jpeg"));
2.按钮操控画移动
- widget.cpp文件
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,[=](){
posX += 2;
});
}
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
posX += 2;
painter.drawPixmap(posX,100,QPixmap(":/new/prefix2/image/2.jpeg"));
}
- widget.h文件
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
void paintEvent(QPaintEvent *);
int posX = 0;//定义一个变量
4.绘图设备
1.QPixmap
-
设置绘图设备
QPixmap pix(300,300);
-
声明画家
QPainter painter(&pix);
-
画一个圆
painter.setPen(QPen(Qt::green)); painter.drawEllipse(QPoint(150,150),100,100); pix.save(("d:\\3.png"));
-
填充颜色
pix.fill(Qt::white);
2. 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(("d:\\img.png"));
3.QPicture(可以记录和重现绘图指令)
QPicture pic;
QPainter painter;
painter.begin(&pic);
painter.setPen(QPen(Qt::cyan));
painter.drawEllipse(QPoint(150,150) , 100, 100);
painter.end();
pic.save("E:\\pic.zt");
}
void Widget::paintEvent(QPaintEvent *){
QPainter painter(this);
QPicture pic;
pic.load("E:\\pic.zt");
painter.drawPicture(0,0,pic);
}
Ⅴ.文件读写
1.代码
connect(ui->pushButton, &QPushButton::clicked,[=](){
QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\lk\\Desktop");
ui->lineEdit->setText(path);
QFile file(path);
file.open(QIODevice::ReadOnly);
QByteArray array = file.readAll();
ui->textEdit->setText(array);
file.close();
});
2.编码格式
QTextCodec *codec = QTextCodec::codecForName("gbk");
ui->textEdit->setText( codec->toUnicode(array));
3.按行读
QByteArray array;
while(!file.atEnd()){
array += file.readLine();
}
4.文件之后追加
file.open(QIODevice::Append);
file.write("啊啊啊啊啊");
file.close();
5.QFileinfo文件信息读取
- 代码
QFileInfo info(path);
qDebug() << "大小" << info.size() << "后缀名" <<info.suffix() << "文件名称" <<info.fileName()<<"文件路径"<< info.filePath();
qDebug()<<"创建日期" <<info.created().toString("yyyy/MM/dd hh:mm:ss");
qDebug() <<"最后修改日期" <<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");
- 显示