C++Qt学习——QFile、QPainter、QChart

news2024/11/15 12:09:48

目录

1、QFile(文本读写)——概念

1.1、拖入三个控件,对pushButton进行水平布局,之后整体做垂直布局

1.2、按住控件,转到槽,写函数

1.3、打开文件控件

A、首先引入以下两个头文件

 B、设置点击打开文件控件之后,首先进入那个文件路径

C、设置要打开的文件

D、打开文件

E、Qstring的构造函数自动转换   

F、关闭文件

1.4、关闭文件控件

A、首先判断文件是否存在

B、以可读可写打开文件

C、字符串转换成QByteArray+写文本

D、关闭文件

E、清理文本框

1.5、演示

2、QFile案例——备忘录

A、打开备忘录的时候

B、点击编辑之后

2.1、首先打开UI,在界面里面拖入pushbutton控件,垂直水平弹簧以并设置垂直水平布局如下

A、改变pushbutton的样式表

2.2、添加Qdialog设计师界面类

A、添加设计师界面类

B、选择,设计类名

C、最终文件展示

D、设计newfiledialog.ui界面

E、改变Pushbutton的样式表

F、给PushButton添加Icon,并设计大小

G、PushButton转到槽

H、在cpp文件里面编写内容

 2.3、点击widget,弹出dialog

A、引入newfiledialog.h头文件

B、widget的pushbutton转到槽

C、发现运行点击了控件没效果,因为没有Show

D、引入QFile

E、点击控件,跳转到文本编写界面

​编辑

F、Qfile创建文件,根据事件创建文件夹的名称

 G、获取textdeit的内容

H、在widget.cpp里面调用

I、将文本内容转换成utf8

J、关闭文件

K、如果没有写文本,直接删除刚才创建的文本

L、设置存储路径

M、查看效果

 3、QPainter(画画)——概念

3.1、创建项目

A、查看QWidet的paintEvent虚函数

B、查看内置如何重写虚函数 

C、在widget.h里面重写虚函数

D、按住F4跳转

E、去除警告

F、声明一个画家

G、画形状

H、画出来的有锯齿状,希望画的圆润一点儿——设置抗锯齿

I、给画笔加颜色

J、填充图像

K、将画刷给画家

 L、将画笔给画家

M、看效果

4、QPainter(画画)——轮番文字

 4.1、创建项目文件,将widget的大小设置为400,100

4.2、在widget.h里面写虚函数以及定义变量

4.3、在widget.cpp里面定义虚函数

A、防止警告,设置画笔颜色,大小等

B、声明变量等于主界面的大小,即设置绘图区域    

C、 设置x坐标,可以通过setleft来改变的,但是最右边的是不改变的,要不然矩形就变小了 

D、定义一个时钟变量来滚动

E、获取文本长度

F、连接信号槽

G、滚动起来

H、查看效果

5、QChart(图表)

5.1、创建QChart项目,打开UI拖入Graphics View控件

5.2、右键点击提升为QChartView,将对象名称也改为chartview

5.3、拖入Label,并对其进行水平垂直布局

5.4、!!!!!!点击文件的.pro,在这里必须添加charts

5.5、在widget.h文件里面引入

5.6、打开widget.cpp进行代码编写

A、创建图表视图

B、创建图表

C、创建坐标轴添加内容  

D、设置坐标轴的范围

E、设置坐标轴的标题和显示的格式

F、添加坐标轴

G、设置标题以及图例

H、创建曲线

I、给图表添加曲线

J、 !!!!!将曲线的数据与坐标轴连接起来!!!!!!!注意,这个要在图表添加曲线之后

K、 将图表放置在图表视图里面显示

L、查看效果


1、QFile(文本读写)——概念

1.1、拖入三个控件,对pushButton进行水平布局,之后整体做垂直布局

1.2、按住控件,转到槽,写函数

1.3、打开文件控件

A、首先引入以下两个头文件

#include <QDebug>
#include <QFileDialog>

 B、设置点击打开文件控件之后,首先进入那个文件路径

   QString fileName =QFileDialog::getOpenFileName(this, "选中文本", "/home/fdd" );

C、设置要打开的文件

  file.setFileName(fileName);

D、打开文件

file->open(QIODevice::ReadWrite);

这里用if判断是否打开成功——以只读的方式

//是否返回成功
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug()<< "文本打开失败"<<endl;
        return;
    }

E、Qstring的构造函数自动转换   

 ui->textEdit->setPlainText(file.readAll());

F、关闭文件

file.close();

1.4、关闭文件控件

A、首先判断文件是否存在

 if(file.fileName().isEmpty())
    {
        return;
    }

