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 ...
随机推荐
- [转帖]Linux——Shell脚本参数传递的2种方法
https://www.cnblogs.com/caoweixiong/p/12334418.html 前言 平时会遇到很多脚本都有参数选项,类似: ./test.sh -f config.conf ...
- [转帖]【P1】Jmeter 准备工作
文章目录 一.Jmeter 介绍 1.1.Jmeter 有什么样功能 1.2.Jmeter 与 LoadRunner 比较 1.3.常用性能测试工具 1.4.性能测试工具如何选型 1.5.学习 Jme ...
- 【转帖】纳尼,mysqldump导出的数据居然少了40万?
0.导读 用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况? 本文约1500字,阅读时间约5分钟. 1.问题 我的朋友小文前几天遇到一个怪事,他 ...
- [转帖]如何升级vCenter(VCSA)补丁?
https://www.dinghui.org/upgrade-vcsa-patch.html VCSA的升级分为repo源和iso镜像两种方式,由于使用repo源进行升级只支持HTTPS和FTPS协 ...
- 【转帖】通过pip命令安装好包之后,在pycharm中不显示此库,也不能调用
目录 1. 问题描述 2. 解决方法1 3. 解决方法2 1. 问题描述 在cmd输入pip list 命令可以看到我的库都已经安装好了,但是pycharm中却没有显示. 在PyCharm查找,并没有 ...
- [转贴]使用dbstart 和dbshut 脚本来自动化启动和关闭数据库
使用dbstart 和dbshut 脚本来自动化启动和关闭数据库 https://www.cnblogs.com/snowers/p/3285281.htmldbshut 和 dbstart 使用db ...
- 下载 ingres-nginx
https://quay.io/repository/kubernetes-ingress-controller/nginx-ingress-controller-arm64?tag=latest&a ...
- pytest-assume插件-多重校验
自动化接口测试我们通常会对一条case设置多条断言,这样就会出现一个问题,如果前面一 个校验不通过,那么后面的校验就不会走到,如下图,可以看到校验走到assert False就不往 下走了,这个时候p ...
- web字体小于12px的解决办法
大家都知道,web端的字体在正常情况下,最小只能够是12px; 但是有些时候,可能需要字体小于12px 那么如何解决这个办法了 可以使用css3的缩放属性scale 如果字体的大小是10px; 那么我 ...
- jenkins上发布项目后将文件推送到另一台服务器build镜像
1.配置jenkins 1)主页面点击manage jenkins 2) 选择SystemConfiguration 3) 配置服务器信息,注意密码一定要输入对,还有端口有,一般是默认的22端口,但有 ...