QT的补充知识

一、文件 QFile

QT提供了QFile类用于对文件进行读写操作,也提供了其他的两个类:文本流(QTextSream)和数据流(QDataStream)

  • 文本流(QTextSream):用于对文本数据的处理,并且是以字为单位进行读/写
  • 数据流(QDataStream):用于对二进制数据的处理,并且是以字节为单位进行读/写

QFlie类:

1、对文件进行操作流程:

如何找到文件?--------使用文件对话框(QFileDialog),也可以直接使用QFile类去找到文件

2、打开文件

cpp 复制代码
bool open(FILE *fh, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
参数:FILE*fh文件指针
参数:QIODevice::OpenMode mode  //打开文件模式
参数:QFileDevice::FileHandleFlags handleFlags = DontCloseHandle //文件处理标志
---------------------------------------------------------------
bool open(int fd, QIODevice::OpenMode mode, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle)
参数:int fd :文件ID
参数:QIODevice::OpenMode mode  //打开文件模式
参数:QFileDevice::FileHandleFlags handleFlags = DontCloseHandle //文件处理标志
---------------------------------------------------------------
virtual bool open(QIODevice::OpenMode mode) override
参数:QIODevice::OpenMode mode  //打开文件模式

3、读/写

  • 读取:
cpp 复制代码
virtual qint64 readData(char *data, qint64 len) override
返回值:qint64=long long int
参数:char *data里读取数据
参数:qint64  读取数据的长度
-----------------------------
//按行读取
virtual qint64 readLineData(char *data, qint64 maxlen) override
返回值:qint64=long long int
参数:char *data里读取数据
参数:qint64  读取数据的最大长度
-----------------------------
QByteArray read(qint64 maxSize)
返回值:QByteArray:字节数组  //文本数据、网络相关的数据等等
参数:qint64 maxSize;最大能读取数据长度
-----------------------------
//读取文件里的所有数据
QByteArray readAll()
返回值:QByteArray:字节数组  //文本数据、网络相关的数据等等
-----------------------------
//按行读取
QByteArray readLine(qint64 maxSize = 0)
返回值:QByteArray:字节数组  //文本数据、网络相关的数据等等
参数:qint64 maxSize = 0  //读取一行数据
  • 写:
cpp 复制代码
virtual qint64 writeData(const char *data, qint64 len) override
返回值:qint64,返回写入的字节个数
参数const char *data:待写入的字符串
参数qint64 len:待写入的字符串的长度
-----------------------------
qint64 write(const char *data, qint64 maxSize)
返回值:qint64,返回写入的字节个数
参数const char *data:待写入的字符串
参数qint64 len:待写入的字符串最大的长度
-----------------------------
qint64 write(const char *data)
返回值:qint64,返回写入的字节个数
参数const char *data:待写入的字符串
-----------------------------
qint64 write(const QByteArray &byteArray)
返回值:qint64,返回写入的字节个数
参数const QByteArray &byteArray:待写入的字节数组

4、关闭文件

cpp 复制代码
virtual void close() override

QFileInfo类:

用于查看文件的基本信息的类

cpp 复制代码
QDir absoluteDir() const  //获取文件的绝对目录
QString absoluteFilePath() const  //获取文件的绝对路径(包含文件)
QString absolutePath() const   //获取文件的绝对路径(不包含文件)
QString baseName() const  //  获取文件名称(不包含后缀)
QDateTime birthTime() const   //获取文件的创建时间
QString completeSuffix() const  //获取文件的后缀
QDir dir() const          //获取文件的目录
bool exists() const   //判断文件是否存在,true:存在  false:不存在
QString fileName() const //获取文件名(包好后缀)
QString filePath() const //获取文件的相对路径
QDateTime fileTime(QFile::FileTime time) const  //返回文件被修改的时间
bool isHidden() const  //判断文件是否被隐藏 true:隐藏  false:不隐藏
bool isReadable() const  //判断文件是否是只读   ture:只读  false:不只读
bool permission(QFile::Permissions permissions) const  //设置文件的许可证(权限)true:设置成功  false:设置失败
QDateTime lastRead() const  //获取最后一次读取文件的时间

QDir类:

用于管理目录

cpp 复制代码
QString absoluteFilePath(const QString &fileName) const  //获取文件的路径
QString absolutePath() const  
QString canonicalPath() const
bool cd(const QString &dirName)  //切换文件路径
bool cdUp()  //切换到上一个路径:cd ../
bool mkdir(const QString &dirName) const  //创建目录或文件
bool mkpath(const QString &dirPath) const  //创建路径
bool rename(const QString &oldName, const QString &newName) //更新文件名称
bool rmdir(const QString &dirName) const   //移除目录,注意:目录或路径下所有文件都删掉(慎用)
bool rmpath(const QString &dirPath) const  //移除路径
QDir current()
QString currentPath()

二、事件及图形

  • 事件类型:键盘事件、鼠标事件、定时器事件、图形事件等等
  • 事件:事件的产生--------事件经过----------事件的结果,QT里提供了事件

QT事件的处理流程:

  • 事件的产生:
    • 有用户实现或者QT内部实现
    • 用户实现:键盘按下、释放,鼠标按下、释放等等
    • QT内部实现:定时器事件,图形事件等等
  • 事件的经过:
    • 事件的监听和派送
    • 事件的监听:应用程序(QApplication)调用.exec()监听产生的事件(事件循环系统)
    • 事件的派送:当应用程序(QApplication)监听到事件之后,就将该事件派送出去,派送给QEvent类。QEvent类收到QApplication派送的事件之后,就将事件分发给具体的事件处理对象
  • 事件的处理:
    • 收到QEvent类分发的事件,当前对象(基本的控件)接收该事件并进行处理
    • 事件处理函数(对事件进行处理):
      • mousePressEvent(QMouseEvent *event);//鼠标按下事件进行处理
      • mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件进行处理
      • mouseMoveEvent(QMouseEvent *event) ;//鼠标移动事件进行处理
      • ...

1、QT里提供的事件:

cpp 复制代码
virtual void actionEvent(QActionEvent *event)  //当窗口状态行为被改变时,会执行该事件
virtual void changeEvent(QEvent *event)
virtual void closeEvent(QCloseEvent *event)  //当窗口被关闭时会执行该事件,
virtual void contextMenuEvent(QContextMenuEvent *event)
void create(WId window = 0, bool initializeWindow = true, bool destroyOldWindow = true)
void destroy(bool destroyWindow = true, bool destroySubWindows = true)
virtual void dragEnterEvent(QDragEnterEvent *event)
virtual void dragLeaveEvent(QDragLeaveEvent *event)
virtual void dragMoveEvent(QDragMoveEvent *event)
virtual void dropEvent(QDropEvent *event)
virtual void enterEvent(QEvent *event)
virtual void focusInEvent(QFocusEvent *event)
bool focusNextChild()
virtual bool focusNextPrevChild(bool next)
virtual void focusOutEvent(QFocusEvent *event)
bool focusPreviousChild()
virtual void hideEvent(QHideEvent *event)  //当窗口被隐藏时会执行该事件
virtual void inputMethodEvent(QInputMethodEvent *event)
virtual void keyPressEvent(QKeyEvent *event)  //当键盘按下的时候,会执行该事件
virtual void keyReleaseEvent(QKeyEvent *event)  //当键盘释放的时候,会执行该事件
virtual void leaveEvent(QEvent *event)
virtual void mouseDoubleClickEvent(QMouseEvent *event)
virtual void mouseMoveEvent(QMouseEvent *event)
virtual void mousePressEvent(QMouseEvent *event)
virtual void mouseReleaseEvent(QMouseEvent *event)
virtual void moveEvent(QMoveEvent *event)
virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result)
virtual void paintEvent(QPaintEvent *event)
virtual void resizeEvent(QResizeEvent *event)
virtual void showEvent(QShowEvent *event)
virtual void tabletEvent(QTabletEvent *event)
virtual void wheelEvent(QWheelEvent *event)

