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…...
强化学习在并行机构人形机器人控制中的应用
1. 项目概述在机器人控制领域,强化学习(RL)正逐渐成为解决复杂动力学系统问题的有力工具。然而,当面对具有并行驱动机构的人形机器人时,传统RL训练方法往往面临一个关键挑战:大多数仿真环境无法准确模拟闭环运动链(Closed Kinemat…...
OpenClaw 连接阿里云百炼图文教程
OpenClaw 连接阿里云百炼图文教程 前置准备 已安装并可以正常打开 OpenClaw Windows。 OpenClaw 顶部 Gateway 状态保持在线。 已准备好可正常登录的阿里云账号。 可以正常访问阿里云百炼登录地址:https://bailian.console.aliyun.com/cn-beijing#/home 建议提…...
关于psthon问题
我想问问各位 我python可以查到 但是我的bit文件查不到python怎么回事...
危急时刻的六条基本安全提示
人机协作,AI模型:Deepseek 仅供参考 危急时刻的六条基本安全提示 以下内容仅为通用性安全建议,供在紧急情况下保持冷静、保护自身安全时参考。所有建议均基于常理和公共安全常识,不包含任何具体操作细节或可能被不当使用的信息…...
Android Root检测绕过:从逆向分析到Frida分层Hook实战
1. 这不是“绕过root检测”,而是理解检测逻辑后的精准干预在安卓逆向工程的实际工作中,“过root检测”这个说法本身就容易引发误解——它听起来像某种黑箱魔法,仿佛只要套用某个脚本、加载某个插件,就能让App对设备状态“视而不见…...
LeagueAkari:英雄联盟终极自动化助手革命性指南
LeagueAkari:英雄联盟终极自动化助手革命性指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否在英雄联盟游戏中反复经历这…...
PS5 NOR Modifier深度解析:如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版
PS5 NOR Modifier深度解析:如何通过Windows工具修复PS5硬件故障与实现光驱版转数字版 【免费下载链接】PS5NorModifier The PS5 Nor Modifier is an easy to use Windows based application to rewrite your PS5 NOR file. This can be useful if your NOR is corru…...
原神私服新纪元:KCN-GenshinServer图形化服务端全功能解析
原神私服新纪元:KCN-GenshinServer图形化服务端全功能解析 【免费下载链接】KCN-GenshinServer 基于GC制作的原神一键GUI多功能服务端。 项目地址: https://gitcode.com/gh_mirrors/kc/KCN-GenshinServer 你是否曾想过拥有一个完全由自己掌控的提瓦特大陆&am…...
Jetson Orin上TVA模型DLA精准卸载配置
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
基于Atmega 1284P的16位复古计算器:硬件设计与软件实现全解析
1. 项目概述与核心思路最近在整理工作室时,翻出了一堆老旧的7段数码管和矩阵键盘,看着这些充满复古气息的元件,一个想法冒了出来:为什么不自己动手做一台复古风格的计算器呢?不是那种用液晶屏显示的现代计算器…...
