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(); //釋放信號量//在另?個線程中進行類似操作

結束。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67131.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【全棧】SprintBoot+vue3迷你商城-擴展:vue3項目創建及目錄介紹

【全棧】SprintBootvue3迷你商城-擴展&#xff1a;vue3項目創建及目錄介紹 往期的文章都在這里啦&#xff0c;大家有興趣可以看一下 【全棧】SprintBootvue3迷你商城&#xff08;1&#xff09; 【全棧】SprintBootvue3迷你商城&#xff08;2&#xff09; 【全棧】SprintBootvu…

使用Aardio庫在Python中創建桌面應用:簡單指南

引言 隨著軟件開發需求的不斷增長&#xff0c;開發者們需要更加靈活和高效的工具來快速構建應用程序。Python以其簡潔易讀的語法和強大的社區支持而聞名&#xff0c;但在創建圖形用戶界面&#xff08;GUI&#xff09;時&#xff0c;可能會遇到一些挑戰。Aardio作為一種輕量級的…

多版本并發控制:MVCC的作用和基本原理

多版本并發控制&#xff1a;MVCC的作用和基本原理 1、MVCC簡介1.1 快照讀與當前讀的區別1.1.1 快照讀1.1.2 當前讀 1.2 數據庫的讀寫問題1.3 MVCC的作用 2、MVCC實現原理之ReadView2.1 什么是ReadView2.2 ReadView的設計思路2.3 MVCC整體操作流程 1、MVCC簡介 1.1 快照讀與當前…

神經網絡|(二)sigmoid神經元函數

【1】引言 在前序學習進程中&#xff0c;我們已經了解了基本的二元分類器和神經元的構成&#xff0c;文章學習鏈接為&#xff1a; 神經網絡|(一)加權平均法&#xff0c;感知機和神經元-CSDN博客 在此基礎上&#xff0c;我們認識到神經元本身在做二元分類&#xff0c;是一種非…

Qt中QVariant的使用

1.使用QVariant實現不同類型數據的相加 方法&#xff1a;通過type函數返回數值的類型&#xff0c;然后通過setValue來構造一個QVariant類型的返回值。 函數&#xff1a; QVariant mainPage::dataPlus(QVariant a, QVariant b) {QVariant ret;if ((a.type() QVariant::Int) &a…

BAHD酰基轉移酶對紫草素的手性催化-文獻精讀105

Two BAHD Acyltransferases Catalyze the Last Step in the Shikonin/Alkannin Biosynthetic Pathway 兩個BAHD酰基轉移酶催化了紫草素/左旋紫草素生物合成途徑中的最后一步 一個BAHD酰基轉移酶專門催化紫草素的酰基化&#xff0c;而另一個BAHD酰基轉移酶則僅催化紫草素的對映…

Avalonia+ReactiveUI跨平臺路由:打造絲滑UI交互的奇幻冒險

一、引言 在當今數字化時代&#xff0c;跨平臺應用開發已成為大勢所趨。開發者們迫切需要一種高效、靈活的方式&#xff0c;能夠讓應用程序在不同操作系統上無縫運行&#xff0c;為用戶提供一致的體驗。Avalonia 和 ReactiveUI 的組合&#xff0c;宛如一對天作之合的舞者&…

CLion開發Qt桌面

IDE&#xff1a;CLion Qt Qt版本&#xff1a;5.12 學習正點原子的嵌入式Linux開發板時&#xff0c;使用Qt Creator寫代碼不是很方便&#xff0c;遂嘗試使用CLion搭建Qt開發環境。 一、CLion的Qt環境搭建 1&#xff0c;配置工具鏈 找到Qt的安裝目錄&#xff0c;此處為E:\Tools\…

【學術會議-第五屆機械設計與仿真國際學術會議(MDS 2025) 】前端開發:技術與藝術的完美融合

重要信息 大會官網&#xff1a;www.icmds.net 大會時間&#xff1a;2025年02月28日-03月02日 大會地點&#xff1a;中國-大連 會議簡介 2025年第五屆機械設計與仿真國際學術會議&#xff08;MDS 2025) 將于2025年02月28-3月02日在中國大連召開。MDS 2025將圍繞“機械設計”…

《DeepSeek R1:開源大模型的破局者》

