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");
QT - Day 5的更多相关文章
- QT内省机制、自定义Model、数据库
本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...
- Ubuntu 下安装QT
Ubuntu 下安装QT 本文使用的环境 QT Library: qt-everywhere-opensource-src-4.7.4.tar.gz QT Creator: qt-creator-li ...
- Qt安装配置
Qt Creator: 下载: Qt 5.5.1 for Windows 32-bit(MinGW 4.9.2, 1.0 GB):http://download.qt.io/official_rele ...
- Qt信号与槽自动关联机制
参考链接1:http://blog.csdn.net/skyhawk452/article/details/6121407 参考链接2:http://blog.csdn.net/memory_exce ...
- 保持Qt GUI响应的几种方法
最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...
- Qt 中使用Singleton模式需小心
在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...
- Qt——组件位置随窗口变化
当我们用Qt Designer设计界面时,有时会面临这样一个问题:需要在窗口指定位置放置组件,并且当窗口位置大小改变时,该组件相对其父对象的位置是不变的,如下面两幅图所示 ,首先看上面这幅图,注意bu ...
- (转) Qt 出现“undefined reference to `vtable for”原因总结
由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...
- qt中ui的 使用介绍
1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...
- Qt 开启鼠标跟踪,自动激活mouseMoveEvent的问题
最近在Qt上实现一个功能,鼠标在图片上移动,触发mouseMoveEvent事件,进而生成一个小的半透明窗口,放大显示以鼠标为中心的一个区域的图像并随鼠标移动.但是,必须鼠标摁下,才触发mouseMo ...
随机推荐
- [转帖]什么是ClickHouse?
什么是ClickHouse? ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS). 在传统的行式数据库系统中,数据按如下顺序存储: Row WatchID JavaEn ...
- [转帖]vCenter使用 VMCA 续订证书:续订证书时发生意外错误
https://www.dinghui.org/vcenter-sts-certificate.html 起因:有一处客户vCenter告警:STS签名证书即将过期. 处理办法:系统管理-证书-证书管 ...
- [转帖]Elasticsearch 技术分析(五):如何通过SQL查询Elasticsearch
https://www.cnblogs.com/jajian/p/10053504.html 前言# 这篇博文本来是想放在全系列的大概第五.六篇的时候再讲的,毕竟查询是在索引创建.索引文档数据生成和一 ...
- 解决Word等打开嵌入的文件提示 包含有害内容 无法打开的问题
最近打开文件时提示: 从网上找了一下 最简单的解决办法是: 新建一个文件, 输入如下内容 导入注册表 每次打开时不进行 文件有效性的检查即可. 为了省事 我多加了几个版本的 如果是excel 将 w ...
- postman中monitor的使用
monitor就是一个摸鱼的功能,我们把写好的接口部署到postman的web服务器中, 绑定自己的邮箱,运行结果会发送到自己的邮箱中,不用实时监控,是个非常方便 的功能(不安全) 1.crete a ...
- 图学习初探Paddle Graph Learning 构建属于自己的图【系列三】
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5000517?contributionType=1 如遇到问题查看原项目解决 图学习温故 ...
- 9.0 Python 内置模块应用
Python 是一种高级.面向对象.通用的编程语言,由Guido van Rossum发明,于1991年首次发布.Python 的设计哲学强调代码的可读性和简洁性,同时也非常适合于大型项目的开发.Py ...
- MySQL 权限与备份管理(精简笔记)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...
- 在K8S中,Pod亲和性概念是什么?
在Kubernetes(简称K8S)中,Pod亲和性和反亲和性(Affinity and Anti-Affinity)是集群调度策略的重要组成部分,它们用于控制Pod如何与节点或其他Pod相对应地放置 ...
- C# WinForm线程里操作控件
做winform程序,避免不了的要在线程里控制窗体上的控件,直接在子线程里操作控件会报错"线程间操作无效,从不是创建控件***的线程访问它". 解决方法: private void ...