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. [转帖]什么是ClickHouse?

    什么是ClickHouse? ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS). 在传统的行式数据库系统中,数据按如下顺序存储: Row WatchID JavaEn ...

  2. [转帖]vCenter使用 VMCA 续订证书:续订证书时发生意外错误

    https://www.dinghui.org/vcenter-sts-certificate.html 起因:有一处客户vCenter告警:STS签名证书即将过期. 处理办法:系统管理-证书-证书管 ...

  3. [转帖]Elasticsearch 技术分析(五):如何通过SQL查询Elasticsearch

    https://www.cnblogs.com/jajian/p/10053504.html 前言# 这篇博文本来是想放在全系列的大概第五.六篇的时候再讲的,毕竟查询是在索引创建.索引文档数据生成和一 ...

  4. 解决Word等打开嵌入的文件提示 包含有害内容 无法打开的问题

    最近打开文件时提示: 从网上找了一下 最简单的解决办法是: 新建一个文件, 输入如下内容 导入注册表 每次打开时不进行 文件有效性的检查即可. 为了省事 我多加了几个版本的 如果是excel  将 w ...

  5. postman中monitor的使用

    monitor就是一个摸鱼的功能,我们把写好的接口部署到postman的web服务器中, 绑定自己的邮箱,运行结果会发送到自己的邮箱中,不用实时监控,是个非常方便 的功能(不安全) 1.crete a ...

  6. 图学习初探Paddle Graph Learning 构建属于自己的图【系列三】

    项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5000517?contributionType=1 如遇到问题查看原项目解决 图学习温故 ...

  7. 9.0 Python 内置模块应用

    Python 是一种高级.面向对象.通用的编程语言,由Guido van Rossum发明,于1991年首次发布.Python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发.Py ...

  8. MySQL 权限与备份管理(精简笔记)

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...

  9. 在K8S中,Pod亲和性概念是什么?

    在Kubernetes(简称K8S)中,Pod亲和性和反亲和性(Affinity and Anti-Affinity)是集群调度策略的重要组成部分,它们用于控制Pod如何与节点或其他Pod相对应地放置 ...

  10. C# WinForm线程里操作控件

    做winform程序,避免不了的要在线程里控制窗体上的控件,直接在子线程里操作控件会报错"线程间操作无效,从不是创建控件***的线程访问它". 解决方法: private void ...