Qt 5.14.2 学习记录 —— 이십 QFile和多线程
文章目录
- 1、QFile
- 1、打开
- 2、读写
- 3、关闭
- 4、程序
- 5、其它功能
- 2、多线程
- 1、演示
- 2、锁
- 3、条件变量和信号量
1、QFile
Qt有自己的一套文件体系,不过Qt也可以使用C++,C,Linux的文件操作。使用Qt的文件体系和Qt自己的一些类型更好配合。

管理写入读取的就是Qt中的QIODevice类。QProcess相当于是对fork/exec操作进行的封装;QTemporaryFile表示临时文件,用完就销毁,文件也就删除;在写大量数据时,要先创建一个临时文件,将旧文件内容写到临时文件里,写完后再删除旧文件,这就是QSaveFile的操作。
// 这里的name用绝/相对路径
QFile(const QString& name)// 查看文档来查看打开、读写、关闭文件操作接口

1、打开

不过实际用的是这个,它可以直接拿到之前设置的路径

关于OpenMode

2、读写


QByteArray容易转QString。

3、关闭

关闭时就是在释放文件描述符表中的表项,文件描述符表存在上限。
4、程序
// mainwindow.h#include <QMainWindow>
#include <QPlainTextEdit>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void handle1();void handle2();private:Ui::MainWindow *ui;QPlainTextEdit* edit;
};// mainwindow.cpp#include <QDebug>
#include <QFileDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->setWindowTitle("窗口");QMenuBar* menuBar = this->menuBar();QMenu* menu = new QMenu("文件");menuBar->addMenu(menu);// 形成菜单QAction* action1 = new QAction("打开");QAction* action2 = new QAction("保存");menu->addAction(action1);menu->addAction(action2);// 指定输入框edit = new QPlainTextEdit();QFont font;font.setPixelSize(20);edit->setFont(font);this->setCentralWidget(edit);connect(action1, &QAction::triggered, this, &MainWindow::handle1);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::handle1()
{// 弹出打开文件对话框QString path = QFileDialog::getOpenFileName(this);// 文件名显示到状态栏QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);// 通过路径构造QFile对象QFile file(path);bool ret = file.open(QIODevice::ReadOnly);if (!ret){statusBar->showMessage(path + " 打开失败!");return ;}// 读取文件// 即使返回值是QByteArray, 也可以直接用QString接收// 但前提必须不是二进制文件, 是文本文件QString text = file.readAll();file.close();// 读到的内容设置到输入框中edit->setPlainText(text);
}void MainWindow::handle2()
{QString path = QFileDialog::getSaveFileName(this);QStatusBar* statusBar = this->statusBar();statusBar->showMessage(path);QFile file(path);bool ret = file.open(QFile::WriteOnly);if (!ret){statusBar->showMessage(path + " 打开失败!");return ;}const QString& text = edit->toPlainText();// 转成QByteArrayfile.write(text.toUtf8());file.close();
}
5、其它功能

QFileInfo可以获取到Qt的文件的相关属性。
void Widget::on_pushButton_clicked()
{QString path = QFileDialog::getOpenFileName(this);QFileInfo fileInfo(path); // 构造QFileInfo对象qDebug() << fileInfo.fileName();qDebug() << fileInfo.suffix();
}
2、多线程
和Linux的多线程本质是一样的。Linux有pthread库,C++11有std::thread,Qt也封装了线程库,参考了Java的线程库。
创建线程要创建QThread对象,并创建一个QThread的子类,重写父类的run函数来作为线程的入口函数。


start就是调用系统API来创建线程,创建好后自动执行run函数。
1、演示
创建QWidget项目,通过线程完成定时器功能。

将intValue属性改为10。
创建新的子类