驚爆&#xff01;中國開源大模型震撼登場 在人工智能領域的激烈競爭中&#xff0c;一場震撼全球的技術革命正悄然發生。2025 年 1 月 20 日晚&#xff0c;一家來自中國的人工智能初創公司 ——DeepSeek&#xff08;深度求索&#xff09;&#xff0c;如同一顆耀眼的新星&#x…

84,【8】BUUCTF WEB [羊城杯 2020]Blackcat

進入靶場 音樂硬控我3分鐘 回去看源碼 <?php // 檢查 POST 請求中是否包含 Black-Cat-Sheriff 和 One-ear 字段 // 如果任意一個字段為空&#xff0c;則輸出錯誤信息并終止腳本執行 if(empty($_POST[Black-Cat-Sheriff]) || empty($_POST[One-ear])){die(請提供 Black-C…

人工智能:從基礎到前沿

目錄 目錄 1. 引言 2. 人工智能基礎 2.1 什么是人工智能&#xff1f; 2.2 人工智能的歷史 2.3 人工智能的分類 3. 機器學習 3.1 機器學習概述 3.2 監督學習 3.3 無監督學習 3.4 強化學習 4. 深度學習 4.1 深度學習概述 4.2 神經網絡基礎 4.3 卷積神經網絡&#…

漏洞情報:為什么、要什么和怎么做

漏洞一直是網絡攻防的焦點所在&#xff0c;因為漏洞直接或間接影響安全性的核心方面——權限。攻擊者挖掘和利用漏洞&#xff0c;獲取非授權的權限&#xff1b;防御方定位和消除漏洞&#xff0c;監測和阻斷漏洞的利用&#xff0c;使攻擊者無法利用漏洞達到其目的。漏洞信息本質…

leetcode——刪除鏈表的倒數第N個節點(java)

給你一個鏈表&#xff0c;刪除鏈表的倒數第 n 個結點&#xff0c;并且返回鏈表的頭結點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], n 2 輸出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 輸入&#xff1a;head [1], n 1 輸出&#xff1a;[] 示例 3&#xf…

正則表達式以及Qt中的使用

目錄 一、正則表達式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .運算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重復次數&#xff1a; 2.4 量詞{} 2.5 特征標群() 2.6 或運算符 2.7 \反斜線轉碼特殊字符 2.8 錨點 3、簡寫字符 4、零寬度斷言 4.1 正…

【第一天】零基礎入門刷題Python-算法篇-數據結構與算法的介紹(持續更新)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、Python數據結構與算法的詳細介紹1.基本概念2.Python中的數據結構1. 列表&#xff08;List&#xff09;2. 元組&#xff08;Tuple&#xff09;3. 字典&#…

流行的開源高性能數據同步工具 - Apache SeaTunnel 整體架構運行原理

概述 背景 數據集成在現代企業的數據治理和決策支持中扮演著至關重要的角色。隨著數據源的多樣化和數據量的迅速增長&#xff0c;企業需要具備強大的數據集成能力來高效地處理和分析數據。SeaTunnel通過其高度可擴展和靈活的架構&#xff0c;幫助企業快速實現多源數據的采集、…

消息隊列篇--原理篇--Pulsar(Namespace,BookKeeper,類似Kafka甚至更好的消息隊列)

Apache Pulusar是一個分布式、多租戶、高性能的發布/訂閱&#xff08;Pub/Sub&#xff09;消息系統&#xff0c;最初由Yahoo開發并開源。它結合了Kafka和傳統消息隊列的優點&#xff0c;提供高吞吐量、低延遲、強一致性和可擴展的消息傳遞能力&#xff0c;適用于大規模分布式系…

VS Code i18n國際化組件代碼code顯示中文配置 i18n ally

VUE項目做i18n國際化之后&#xff0c;代碼中的中文都變成了code這時的代碼就會顯得非常難讀&#xff0c;如果有一個插件能把code轉換成中文顯示就好了 vscode插件搜索“i18n ally” 在項目根文件夾下創建文件&#xff1a;.vscode/settings.json settings.json 內容如下 {"…

圖論匯總1

1.圖論理論基礎 圖的基本概念 二維坐標中&#xff0c;兩點可以連成線&#xff0c;多個點連成的線就構成了圖。 當然圖也可以就一個節點&#xff0c;甚至沒有節點&#xff08;空圖&#xff09; 圖的種類 整體上一般分為 有向圖 和 無向圖。 有向圖是指 圖中邊是有方向的&a…