QT - Day 5
1 event事件
- 用途:用于事件的分发
- 也可以做拦截操作,不建议
- bool event( QEvent * e);
- 返回值 如果是true 代表用户处理这个事件,不向下分发了
- e->type() == 鼠标按下 …
myLabel.cpp
#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 *) { // 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 ) { 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; } } 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 globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY()); qDebug() << str; return true; //true代表用户自己处理这个事件,不向下分发 } //其他事件 交给父类处理 默认处理 return QLabel::event(e); }
myLabel.h
#ifndef MYLABEL_H #define MYLABEL_H #include <QLabel> class myLabel : public QLabel { Q_OBJECT public: explicit myLabel(QWidget *parent = 0); //鼠标进入事件 void enterEvent(QEvent *event); //鼠标离开事件 void leaveEvent(QEvent *); //鼠标按下 virtual void mousePressEvent(QMouseEvent *ev); //鼠标释放 virtual void mouseReleaseEvent(QMouseEvent *ev); //鼠标移动 virtual void mouseMoveEvent(QMouseEvent *ev); //通过event事件分发器 拦截 鼠标按下事件 bool event(QEvent *e); signals: public slots: }; #endif // MYLABEL_H
2 事件过滤器
- 在程序将时间分发到事件分发器前,可以利用过滤器做拦截
- 步骤
1) 给控件安装事件过滤器
2) 重写 eventFilter函数 (obj , ev)
在widget.cpp中处理
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 * 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 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY()); qDebug() << str; return true; //true代表用户自己处理这个事件,不向下分发 } } //其他默认处理 return QWidget::eventFilter(obj,e); }
注意:要在widget.h中声明
//重写事件过滤器的事件
bool eventFilter(QObject *, QEvent *);
3 QPainter 绘图
- 绘图事件 void paintEvent()
- 声明一个画家对象 QPainter painter(this) this指定绘图设备
- 画线、画圆、画矩形、画文字
- 设置画笔 QPen 设置画笔宽度 、风格
- 设置画刷 QBrush 设置画刷 风格
4 QPainter高级设置
- 抗锯齿 效率低
- painter.setRenderHint(QPainter::Antialiasing);
- 对画家进行移动
1) painter.translate(100,0);
2) 保存状态 save
3) 还原状态 restore
- 如果想手动调用绘图事件 利用update
- 利用画家画图片 painter.drawPixmap( x,y,QPixmap( 路飞) )
3和4的代码集合
//widget.cpp #include "widget.h" #include "ui_widget.h" #include <QPainter> //画家类 #include <QTimer> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); //点击移动按钮,移动图片 connect(ui->pushButton,&QPushButton::clicked,[=](){ posX+=20; //如果要手动调用绘图事件 用update更新 update(); }); QTimer * timer = new QTimer(this); timer->start(10); connect(timer,&QTimer::timeout,[=](){ posX++; update(); }); } void Widget::paintEvent(QPaintEvent *) { // //实例化画家对象 this指定的是绘图设备 // QPainter painter(this); // //设置画笔 // QPen pen(QColor(255,0,0)); // //设置画笔宽度 // pen.setWidth(3); // //设置画笔风格 // 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) , 50,50); // //画矩形 // painter.drawRect(QRect(20,20,50,50)); // //画文字 // painter.drawText(QRect(10,200,150,50) , "好好学习,天天向上"); //////////////////////////////高级设置 /////////////////////////////// // 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.translate(100,0); // //还原画家保存状态 // painter.restore(); // painter.drawRect(QRect(20,20,50,50)); /////////////////////////////////利用画家 画资源图片 /////////////////// QPainter painter(this); QPixmap pix = QPixmap(":/Image/Luffy.png"); //如果超出屏幕 从0开始 if(posX >= this->width()) { posX = -pix.width(); } painter.drawPixmap(posX,0,pix); } Widget::~Widget() { delete ui; }
//wdget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); //绘图事件 void paintEvent(QPaintEvent *); int posX = 0; private: Ui::Widget *ui; }; #endif // WIDGET_H
5 QPaintDevice绘图设备
- QPixmap QImage QBitmap(黑白色) QPicture QWidget
- QPixmap 对不同平台做了显示的优化
- QPixmap pix( 300,300)
- pix.fill( 填充颜色 )
- 利用画家 往pix上画画 QPainter painter( & pix)
- 保存 pix.save( “路径”)
- Qimage 可以对像素进行访问
- 使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
- 其他流程和QPixmap一样
- 可以对像素进行修改 img.setPixel(i,j,value);
- QPicture 记录和重现 绘图指令
- QPicture pic
- painter.begin(&pic);
- 保存 pic.save( 任意后缀名 )
- 重现 利用画家可以重现painter.drawPicture(0,0,pic);
//widget.cpp #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); // //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("E:\\pix.png"); //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("E:\\img.png"); //QPicture 绘图设备 可以记录和重现 绘图指令 QPicture pic; QPainter painter; painter.begin(&pic); //开始往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); // //利用QImage 对像素进行修改 // QImage img; // img.load(":/Image/Luffy.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); QPainter painter(this); //重现QPicture的绘图指令 QPicture pic; pic.load("E:\\pic.zt"); painter.drawPicture(0,0,pic); } Widget::~Widget() { delete ui; }
//widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); //绘图事件 void paintEvent(QPaintEvent *); private: Ui::Widget *ui; }; #endif // WIDGET_H
6 QFile 对文件进行读写操作
- QFile进行读写操作
- QFile file( path 文件路径)
- 读
- file.open(打开方式) QIODevice::readOnly
- 全部读取 file.readAll() 按行读 file.readLine() atend()判断是否读到文件尾
- 默认支持编码格式 utf-8
- 利用编码格式类 指定格式 QTextCodeC
- QTextCodec * codec = QTextCodec::codecForName("gbk");
- ui->textEdit->setText( codec->toUnicode(array) );
- 文件对象关闭 close
- 写
1) file.open( QIODevice::writeOnly / Append)
2) file.write(内容)
3) file.close 关闭
//widget.cpp #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\\zhangtao\\Desktop"); //将路径放入到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("啊啊啊啊啊"); // file.close(); //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"); }); } Widget::~Widget() { delete ui; }
ui
7 QFileInfo 读取文件信息
- QFileInfo info(路径)
- 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");