// thread.h#include <QWidget>
#include <QThread>class Thread : public QThread
{Q_OBJECT
public:Thread();void run();signals:void notify();
};// widget.h#include <QWidget>
#include "thread.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();private:Ui::Widget *ui;Thread thread;
};// thread.cpp#include "thread.h"Thread::Thread()
{}void Thread::run()
{// 由于Qt的线程策略, 不允许多个线程同时修改界面// run实现计时效果// 每过一秒钟, 通过信号槽通知主线程修改界面for(int i = 0; i < 10; ++i){sleep(1);emit notify();}
}// widget.cpp#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(&thread, &Thread::notify, this, &Widget::handle);thread.start();
}void Widget::handle()
{int value = ui->lcdNumber->intValue();--value;ui->lcdNumber->display(value);
}
2、锁
Qt的锁是QMutex,lock和unlock方法。
QWidget项目,创建继承QThread的类Thread。
// thread.h#include <QWidget>
#include <QThread>class Thread : public QThread
{Q_OBJECT
public:Thread();// 声明static int num;void run();
};// thread.cpp#include "thread.h"// 定义
int Thread::num = 0;Thread::Thread()
{}void Thread::run()
{for(int i = 0; i < 47000; ++i){++num;}
}// widget.cpp#include <QDebug>
// widget.h中引入thread.hWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);Thread t1;Thread t2;t1.start();t2.start();// 线程等待// 如果不等待, 那么除了这两个, Widget这个主线程还在并发执行// t1t2开始了, 但是Widget不停, 那么很快就执行到了打印, 此时结果肯定不大t1.wait();t2.wait();qDebug() << Thread::num;
}
这样肯定不会打印出47000 * 2的数字。
加锁
// thread.h#include <QMutex>public:// 声明static int num;static QMutex mutex;// thread.cpp// 定义
int Thread::num = 0;
QMutex Thread::mutex;void Thread::run()
{for(int i = 0; i < 47000; ++i){mutex.lock();++num;mutex.unlock();}
}
Qt中的智能指针是QMutexLocker,C++ 11中则是std::lock_guard。
// thread.cpp#include "thread.h"
#include <QMutexLocker>// 定义
int Thread::num = 0;
QMutex Thread::mutex;void Thread::run()
{for(int i = 0; i < 47000; ++i){QMutexLocker locker(&mutex);++num;}
}
Qt还有别的锁