B、以可读可写打开文件

 if(!file.open(QIODevice::ReadWrite))
    {
        qDebug()<< "文本打开失败"<<endl;
        return;
    }

C、字符串转换成QByteArray+写文本

    file.write(ui->textEdit->toPlainText().toUtf8());

D、关闭文件

   file.close();

E、清理文本框

    ui->textEdit->clear();

1.5、演示

2、QFile案例——备忘录

本节主要讲解如何使用QFile设计一个备忘录。动态创建文件按,无论文件是否存在都会创建。有内容则保存,没有内容则不保存。

A、打开备忘录的时候

B、点击编辑之后

2.1、首先打开UI,在界面里面拖入pushbutton控件,垂直水平弹簧以并设置垂直水平布局如下

A、改变pushbutton的样式表

QPushButton{
	border-image:url(:/icons/pen.png)
}
QPushButton:pressed{
	border-image:url(:/icons/pen_pressed.png)
}

2.2、添加Qdialog设计师界面类

A、添加设计师界面类

B、选择,设计类名

C、最终文件展示

D、设计newfiledialog.ui界面

拖入一个pushbutton控件和textEdit控件,并添加水平弹簧,再对其进行水平垂直布局

E、改变Pushbutton的样式表

QPushButton{
	border:none;
	color: #ffba1a;
}

QPushButton:pressed{	
	color: #ffb61a;
}

F、给PushButton添加Icon,并设计大小

G、PushButton转到槽

H、在cpp文件里面编写内容

void newfileDialog::on_pushButton_pressed()
{
    ui->pushButton->setIcon(QIcon(":/icons/back_pressed.png"));
}

void newfileDialog::on_pushButton_released()
{
    ui->pushButton->setIcon(QIcon(":/icons/back.png"));
}

void newfileDialog::on_pushButton_clicked()
{
    this->close();
}

 2.3、点击widget,弹出dialog

A、引入newfiledialog.h头文件

#include "newfiledialog.h"

B、widget的pushbutton转到槽

引入类

newfileDialog *newfiledialog= new newfileDialog(this);

C、发现运行点击了控件没效果,因为没有Show

    //将dialog铺满
    newfiledialog->resize(this->size());
    newfiledialog->show();
    //弹出dialog的时候,widget界面不可以操作
    newfiledialog->setModal(true);
    //循环
    newfiledialog->exec();
    delete newfiledialog;

D、引入QFile

#include <QFile>
#include <QDateTime>

E、点击控件,跳转到文本编写界面

F、Qfile创建文件,根据事件创建文件夹的名称

    QFile file;
    //随机命名
    file.setFileName(QDateTime::currentDateTime().toString("MMddhhmmss")+".txt");
    //创建文件,有就打开,没有就创建
    file.open(QIODevice::ReadWrite);

 G、获取textdeit的内容

怎么获取呢?那肯定是这块要去dialog哪里写

在newfiledialog.h里面定义文件

QString newfileDialog::getTextEditContent()
{
    return ui->textEdit->toPlainText();
}

H、在widget.cpp里面调用

创建一个对象,来接受获取到的内容

 QString tmp= newfiledialog->getTextEditContent();

I、将文本内容转换成utf8

file.write(tmp.toUtf8());

J、关闭文件

   file.close();

K、如果没有写文本,直接删除刚才创建的文本

    if(tmp.length()==0)
        file.remove();

L、设置存储路径

在linux下实在当前路径创建文件,在windows下就不一定了。

在main.cpp里面设置路径

//设置存储路径
#include <QDir>
//设置路径
    QDir::setCurrent(QApplication::applicationDirPath());

M、查看效果

 3、QPainter(画画)——概念

3.1、创建项目

A、查看QWidet的paintEvent虚函数

virtual void paintEvent(QPaintEvent *event);

B、查看内置如何重写虚函数 

 void SimpleExampleWidget::paintEvent(QPaintEvent *)
 {
     QPainter painter(this);
     painter.setPen(Qt::blue);
     painter.setFont(QFont("Arial", 30));
     painter.drawText(rect(), Qt::AlignCenter, "Qt");
 }

C、在widget.h里面重写虚函数

//override重写
    void paintEvent(QPaintEvent *event) override;

D、按住F4跳转

引入Qpainter

#include <QPainter>

E、去除警告

    Q_UNUSED(event);

F、声明一个画家

//this是指定给图的对象
    QPainter painter(this);

