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");

QT - Day 5的更多相关文章

  1. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  2. Ubuntu 下安装QT

    Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...

  3. Qt安装配置

    Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...

  4. Qt信号与槽自动关联机制

    参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...

  5. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  6. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  7. Qt——组件位置随窗口变化

    当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...

  8. (转) Qt 出现“undefined reference to `vtable for”原因总结

    由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...

  9. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  10. Qt 开启鼠标跟踪,自动激活mouseMoveEvent的问题

    最近在Qt上实现一个功能,鼠标在图片上移动,触发mouseMoveEvent事件,进而生成一个小的半透明窗口,放大显示以鼠标为中心的一个区域的图像并随鼠标移动.但是,必须鼠标摁下,才触发mouseMo ...

随机推荐

  1. [转帖]PostgreSQL 压测工具pgbench

    1.命令 pgbench --help pgbench is a benchmarking tool for PostgreSQL. Usage:   pgbench [OPTION]... [DBN ...

  2. [转帖]【mmap】深度分析mmap:是什么 为什么 怎么用 性能总结

    https://blog.csdn.net/bandaoyu/article/details/106750990 目录 有什么用? 1.文件映射 2.分配内存(匿名文件映射) mmap基础概念 mma ...

  3. [转帖]第5章 WINDOWS PE/COFF

    https://www.jianshu.com/p/35db9df2514f?utm_campaign=maleskine&utm_content=note&utm_medium=se ...

  4. qperf 简要总结 - 延迟与带宽信息

    总结 同一个虚拟机: 延迟: 12us 带宽: 6GB/S 同一个物理机上面的虚拟机: 延迟: 50us-100us 带宽: 1.2GB/S 同一个交换机上面的虚拟机: 延迟: 60us 带宽: 12 ...

  5. RN 动态渲染列表

    写在组件中 想要图片出来还应该给图片宽高哈!! alignItems: 'center', //水平居中 动态渲染列表 返回的是一个数组 网络图片的渲染方式 <Image source={{ur ...

  6. Gin 应用多实例部署session问题、session参数与刷新

    目录 一.Gin Session 存储的实现方案 二.memstore:基于内存的实现 2.1 基本使用 2.2 关键参数 三.使用redis:多实例部署 3.1 使用redis优势 3.2 基本使用 ...

  7. Gin CORS 跨域请求资源共享与中间件

    Gin CORS 跨域请求资源共享与中间件 目录 Gin CORS 跨域请求资源共享与中间件 一.同源策略 1.1 什么是浏览器的同源策略? 1.2 同源策略判依据 1.3 跨域问题三种解决方案 二. ...

  8. nodejs的npm改为国内源和参数

    npm源改为国内 此方法不需要安装cnpm也可以使用淘宝镜像,提高国内访问速度 由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源. npm config set registry h ...

  9. 19.8 Boost Asio 异或加密传输

    异或加密是一种对称加密算法,通常用于加密二进制数据.异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回0,如果不同则返回1.异或加密使用一把密钥将明文与密文进行异或运算,从而产生密文.同时, ...

  10. 14.5 Socket 应用组播通信

    组播通信是一种基于UDP协议的网络通信方式,它允许发送方将消息同时传递给多个接收方.在组播通信中,发送方和接收方都会加入一个共同的组播组,这个组播组对应一个特定的IP地址,所有加入该组播组的主机都能够 ...