3、条件变量和信号量
QWaitCondition条件变量类,有wait,wake,wakeAll方法
例子
QMutex mutex;
QWaitCondition condition;//在等待线程中
mutex.lock();//检查条件是否满足, 若不满足则等待
while (!conditionFullfilled())
{condition.wait(&mutex); //等待条件满足并释放锁
}//条件满足后继续执行
//...
mutex.unlock();//在改变条件的线程中
mutex.lock();//改变条件
changeCondition();
condition.wakeAll(); //唤醒等待的线程
mutex.unlock();
QSemaphore信号量类
QSemaphore semaphore(2); //同时允许两个线程访问共享资源//在需要访问共享资源的线程中
semaphore.acquire(); //尝试获取信号量,若已满则阻塞//访问共享资源
//...
semaphore.release(); //释放信号量//在另⼀个线程中进行类似操作
结束。
相关文章:
Qt 5.14.2 学习记录 —— 이십 QFile和多线程
文章目录 1、QFile1、打开2、读写3、关闭4、程序5、其它功能 2、多线程1、演示2、锁 3、条件变量和信号量 1、QFile Qt有自己的一套文件体系,不过Qt也可以使用C,C,Linux的文件操作。使用Qt的文件体系和Qt自己的一些类型更好配合。 管理写入读…...
積分方程與簡單的泛函分析7.希爾伯特-施密特定理
1)def函數叫作"由核生成的(有源的)" 定义: 设 是定义在区域上的核函数。 对于函数,若存在函数使得, 则称函数是“由核生成的(有源的)”。 这里的直观理解是: 函数的“来源”可以通过核函数 与另一个函数的积分运算得到。 在积分方程理论中,这种表述常…...
使用vitepress搭建自己的博客项目
一、介绍can-vitepress-blog 什么是CAN BLOG CAN BLOG是基于vitepress二开的个人博客系统,他能够方便使用者快速构建自己的博客文章,无需繁琐的配置和复杂的代码编写。 CAN BLOG以antdv为UI设计基础,简洁大方,界面友好…...
开始步入达梦中级dba
分析内存使用需要的方法之一 disql /nolog conn sysdba/sysdbaselect value from v$parameter where nameMEMORY_LEAK_CHECK; SP_SET_PARA_VALUE(0,MEMORY_LEAK_CHECK,1); select * from V$MEM_REGINFO; select * from V$MEM_HEAP;...
如何在docker中的mysql容器内执行命令与执行SQL文件
通过 docker ps -a 查询当前运行的容器,找到想执行命令的容器名称。 docker ps -a若想执行sql文件,则将sql文件放入当前文件夹下后将项目内的 SQL 文件拷贝到 mysql 容器内部的 root下。 sudo docker cp /root/enterprise.sql mysql:/root/然后进入 my…...
S4 HANA更改Tax base Amount的字段控制
本文主要介绍在S4 HANA OP中Tax base Amount的字段控制相关设置。具体请参照如下内容: 1. 更改Tax base Amount的字段控制 以上配置用于控制FB60/FB65/FB70/FB75/MIRO的页签“Tax”界面是否可以修改“Tax base Amount”, 如果勾选Change 表示可以修改T…...
Linux权限有关
文章目录 一、添加普通用户二、Xshell下命令行的知识三、 Linux和Windows操作系统四、再探指令和Linux权限五、用户相关用户切换: 今天我们学习与Linux有关的权限等内容,以及一些零碎知识帮助我们理解Linux的系统和Xshell的原理。 本篇是在Xshell环境下执行的。 一…...
【github 使用相关】提交pr和commit message Conventional Commits 规范 代码提交的描述该写什么?
目录 Git 提交信息格式格式描述Subject(标题)Body(正文) 规范的标签(Tag)示例 CG Git 提交信息格式 格式描述 一般开源项目代码库根目录都会有一个 CONTRIBUTING.md 或者其他类似名字的文档来介绍如何开始…...
Docker—搭建Harbor和阿里云私有仓库
Harbor概述 Harbor是一个开源的企业级Docker Registry管理项目,由VMware公司开发。它的主要用途是帮助用户迅速搭建一个企业级的Docker Registry服务,提供比Docker官方公共镜像仓库更为丰富和安全的功能,特别适合企业环境使用。12 Harb…...
Maven的下载安装配置
maven的下载安装配置 maven是什么 Maven 是一个用于 Java 平台的 自动化构建工具,由 Apache 组织提供。它不仅可以用作包管理,还支持项目的开发、打包、测试及部署等一系列行为 Maven的核心功能 项目构建生命周期管理:Maven定义了项目构建…...
Rust:高性能与安全并行的编程语言
引言 在现代编程世界里,开发者面临的最大挑战之一就是如何平衡性能与安全性。在许多情况下,C/C这样的系统级编程语言虽然性能强大,但其内存管理的复杂性导致了各种安全漏洞。为了解决这些问题,Rust 作为一种新的系统级编程语言进入…...
matlab的cat()函数详解(OK)
cat函数的功能是 连接数组 功能: 按指定的维度连接多个向量 结构: C cat(dim, A, B) 按dim指定的维度连接向量A和BC cat(dim, A1, A2, A3,A4, …) 按dim指定的维度连接多个向量A1, A2,A3,A4…C cat(dim, A{:}) 将包含向量的cell或结构数组联合为一…...
将个人微信中的时间改成标准的日期时间格式
list1["10:05","上午 10:07","下午 2:07","晚上 8:07","昨天 16:07","星期天 19:27","星期二 19:27","星期四 14:27","2025年1月10日 17:43"]from datetime import datetime, time…...
centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐
环境:centos9 last opensips -V version: opensips 3.6.0-dev (x86_64/linux) flags: STATS: On, DISABLE_NAGLE, USE_MCAST, SHM_MMAP, PKG_MALLOC, Q_MALLOC, F_MALLOC, HP_MALLOC, DBG_MALLOC, CC_O0, FAST_LOCK-ADAPTIVE_WAIT ADAPTIVE_WAIT_LOOPS1024, MAX_RE…...
初步搭建并使用Scrapy框架
目录 目标 版本 实战 搭建框架 获取图片链接、书名、价格 通过管道下载数据 通过多条管道下载数据 下载多页数据 目标 掌握Scrapy框架的搭建及使用,本文以爬取当当网魔幻小说为案例做演示。 版本 Scrapy 2.12.0 实战 搭建框架 第一步:在D:\pyt…...
基于SpringBoot的软件产品展示销售系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
pycharm 运行远程环境问题 Error:Failed to prepare environment.
问题排查 拿到更详细的报错信息: Help > Diagnostic Tools > Debug Log Settings section: 添加下面的配置 com.intellij.execution.configurations.GeneralCommandLine 重显报错,我这里是再次运行代码打开 Help | Collect Logs and Diagnosti…...
Redis vs. 其他数据库:深度解析,如何选择最适合的数据库?
一、如何为项目选择合适的数据库? 选择合适的数据库是一个复杂的过程,需要综合考虑多个因素。下面几个维度来详细阐述: 1.数据模型 关系型数据库(RDBMS):适用于高度结构化、关联性强的数据,如电…...
HTB:Support[WriteUP]
目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ldapsearch…...
导出地图为pdf文件
有时我们只是想创建能共享的pdf文件,而不是将地图打印出来,arcpy的ExportToPDF()函数可以实现该功能. 操作方法: 1.在arcmap中打开目标地图 2.导入arcpy.mapping模块 import arcpy.mapping as mapping 3.引用当前活动地图文档,把该引用赋值给变量 mxd mapping.MapDocumen…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