2、事件过滤器:eventFilter

cpp 复制代码
bool QObject::eventFilter(QObject *watched, QEvent *event)  //	QObject类中的时间过滤器
返回值:bool类型    当事件过滤成功,则返回true, 否则,返回false
参数1:QObject *watched       子窗口部件对象
参数2:QEvent *event       在子窗口部件对象上产生的事件的类型
-------------------------------------------------------------------
//使用:首先需要向指定的子窗口部件注册事件过滤器,之后即可使用事件过滤器
//注册事件过滤器:	
void installEventFilter(QObject *filterObj)  //注册事件过滤器

3、事件分发器:event

cpp 复制代码
事件分发器原型:
	bool QObject::event(QEvent *e)  //事件分发器
	返回值:bool   分发事件的返回值
	参数:QEvent *e  //分发事件的类型

4、定时器

QT里定时器的实现两种方式:
	(1)实例化QTimer类
	(2)重写定时器事件
		 void QObject::timerEvent(QTimerEvent *event)  //定时器事件

(1)实例化QTimer类

cpp 复制代码
void start(std::chrono::milliseconds msec)  //开启定时器
void start(int msec)  //开启定时器并设置定时时间,单位:毫秒
void start()   //开启定时器
void stop()   //停止定时器
---------------------------------------------------------
信号:
void timeout()   //当定时器开启之后,到达设置的时间,触发该信号