G、画形状

    //画矩形
    painter.drawRect(200, 100, 100, 100);

    //多边形
    QPolygon polygon;
    polygon.setPoints(3, 100,20, 200,50, 300,300);

    //画三角形
    painter.drawPolygon(polygon);

    //画直线
    painter.drawLine(400,400, 500,500);

    //画椭圆
    painter.drawEllipse(200,200, 50,100);

    //画文字
    //画文字的区域
    QRectF rectf(0,0, 200, 100);
    painter.drawText(rectf,"你好");
    //放在中间居中AlignCenter 水平居中AlignHCenter
    painter.drawText(rectf,Qt::AlignCenter,"你好");

    //画路径
    QPainterPath path;
    path.moveTo(20, 80);
    path.lineTo(20, 30);
    path.cubicTo(80, 0, 50, 50, 80, 80);

    painter.drawPath(path);

H、画出来的有锯齿状,希望画的圆润一点儿——设置抗锯齿

painter.setRenderHint(QPainter::Antialiasing);

I、给画笔加颜色

    //给画笔加颜色
    QPen pen;
    pen.setWidth(5);
    //pen.setColor(QColor("#888888"));
    pen.setColor(QColor(200, 100, 50));

J、填充图像

    QBrush brush(QColor(200, 100, 50));
    ///*brush.setColor(QColor("#888888")) 不可以用setcolor设置颜色*/;

K、将画刷给画家

  painter.setBrush(brush);

 L、将画笔给画家

    //将画笔给画家
    painter.setPen(pen);

M、看效果

4、QPainter(画画)——轮番文字

 4.1、创建项目文件,将widget的大小设置为400,100

4.2、在widget.h里面写虚函数以及定义变量

void paintEvent(QPaintEvent *event) override;
    QFont font;
    int  offset;
    QTimer *timer;
    QString textContent;
    //用变量接受文字的宽度
    int textcontentWidth;

4.3、在widget.cpp里面定义虚函数

A、防止警告,设置画笔颜色,大小等

Q_UNUSED(event);

    QPainter painter(this);

    QPen pen;
    pen.setColor(QColor(Qt::red));
    painter.setPen(pen);

    painter.setFont(font);

B、声明变量等于主界面的大小,即设置绘图区域    

QRectF rectf=this->rect();

C、 设置x坐标,可以通过setleft来改变的,但是最右边的是不改变的,要不然矩形就变小了 

    //offset偏移
    rectf.setLeft(this->rect().width()-offset);
 ,offset(0)
,textContent("CSDN欢迎您的到来!")

D、定义一个时钟变量来滚动

private slots:
    void onTimerTimeout();
 timer=new  QTimer(this);
    //启动 ms
    //定时X毫秒
    timer->start(10);
void Widget::onTimerTimeout()
{
    if(offset<this->width()+textcontentWidth)
        offset+=1;
    else
        offset=0;
    //特别重要,重新配置
    this->update();
}

E、获取文本长度

    //用变量接受文字的宽度
    int textcontentWidth;

在widget.cpp里引用

//计算文字的总长度
#include <QFontMetrics>
//显示文字的宽度计算
    QFontMetrics fontMetrics(font);
    textcontentWidth=fontMetrics.width(textContent);

F、连接信号槽

    connect(timer, SIGNAL(timeout()), this, SLOT(onTimerTimeout()));

G、滚动起来

 painter.drawText(rectf, Qt::AlignVCenter,textContent);

H、查看效果

5、QChart(图表)

5.1、创建QChart项目,打开UI拖入Graphics View控件

5.2、右键点击提升为QChartView,将对象名称也改为chartview

 

5.3、拖入Label,并对其进行水平垂直布局

最终界面如下

5.4、!!!!!!点击文件的.pro,在这里必须添加charts

5.5、在widget.h文件里面引入

//引入
#include <QChart>
//QChartView用于显示图表
#include <QChartView>
#include <QValueAxis>
//命名空间也得加进来,要不然有警告
QT_CHARTS_USE_NAMESPACE

5.6、打开widget.cpp进行代码编写

A、创建图表视图

因为在UI里面已经创建过了,这句代码可以不要

    //QChartView *chartview= new QChartView(this);

B、创建图表

    QChart * chart= new QChart();

C、创建坐标轴添加内容  

  //x和y轴
    QValueAxis *valueAxisX= new QValueAxis();
    QValueAxis *valueAxisY= new QValueAxis();

D、设置坐标轴的范围

    valueAxisX->setRange(0, 5000);
    valueAxisY->setRange(0, 100);

E、设置坐标轴的标题和显示的格式

    valueAxisX->setTitleText("时间/ms");
    valueAxisY->setTitleText("温度/°C");
    valueAxisX->setLabelFormat("%d");
    valueAxisY->setLabelFormat("%d");

    //将xY轴的格子设置的多一点儿
    valueAxisX->setTickCount(10);
    valueAxisY->setTickCount(10);

