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. [转帖]十步解析awr报告

    http://www.zhaibibei.cn/awr/1.1/ 从这期开始讲解awr报告的部分,首先讲解awr整体的部分 后续会针对不同的点进行讲解 1. 数据库细节 这部分可以看到 数据库的版本 ...

  2. [转帖]PG Exporter

    http://v0.pigsty.cc/zh/docs/reference/kernel-optimize/ Exporter https://github.com/Vonng/pg_exporter ...

  3. [转帖]badboy与jmeter的结合使用

    https://blog.csdn.net/weixin_41754309/article/details/107106855 欢迎关注[无量测试之道]公众号,回复[领取资源], Python编程学习 ...

  4. [转帖]kafka漏洞升级记录,基于SASL JAAS 配置和 SASL 协议,涉及版本3.4以下

    攻击者可以使用基于 SASL JAAS 配置和 SASL 协议的任意 Kafka 客户端,在对 Kafka Connect worker 创建或修改连接器时,通过构造特殊的配置,进行 JNDI 注入. ...

  5. Docker镜像精简方法之二 COPY vs ADD 与镜像层

    Docker镜像精简方法之二 COPY vs ADD 与镜像层 摘要 昨天只是讲了一下大体的思路. 但是没有实操. 今天想着修改一下默认的打包镜像的命令,验证一下效果 原始命令 FROM adopto ...

  6. Oracle 以及 达梦数据库简单查询所有表行数的存储过程

    1. 今天有一个场景需要查询一个数据库实例下面所有的表的行数. 本来想查询 user_tables 视图 但是发现 这个视图里面 达梦数据库 里面存的是null的.. 百度之后发现一个解决方案是 使用 ...

  7. 记录一次RPC服务有损上线的分析过程

    1. 问题背景 某应用在启动完提供JSF服务后,短时间内出现了大量的空指针异常. 分析日志,发现是服务依赖的藏经阁配置数据未加载完成导致.即所谓的有损上线或者是直接发布,当应用启动时,service还 ...

  8. Git - 关联远程仓库以及同时使用Lab和Hub

    更新一下,感觉有更简单的方式 就比如你git config 的 全局的name和email是lab的 那就clone github上的项目然后设置局部的name和email就行了 ********** ...

  9. dwm 美化

    在之前的博客中,我们将arch linux这个系统进行了一些美化,当然也是仅仅做到能看这个地步,要说跟网上其他那些惊艳的特效对比,肯定是不如的.但是我一直秉持一个观点,美化应该适可而止,只要不是丑的你 ...

  10. 同时配置github和gitee秘钥

    1.设置用户名和邮箱 git config --global --list 查看全局配置信息 git config --global --list 删除配置:必须删除该设置 git config -- ...