1.QT中的事件
1.1 鼠标的事件
- 需要自定义控件
#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 *event);
//鼠标按下
void mousePressEvent(QMouseEvent *ev);
//鼠标释放
void mouseReleaseEvent(QMouseEvent *ev);
//鼠标移动
void mouseMoveEvent(QMouseEvent *ev);
signals:
};
#endif // MYLABEL_H
#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>
myLabel::myLabel(QWidget *parent) : QLabel(parent)
{
//设置鼠标追踪
setMouseTracking(true);
}
//鼠标的进入事件
void myLabel::enterEvent(QEvent *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, globalX = %3, globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
}
//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
QString str = QString("鼠标释放了,x = %1, y = %2, globalX = %3, globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
}
}
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
// if(ev->buttons() & Qt::LeftButton) //移动是连续状态,用buttons 用&位与来判断
// {
QString str = QString("鼠标移动了,x = %1, y = %2, globalX = %3, globalY = %4").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str;
// }
}
1.2 定时器1
头文件
#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;
int id2;
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);
//启动计时器
connect(ui->timerBtn,&QPushButton::clicked,[=]()
{
id1 = startTimer(1000); //返回值是定时器id
id2 = startTimer(2000);
});
}
void Widget::timerEvent(QTimerEvent *ev)
{
if(ev->timerId() == id1)
{
static int num = 1;
//每隔一秒 +1
ui->label->setText(QString::number(num++));
}
else
{
//每隔两秒 +1
static int num1 = 1;
ui->label_2->setText(QString::number(num1++));
}
}
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);
//启动计时器
//定时器的第二种方式
QTimer * timer = new QTimer(this);
connect(ui->timerBtn,&QPushButton::clicked,[=]()
{
id1 = startTimer(1000);
id2 = startTimer(2000);
//启动定时器
timer->start(500);
connect(timer,&QTimer::timeout,[=](){
static int num2 = 1;
ui->label_3->setText(QString::number(num2++));
});
});
//暂停计时
connect(ui->pauseBtn,&QPushButton::clicked,[=]()
{
timer->stop();
});
}
void Widget::timerEvent(QTimerEvent *ev)
{
if(ev->timerId() == id1)
{
static int num = 1;
//每隔一秒 +1
ui->label->setText(QString::number(num++));
}
else
{
//每隔两秒 +1
static int num1 = 1;
ui->label_2->setText(QString::number(num1++));
}
}
Widget::~Widget()
{
delete ui;
}
1.3 QPainter
头文件
#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 paintEvent(QPaintEvent *event);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
源文件
#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)
{
//实例化画家对象 this指定绘图设备
QPainter painter(this);
//设置画笔
QPen pen(QColor(255,0,0));
//设置画笔的宽度
pen.setWidth(5);
//设置画笔风格
pen.setStyle(Qt::DotLine);
//画刷填充颜色
QBrush brush(QColor(0,255,0));
brush.setStyle(Qt::Dense7Pattern);
painter.setBrush(brush);
//让画家拿起笔
painter.setPen(pen);
painter.drawLine(QPoint(0,0),QPoint(100,100));
painter.drawEllipse(QPoint(100,100),50,50);
painter.drawRect(QRect(QPoint(0,0),QPoint(100,100)));
painter.drawText(QRect(200,200,150,150),"好好学习,天天向上");
}
Widget::~Widget()
{
delete ui;
}
1.4 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);
// painter.drawEllipse(QPoint(200,200),50,50);
// //设置抗锯齿能力 效率较低
// painter.setRenderHint(QPainter::Antialiasing);
// painter.drawEllipse(QPoint(200,300),50,50);
//矩形
painter.drawRect(QRect(200,200,50,50));
//移动画家
painter.translate(100,0);
//保存画家状态
painter.save();
painter.drawRect(QRect(200,200,50,50));
painter.translate(100,0);
//还原画家状态
painter.restore();
painter.drawRect(QRect(200,200,50,50));
}
Widget::~Widget()
{
delete ui;
}
1.5 手动调用绘图事件
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
connect(ui->pushButton,&QPushButton::clicked,[=](){
timer->start(1000);
connect(timer,&QTimer::timeout,[=](){
posX += 20;
//如果要手动调用绘图事件 用update更新
update();
});
});
connect(ui->pushButton_2,&QPushButton::clicked,[=](){
timer->stop();
});
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
//如果超出屏幕 从0开始
if(posX > this->width())
{
posX = 0;
}
painter.drawPixmap(posX,0,QPixmap(":/image/favicon.ico"));
}
Widget::~Widget()
{
delete ui;
}
1.6 绘图设备
- QPixmap专门为图像在屏幕上的显示做了优化
- QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用QPixmap的isQBitmap()来确定这个QBitmap是不是一个QBitmap
- QImage专门为图像的像素级访问做了优化
- QPicture则可以记录和重现QPainter的各条命令
头文件
#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 paintEvent(QPaintEvent *event);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
源文件
#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QImage>
#include <QDebug>
#include <QPicture>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// //Pixmap绘图设备
// QPixmap pix(300,300);
// //填充背景色
// pix.fill(Qt::transparent);
// //声明画家
// QPainter painter(&pix);
// painter.setPen(QPen(Qt::green));
// painter.drawEllipse(QPoint(150,150),100,100);
// //保存
// pix.save("E://pix.png");
// //QImage绘图设备 可以对像素进行访问
// QImage img(300,300,QImage::Format_RGB32);
// img.fill(Qt::white);
// QPainter painter(&img);
// painter.setPen(QPen(Qt::cyan));
// painter.drawEllipse(QPoint(150,150),100,100);
// img.save("E://img.png");
//QPicture 绘图设备
QPicture pic;
QPainter painter;
painter.begin(&pic);
painter.setPen(QPen(Qt::blue));
painter.drawEllipse(QPoint(150,150),100,100);
painter.end();
pic.save("E:\\pic.zt"); //记录了这些指令
}
void Widget::paintEvent(QPaintEvent *event)
{
// QPainter painter(this);
// //利用QImage 对像素进行修改
// QImage img;
// img.load(":/image/favicon.ico");
// //修改像素点
// for(int i = 0;i < 64 ; i++)
// {
// for (int j = 0;j < 64;j++) {
// if(img.pixelColor(i,j) != QColor(255,255,255))
// {
// QRgb value = qRgb(255,0,0);
// img.setPixel(i ,j, value);
// }
// // qDebug() << img.pixelColor(i,j);
// }
// }
// painter.drawImage(100,100,img);
//重现QPicture指令
QPainter painter(this);
QPicture pic;
pic.load("E:\\pic.zt");
painter.drawPicture(0,0,pic);
}
Widget::~Widget()
{
delete ui;
}
1.7 QFile 进行文件读写
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
#include <QTextCodec>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击选取文件按钮 弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\ShuaiZheng\\Desktop","*.txt");
//路径放入到lineEdit中
ui->lineEdit->setText(path);
//编码格式类
QTextCodec *codec = QTextCodec::codecForName("gbk");
//读取内容 放入到textEdit中
//QFile默认支持的格式是 UTF-8
QFile file(path);
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray array = file.readAll();
/*
QByteArray array;
while(!file.atEnd())
{
array += file.readLine();
}
*/
//将读取到的数据 放入textEdit
ui->textEdit->setText(array);
//ui->textEdit->setText(codec->toUnicode(array));
file.close();
//进行写文件
file.open(QIODevice::Append);//追加的方式进行写
file.write("aaaaaaaaa");
file.close();
});
}
Widget::~Widget()
{
delete ui;
}
1.8 QFileInfo文件信息读取
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QFile>
#include <QTextCodec>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//点击选取文件按钮 弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\ShuaiZheng\\Desktop","*.txt");
//路径放入到lineEdit中
ui->lineEdit->setText(path);
//编码格式类
//QTextCodec *codec = QTextCodec::codecForName("gbk");
//读取内容 放入到textEdit中
//QFile默认支持的格式是 UTF-8
QFile file(path);
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray array = file.readAll();
//将读取到的数据 放入textEdit
ui->textEdit->setText(array);
//ui->textEdit->setText(codec->toUnicode(array));
//QFileInfo文件信息类
QFileInfo info(path);
qDebug() << "大小:" << info.size() << "后缀名:" <<info.suffix()
<< "文件名:" <<info.fileName() << "文件路径:" << info.filePath();
qDebug() <<"创建日期:" <<info.birthTime().toString("yyyy/MM/dd HH:mm:ss")
<< "修改日期:" << info.lastModified().toString("yyyy-MM-dd HH:mm:ss");
});
}
Widget::~Widget()
{
delete ui;
}