F、添加坐标轴

    //6、将坐标轴添加到图表里面
    chart->createDefaultAxes();
    chart->addAxis(valueAxisX, Qt::AlignBottom);
    chart->addAxis(valueAxisY, Qt::AlignLeft);

G、设置标题以及图例

因为我们也就一根曲线,所以就不用设置图例了,直接false

    chart->setTitle("温度与时间曲线");
    chart->legend()->setVisible(false);

H、创建曲线

引入头文件,我们使用曲线

#include <QSplineSeries>//曲线
#include <QLineSeries>//折线

创建线曲线对象添加他的点,设置曲线的颜色

    QSplineSeries *SplineSeries=new QSplineSeries();
    SplineSeries->append(0,50);
    SplineSeries->append(1000,60);
    SplineSeries->append(2000,80);
    SplineSeries->append(3000,50);
    SplineSeries->append(4000,60);
    SplineSeries->append(5000,30);
    SplineSeries->append(6000,20);

     QPen pen(QColor(0xff5566));
    SplineSeries->setPen(pen);

I、给图表添加曲线

    chart->addSeries(SplineSeries);

J、 !!!!!将曲线的数据与坐标轴连接起来!!!!!!!注意,这个要在图表添加曲线之后

    //附属到坐标轴上面去
    SplineSeries->attachAxis(valueAxisX);
    SplineSeries->attachAxis(valueAxisY);

K、 将图表放置在图表视图里面显示

    ui->chartview->setChart(chart);

L、查看效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建 es 集群

一、VMware准备机器 首先准备三台机器 这里我直接使用 VMware 构建三个虚拟机 都是基于 CentOS7 然后创建新用户 部署 es 需要单独创建一个用户&#xff0c;我这里在构建虚拟机的时候直接创建好了 然后将安装包上传 可以使用 rz 命令上传&#xff0c;也可以使用工具上传 工…

Apache Doris 如何基于自增列满足高效字典编码等典型场景需求

自增列&#xff08;auto_increment&#xff09;是数据库中常见的一项功能&#xff0c;它提供一种方便高效的方式为行分配唯一标识符&#xff0c;极大简化数据管理的复杂性。当新行插入到表中时&#xff0c;数据库系统会自动选取自增序列中的下一个可用值&#xff0c;并将其分配…

【路径规划】全局路径规划算法——A*算法(含python实现 | c++实现)

文章目录 参考资料1. 算法简介2. 算法精讲2.1 预处理2.2 开始搜索2.3 继续搜索2.4 确定实际路径 3. 算法总结3.1 算法步骤3.2 伪代码 4. python实现5. c实现 参考资料 Introduction to the A* Algorithm路径规划与轨迹跟踪系列算法Robotic Motion Planning Lectures A星算法详…

【附下载】3Ds Max从安装、配置到入门提高和高级用法

#3Ds Max 一、安装 1.1 安装说明 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1lwKMbgbE32wCL6PpMv706A?pwddll8 提取码&#xff1a;dll8 –来自百度网盘超级会员V2的分享 安装说明&#xff1a;文件夹里有安装说明 安装解压即可 关键就是将crack文件放到自己…

高架学习笔记之信息安全基础

目录 一、信息安全基础 1.1. 概念 1.2. 信息存储安全 1.3. 网络安全 二、信息安全系统的组成框架 三、信息加解密技术和数字签名 四、访问控制技术 五、信息安全的保障体系与评估方法 5.1. 计算机信息系统安全保护等级 5.2. 安全风险管理 一、信息安全基础 1.1. 概念 …

DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection

摘要 与前代类似&#xff0c; DEYOv2 采用渐进式推理方法 来加速模型训练并提高性能。该研究深入探讨了一对一匹配在优化器中的局限性&#xff0c;并提出了有效解决该问题的解决方案&#xff0c;如Rank 特征和贪婪匹配 。这种方法使DEYOv2的第三阶段能够最大限度地从第一和第二…

工控MCGS触摸屏Hacking勒索部署

https://github.com/MartinxMax/Mo0n_V1.2 !!不关注点赞收藏,以后没好东西了奥!! 端口扫描-获取信息 $python Mo0n.py -scan x.x.x.0/24 or $nmap -sS -Pn -T4 x.x.x.0/24 -p 127 MCGS编程软件 发现触摸屏受到密码保护 Oops&#xff01;&#xff01;&#xff01; echo /\_…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Circle)

用于绘制圆形的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Circle(options?: {width?: string | number, height?: string | number}) 从API version 9开始&…

Flutter-底部弹出框(Widget层级)