(2)重写定时器事件

cpp 复制代码
 void QObject::timerEvent(QTimerEvent *event)  //定时器事件
 int startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)  //开启定时器
int startTimer(std::chrono::milliseconds time, Qt::TimerType timerType = Qt::CoarseTimer) //开启定时器
返回值:int    返回定时器的ID号

5、绘画(绘图)事件

cpp 复制代码
virtual void paintEvent(QPaintEvent *event)  //绘画事件

当应用程序界面刷新一次,就会自动调用paintEvent事件处理函数
调用update()函数,也可以实现调用paintEvent事件处理函数

QPainter类:
一支不带彩色的画笔,默认的颜色为黑色

cpp 复制代码
void drawArc(const QRectF &rectangle, int startAngle, int spanAngle)
void drawArc(const QRect &rectangle, int startAngle, int spanAngle)
void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle)
void drawChord(const QRectF &rectangle, int startAngle, int spanAngle)
void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle)
void drawChord(const QRect &rectangle, int startAngle, int spanAngle)
void drawConvexPolygon(const QPointF *points, int pointCount)
void drawConvexPolygon(const QPolygonF &polygon)
void drawConvexPolygon(const QPoint *points, int pointCount)
void drawConvexPolygon(const QPolygon &polygon)
void drawEllipse(const QRectF &rectangle)
void drawEllipse(const QRect &rectangle)
void drawEllipse(int x, int y, int width, int height)
void drawEllipse(const QPointF &center, qreal rx, qreal ry)
void drawEllipse(const QPoint &center, int rx, int ry)
void drawGlyphRun(const QPointF &position, const QGlyphRun &glyphs)
void drawImage(const QRectF &target, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags = Qt::AutoColor)
void drawImage(const QRect &target, const QImage &image, const QRect &source, Qt::ImageConversionFlags flags = Qt::AutoColor)
void drawImage(const QPointF &point, const QImage &image, const QRectF &source, Qt::ImageConversionFlags flags = ...)
void drawImage(const QPoint &point, const QImage &image, const QRect &source, Qt::ImageConversionFlags flags = ...)
void drawImage(const QRectF &rectangle, const QImage &image)
void drawImage(const QRect &rectangle, const QImage &image)
void drawImage(const QPointF &point, const QImage &image)
void drawImage(const QPoint &point, const QImage &image)
void drawImage(int x, int y, const QImage &image, int sx = 0, int sy = 0, int sw = -1, int sh = -1, Qt::ImageConversionFlags flags = Qt::AutoColor)
void drawLine(const QLineF &line)
void drawLine(const QLine &line)
void drawLine(int x1, int y1, int x2, int y2)
void drawLine(const QPoint &p1, const QPoint &p2)
void drawLine(const QPointF &p1, const QPointF &p2)
void drawLines(const QLineF *lines, int lineCount)
void drawLines(const QVector<QLineF> &lines)
void drawLines(const QPointF *pointPairs, int lineCount)
void drawLines(const QVector<QPointF> &pointPairs)
void drawLines(const QLine *lines, int lineCount)
void drawLines(const QVector<QLine> &lines)
void drawLines(const QPoint *pointPairs, int lineCount)
void drawLines(const QVector<QPoint> &pointPairs)
void drawPath(const QPainterPath &path)
void drawPicture(const QPointF &point, const QPicture &picture)
void drawPicture(int x, int y, const QPicture &picture)
void drawPicture(const QPoint &point, const QPicture &picture)
void drawPie(const QRectF &rectangle, int startAngle, int spanAngle)
void drawPie(int x, int y, int width, int height, int startAngle, int spanAngle)
void drawPie(const QRect &rectangle, int startAngle, int spanAngle)
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
void drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source)
void drawPixmap(int x, int y, int w, int h, const QPixmap &pixmap, int sx, int sy, int sw, int sh)
void drawPixmap(int x, int y, const QPixmap &pixmap, int sx, int sy, int sw, int sh)
void drawPixmap(const QPointF &point, const QPixmap &pixmap, const QRectF &source)
void drawPixmap(const QPoint &point, const QPixmap &pixmap, const QRect &source)
void drawPixmap(const QPointF &point, const QPixmap &pixmap)
void drawPixmap(const QPoint &point, const QPixmap &pixmap)
void drawPixmap(int x, int y, const QPixmap &pixmap)
void drawPixmap(const QRect &rectangle, const QPixmap &pixmap)
void drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap)
void drawPixmapFragments(const QPainter::PixmapFragment *fragments, int fragmentCount, const QPixmap &pixmap, QPainter::PixmapFragmentHints hints = ...)
void drawPoint(const QPointF &position)
void drawPoint(const QPoint &position)
void drawPoint(int x, int y)
void drawPoints(const QPointF *points, int pointCount)
void drawPoints(const QPolygonF &points)
void drawPoints(const QPoint *points, int pointCount)
void drawPoints(const QPolygon &points)
void drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill)
void drawPolygon(const QPolygonF &points, Qt::FillRule fillRule = Qt::OddEvenFill)
void drawPolygon(const QPoint *points, int pointCount, Qt::FillRule fillRule = Qt::OddEvenFill)
void drawPolygon(const QPolygon &points, Qt::FillRule fillRule = Qt::OddEvenFill)
void drawPolyline(const QPointF *points, int pointCount)
void drawPolyline(const QPolygonF &points)
void drawPolyline(const QPoint *points, int pointCount)
void drawPolyline(const QPolygon &points)
void drawRect(const QRectF &rectangle)
void drawRect(int x, int y, int width, int height)
void drawRect(const QRect &rectangle)
void drawRects(const QRectF *rectangles, int rectCount)
void drawRects(const QVector<QRectF> &rectangles)
void drawRects(const QRect *rectangles, int rectCount)
void drawRects(const QVector<QRect> &rectangles)
void drawRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)
void drawRoundedRect(int x, int y, int w, int h, qreal xRadius, qreal yRadius, Qt::SizeMode mode = ...)
void drawRoundedRect(const QRect &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = ...)
void drawStaticText(const QPointF &topLeftPosition, const QStaticText &staticText)
void drawStaticText(const QPoint &topLeftPosition, const QStaticText &staticText)
void drawStaticText(int left, int top, const QStaticText &staticText)
void drawText(const QPointF &position, const QString &text)
void drawText(const QPoint &position, const QString &text)
void drawText(int x, int y, const QString &text)
void drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)
void drawText(const QRect &rectangle, int flags, const QString &text, QRect *boundingRect = nullptr)
void drawText(int x, int y, int width, int height, int flags, const QString &text, QRect *boundingRect = nullptr)
void drawText(const QRectF &rectangle, const QString &text, const QTextOption &option = QTextOption())
void drawTiledPixmap(const QRectF &rectangle, const QPixmap &pixmap, const QPointF &position = QPointF())
void drawTiledPixmap(int x, int y, int width, int height, const QPixmap &pixmap, int sx = 0, int sy = 0)
void drawTiledPixmap(const QRect &rectangle, const QPixmap &pixmap, const QPoint &position = ...)

