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

2024-03-19 07:20
文章标签 c++ 学习 qt qchart qfile qpainter

本文主要是介绍C++Qt学习——QFile、QPainter、QChart,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

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 水平居中AlignHCenterpainter.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;elseoffset=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、查看效果

这篇关于C++Qt学习——QFile、QPainter、QChart的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/825215

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C++实现获取本机MAC地址与IP地址

《C++实现获取本机MAC地址与IP地址》这篇文章主要为大家详细介绍了C++实现获取本机MAC地址与IP地址的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实际工作中,项目上常常需要获取本机的IP地址和MAC地址,在此使用两种方案获取1.MFC中获取IP和MAC地址获取

C/C++通过IP获取局域网网卡MAC地址

《C/C++通过IP获取局域网网卡MAC地址》这篇文章主要为大家详细介绍了C++如何通过Win32API函数SendARP从IP地址获取局域网内网卡的MAC地址,感兴趣的小伙伴可以跟随小编一起学习一下... C/C++通过IP获取局域网网卡MAC地址通过win32 SendARP获取MAC地址代码#i