需求 支持底部弹出对话框。支持手势滑动关闭。支持在widget中嵌入引用。支持底部弹出框弹出后不影响其他操作。支持弹出框中内容固定头部和下面列表时&#xff0c;支持触摸头部并在列表不在头部的时候支持滑动关闭 简述 通过上面的需求可知&#xff0c;就是在界面中可以支持…

Smart Light Random Memory Sprays Retinex 传统图像增强 SLRMSR

文章目录 前言1、Smart Light Random Memory Sprays Retinex概况2、Smart Light Random Memory Sprays Retinex的实现2.1、SLRMSR算法的伪代码2.2、初始化记忆喷雾&#xff08;CreateInitialMemorySpray&#xff09;2.3、更新记忆喷雾 (UpdateMemorySpray)2.4、计算颜色校正因子…

到底什么时候该使用MongoDB

NoSQL是什么 NoSQL &#xff1a; Not Only SQL , 本质也是一种数据库的技术&#xff0c;相对于传统数据库技术&#xff0c;它不会遵循一些约束&#xff0c;比如 &#xff1a; sql 标准、 ACID 属性&#xff0c;表结构等。 NoSQL分类 类型应用场景典型产品Key-value存储缓存&…

【Excel自动化办公】使用openpyxl对Excel进行读写操作

目录 一、环境安装 1.1 创建python项目 1.2 安装openpyxl依赖 二、Excel数据读取操作 三、Excel数据写入操作 3.1 创建空白工作簿 3.2 写数据 四、设置单元格样式 4.1 字体样式 4.2 设置单元格背景填充色 4.3 设置单元格边框样式 4.4 单元格对齐方式 4.5 数据筛选…

体系化全面认识 Nginx !

高并发、高性能&#xff1b;模块化架构使得它的扩展性非常好&#xff1b;异步非阻塞的事件驱动模型这点和 Node.js 相似&#xff1b;相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性&#xff1b;热部署、平滑升级&#xff1b;完全开源&…

代码随想录算法训练营第46天 | 完全背包,139.单词拆分

动态规划章节理论基础&#xff1a; https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 完全背包理论基础&#xff1a; https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9…

数字化社会的新纪元:揭秘 Web3 的社交网络

随着区块链技术的不断发展和普及&#xff0c;Web3作为其重要组成部分&#xff0c;正逐渐改变着社交网络的面貌。Web3的出现不仅为社交网络带来了新的技术和理念&#xff0c;还为用户提供了更加开放、透明和安全的社交体验。本文将深入探讨Web3的社交网络&#xff0c;揭示其在数…

计算机网络:性能指标

计算机网络&#xff1a;性能指标 速率带宽吞吐量时延时延带宽积往返时间利用率丢包率 本博客介绍计算机网络的性能指标&#xff0c;我们可以从不同的方面来度量计算机网络的性能。常用的计算机网络性能指标有以下 8 个&#xff0c;他们是&#xff1a;速率、带宽、吞吐量、时延、…

47.全排列II

// 定义一个Solution类&#xff0c;用于解决给定不重复整数数组的全排列问题 class Solution {// 初始化结果集&#xff0c;用于存放所有不重复的全排列组合List<List<Integer>> result new ArrayList<>();// 初始化路径变量&#xff0c;用于暂存当前递归生…

ESP32实现(MQTT Client)连接物联网平台(EMQX)

目录 概述 1 配置EMQX服务器 1.1 搭建EMQX服务器 1.2 配置服务器参数 2 ESP32实现MQTT Client 2.1 创建MQTT Client项目 2.2 实现MQTT Client 2.3 ESP32连接EMQX 3 ESP32Client实现广播和订阅消息 3.1 广播消息 3.1.1 编写广播消息函数 3.1.2 下载和验证 3.1.3 订阅…

Windows11安装Msql8.0版本详细安装步骤!

文章目录 前言一、下载Mysql二、安装Mysql三、登录验证三、环境变量配置总结 前言 每次搭建新环境的时候&#xff0c;都需要网上搜寻安装的步骤教程&#xff01;为了以后方便查阅&#xff01;那么本次就记录一下Windows11安装Msql8.0的详细步骤&#xff01;也希望能帮助到有需…

蓝桥杯物联网竞赛_STM32L071_12_按键中断与串口中断

按键中断&#xff1a; 将按键配置成GPIO_EXTI中断即外部中断 模式有三种上升沿&#xff0c;下降沿&#xff0c;上升沿和下降沿都会中断 external -> 外部的 interrupt -> 打断 trigger -> 触发 detection -> 探测 NVIC中将中断线ENABLE 找接口函数 在接口函数中写…