QPen类(画笔类):

画笔类,可以设置画笔颜色、画笔宽度等等

cpp 复制代码
//1、可以设置画笔的颜色,线宽等信息
QPen  pen;
pen.setColor(QColor(255,0,0));//设置画笔的颜色
//设置线宽
pen.setWidth(6);
//设置画笔的样式
pen.setStyle(Qt::DotLine);
p.setPen(pen);

QBrush类(画刷类):

cpp 复制代码
//2、可以填充颜色等信息
QBrush brush;//填充类
//设置填充的颜色
brush.setColor(QColor(255,0,0));
//设置填充样式
brush.setStyle(Qt::SolidPattern);
p.setBrush(brush);
p.drawRect(50,50,50,50);
p.drawLine(50,50,80,80);

三、多线程

为什么QT引入多线程概念?QT搭建界面的工具,使用多线程可以解决界面卡顿,响应不及时的情况
QT中新建的界面,实质上是一个主线程

如何实现(搭建)线程:

  • (1)继承自QThread类:新建一个类继承自QThread类,启动新建类运行
  • (2)moveToThread方法:新建一个类将该类放到线程中运行
相关推荐
众拾达人8 分钟前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
皓木.10 分钟前
Mybatis-Plus
java·开发语言
不良人天码星10 分钟前
lombok插件不生效
java·开发语言·intellij-idea
源码哥_博纳软云33 分钟前
JAVA同城服务场馆门店预约系统支持H5小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
学会沉淀。40 分钟前
Docker学习
java·开发语言·学习
西猫雷婶1 小时前
python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶
开发语言·python·opencv
kiiila1 小时前
【Qt】对象树(生命周期管理)和字符集(cout打印乱码问题)
开发语言·qt
小_太_阳2 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾2 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
唐 城2 小时前
curl 放弃对 Hyper Rust HTTP 后端的支持
开发语言·http·rust