Qt 進度條與多線程應用、基于 Qt 的文件復制工具開發

練習1:Qt 進度條與多線程應用

題目描述

開發一個基于 Qt 的應用程序,該應用程序包含一個水平進度條(QSlider),并且需要通過多線程來更新進度條的值。請根據以下要求完成代碼:

  1. 界面設計

    • 使用?QSlider?控件作為進度條。

    • 設置?QSlider?的樣式

  2. 多線程更新

    • 創建一個自定義線程類?mythread,該線程類繼承自?QThread

    • 使主線程接收到信號后,更新?QSlider?的值。

  3. 信號與槽

    • 使用信號與槽機制實現線程與主線程之間的通信。

    • 當線程中的值發生變化時,通過信號通知主線程更新進度條。

1.mythread.h?

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include<QThread>class mythread : public QThread
{Q_OBJECT
public:explicit mythread(QObject *parent = nullptr);void run() override; // 線程的執行函數signals:void updateValue(int value); // 發送信號更新進度條
};#endif // MYTHREAD_H

2.mythread.cpp?

#include "mythread.h"
#include<QThread>mythread::mythread(QObject *parent){}
void mythread::run()
{int value = 0;while (true) {emit updateValue(value);value = (value + 1) % 101;  // 0 ~ 100 循環QThread::msleep(100);  // 休眠 100ms}
}

3.widget.h?

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QWidget>
#include <QMovie>
#include <QThread>
#include <QTextEdit>
#include <QWidget>
#include <QThread>
#include<QScreen>
#include<QLabel>
#include<QDebug>
#include<QPixmap>
#include<QApplication>
#include<QPushButton>
#include "mythread.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECT
public slots:void setSliderValue(int value); // 更新進度條public:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;mythread *thread;
};
#endif // WIDGET_H

4.widget.cpp?

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QString qss = "QSlider { background: transparent; }"//設置 QSlider 的背景為透明"QSlider::groove:horizontal { border: 1px solid gray; background: lightgray; height: 15px; border-radius: 5px; }""QSlider::sub-page:horizontal { background: #B5E61D; border-radius: 5px; }""QSlider::handle:horizontal { background:#5A730E; width: 10px;border-radius: 5px }";ui->horizontalSlider->setStyleSheet(qss);// 創建并啟動線程thread = new mythread(this);connect(thread, &mythread::updateValue, this, &Widget::setSliderValue);thread->start();}Widget::~Widget()
{delete ui;
}// 槽函數:更新進度條
void Widget::setSliderValue(int value)
{ui->horizontalSlider->setValue(value);
}

練習2:基于 Qt 的文件復制工具開發

開發一個基于 Qt 的文件復制工具,要求實現以下功能:

  1. 文件選擇

    • 使用?QFileDialog?選擇源文件和目標文件。

    • 支持選擇大文件(超過 800MB)。

  2. 文件復制

    • 使用 Qt 的文件 IO 操作(QFile)實現文件復制功能。

    • 支持分塊讀取和寫入文件,避免一次性加載大文件到內存中。

  3. 多線程處理

    • 使用?QThread?在后臺執行文件復制操作,避免阻塞主線程。

    • 通過信號與槽機制,將復制進度實時傳遞給主線程。

  4. 進度顯示

    • 使用自定義的?QSlider?作為進度條,顯示文件復制的進度。

    • 自定義?QSlider?的樣式,使其外觀美觀。

  5. 錯誤處理

    • 如果文件打開失敗或復制失敗,彈出錯誤提示框。

    • 如果復制完成,彈出提示框顯示“文件復制完成”。

1.mythread.h

#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QThread>
#include <QString>class MyThread : public QThread
{Q_OBJECTpublic:explicit MyThread(const QString &source, const QString &destination, QObject *parent = nullptr);signals:void progressUpdated(int value); // 信號:用于更新進度條的值protected:void run() override; // 線程執行函數private:QString sourcePath;  // 源文件路徑QString destinationPath; // 目標文件路徑
};#endif // MYTHREAD_H

2.mythread.cpp?

#include "mythread.h"
#include <QFile>
#include <QDebug>MyThread::MyThread(const QString &source, const QString &destination, QObject *parent): QThread(parent), sourcePath(source), destinationPath(destination)
{
}void MyThread::run()
{QFile sourceFile(sourcePath);QFile destinationFile(destinationPath);// 打開源文件if (!sourceFile.open(QIODevice::ReadOnly)) {emit progressUpdated(-1); // 發送錯誤信號return;}// 打開目標文件if (!destinationFile.open(QIODevice::WriteOnly)) {emit progressUpdated(-1); // 發送錯誤信號return;}qint64 fileSize = sourceFile.size(); // 獲取文件大小qint64 bytesCopied = 0; // 已復制的字節數char buffer[4096]; // 緩沖區// 分塊讀取和寫入文件while (!sourceFile.atEnd()) {qint64 bytesRead = sourceFile.read(buffer, sizeof(buffer)); // 讀取數據destinationFile.write(buffer, bytesRead); // 寫入數據bytesCopied += bytesRead; // 更新已復制的字節數int progress = static_cast<int>((bytesCopied * 100) / fileSize); // 計算進度emit progressUpdated(progress); // 發送進度信號}// 關閉文件sourceFile.close();destinationFile.close();
}

3.widget.h?

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSlider>
#include <QFileDialog>
#include <QMessageBox>
#include "mythread.h"QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void updateProgress(int value); // 槽函數:更新進度條private:Ui::Widget *ui;MyThread *thread; // 文件復制線程
};#endif // WIDGET_H

?4.widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 設置 QSlider 的樣式QString qss = "QSlider { background: transparent; }" // 設置 QSlider 的背景為透明"QSlider::groove:horizontal { border: 1px solid gray; background: lightgray; height: 15px; border-radius: 5px; }""QSlider::sub-page:horizontal { background: #B5E61D; border-radius: 5px; }""QSlider::handle:horizontal { background:#5A730E; width: 10px; border-radius: 5px; }";ui->horizontalSlider->setStyleSheet(qss);ui->horizontalSlider->setRange(0, 100); // 設置進度條范圍ui->horizontalSlider->setValue(0); // 初始值為 0// 選擇源文件QString sourceFile = QFileDialog::getOpenFileName(this, "選擇要復制的文件");if (sourceFile.isEmpty()) {QMessageBox::warning(this, "警告", "未選擇源文件");return;}// 選擇目標文件QString destinationFile = QFileDialog::getSaveFileName(this, "選擇保存位置");if (destinationFile.isEmpty()) {QMessageBox::warning(this, "警告", "未選擇目標文件");return;}// 創建并啟動線程thread = new MyThread(sourceFile, destinationFile, this);connect(thread, &MyThread::progressUpdated, this, &Widget::updateProgress);thread->start();
}Widget::~Widget()
{if (thread) {thread->quit(); // 停止線程thread->wait(); // 等待線程結束delete thread; // 釋放線程對象}delete ui;
}// 槽函數:更新進度條
void Widget::updateProgress(int value)
{if (value == -1) {QMessageBox::critical(this, "錯誤", "文件復制失敗");return;}ui->horizontalSlider->setValue(value); // 更新 QSlider 的值if (value == 100) {QMessageBox::information(this, "完成", "文件復制完成");}
}

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

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

相關文章

Gartner:數據安全平臺DSP提升數據流轉及使用安全

2025 年 1 月 7 日&#xff0c;Gartner 發布“China Context&#xff1a;Market Guide for Data Security Platforms”&#xff08;《數據安全平臺市場指南——中國篇》&#xff0c;以下簡稱指南&#xff09;&#xff0c;報告主要聚焦中國數據安全平臺&#xff08;Data Securit…

道可云人工智能每日資訊|《奇遇三星堆》VR沉浸探索展(淮安站)開展

道可云元宇宙每日簡報&#xff08;2025年3月5日&#xff09;訊&#xff0c;今日元宇宙新鮮事有&#xff1a; 《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;開展 近日&#xff0c;《奇遇三星堆》VR沉浸探索展&#xff08;淮安站&#xff09;開展。該展將三星堆文…

Spring AI Alibaba + Ollama:國產大模型DeepSeek LLM的低成本AI應用開發認知

寫在前面 官方文檔很詳細&#xff0c;有開發需求可以直接看文檔https://java2ai.com/docs/1.0.0-M5.1/get-started/博文內容為一個開發Demo&#xff0c;以及API簡單認知理解不足小伙伴幫忙指正 &#x1f603;,生活加油 我看遠山&#xff0c;遠山悲憫 持續分享技術干貨&#xf…

解決:Word 保存文檔失敗,重啟電腦后,Word 在試圖打開文件時遇到錯誤

殺千刀的微軟&#xff0c;設計的 Word 是個幾把&#xff0c;用 LaTex 寫完公式&#xff0c;然后保存&#xff0c;卡的飛起 我看文檔卡了很久&#xff0c;就關閉文檔&#xff0c;然后 TMD 腦抽了重啟電腦 重啟之后&#xff0c;文檔打不開了&#xff0c;顯示 殺千刀的&#xff…

掌握高效大模型任務流搭建術(二):鏈式流程如何賦能 AI 處理能力提升

前言&#xff1a; 在上一篇文章中&#xff0c;我們初步探索了 LangChain 的基礎鏈式操作——LLMChain。它巧妙地將大語言模型&#xff08;LLM&#xff09;與提示模板&#xff08;Prompt Template&#xff09;相結合&#xff0c;為模型交互邏輯的封裝提供了一種簡潔而高效的方式…

虛擬卡 WildCard (野卡) 保姆級開卡教程

本文首發于只抄博客&#xff0c;歡迎點擊原文鏈接了解更多內容。 前言 本篇教程為 WildCard 的介紹以及開卡教學&#xff0c;要了解不同平臺&#xff08;Grok、Talkatone 等&#xff09;的訂閱方式請移步《訂閱教程》分類 當我們想要充值國外平臺會員時&#xff0c;一般都需要使…

計算機數據庫三級刷題總結(博主89分已過,總結的內容分享)

計算機數據庫三級刷題總結&#xff08;博主89分已過&#xff0c;總結的內容分享&#xff09; 文章目錄 計算機數據庫三級刷題總結&#xff08;博主89分已過&#xff0c;總結的內容分享&#xff09;一、 數據庫設計階段二、事務相關三、數據庫設計順序四、數據庫三級模式與二層映…

記錄一些面試遇到的問題

重載和重寫的區別 重載是overload&#xff0c;覆蓋是override 重載屬于編譯時多態&#xff0c;覆蓋屬于運行時多態 運行時多態和編譯時多態 運行時多態指的是在運行的時候才知道要調用哪一個函數&#xff0c;編譯時多態是指在編譯的時候就知道調用哪一個函數。 運行時多態…

HBuilder X 使用 TortoiseSVN 設置快捷鍵方法

HBuilder X 使用 TortoiseSVN 設置快捷鍵方法 單文件&#xff1a;(上鎖&#xff0c;解鎖&#xff0c;提交&#xff0c;更新) 安裝好 TortoiseSVN &#xff0c;或者 按圖操作&#xff1a; 1&#xff0c;工具欄中 【自定義快捷鍵】 2&#xff0c;點擊 默認的快捷鍵設置&…

JmeterHttp請求頭管理出現Unsupported Media Type問題解決

JmeterHttp請求頭管理出現Unsupported Media Type問題解決 大多數的app與pc端壓測的時候都會出現這種情況 當我們在jemter測試當中當中遇見Unsupported Media Type&#xff0c;有一種可能就是我們請求的網頁的content-Type的類型與我們測試的時候的類型不一致 解決方法 可以添…

Spring AI 1.0.0-M6 快速開始(一)

Spring AI 1.0.0-M6 入門一、存儲庫二、依賴管理完整maven 入門 Spring 是JAVA中我們經常使用的框架之一&#xff0c;Spring AI不斷的發展迭代目前已經到M6版本據說上半年會出一個穩定版本。 本節提供了如何開始使用Spring AI的M6。 一、存儲庫 1.0 M6 -添加Spring存儲庫 需…

頂點著色器和片段著色器

在Unity渲染中&#xff0c;**頂點著色器&#xff08;Vertex Shader&#xff09;和片段著色器&#xff08;Fragment Shader&#xff09;**是圖形渲染管線中的兩個核心階段。我們可以通過一個比喻來理解它們的分工&#xff1a;想象你要畫一幅由三角形組成的3D模型&#xff0c;頂點…

Impacket工具中的橫向滲透利器及其使用場景對比詳解

在滲透測試中&#xff0c;橫向移動&#xff08;Lateral Movement&#xff09;是指攻擊者在獲得一個系統的控制權限后&#xff0c;通過網絡進一步滲透到其他系統的過程。Impacket 是一款強大的滲透測試工具集&#xff0c;提供了多種實現橫向滲透的腳本&#xff0c;常見的工具包括…

設計模式|策略模式 Strategy Pattern 詳解

目錄 一、策略模式概述二、策略模式的實現2.1 策略接口2.2 具體策略類2.3 上下文類2.4 客戶端代碼2.5 UML類圖2.6 UML時序圖 三、優缺點3.1 ?優點3.2 ? 缺點 四、最佳實踐場景4.1 適合場景描述4.2 具體場景 五、擴展5.1 繼承復用機制和復合策略5.2 對象管理&#xff1a;優化策…

迷你世界腳本顯示板管理接口:DisPlayBoard

顯示板管理接口&#xff1a;DisPlayBoard 迷你世界 更新時間: 2023-04-26 10:21:14 具體函數名及描述如下: 序號 函數名 函數描述 1 showBoard(...) 對玩家顯示顯示板 2 hideBoard(...) 對玩家隱藏顯示板 3 setBoardPicture 對玩家設置顯示板的圖片…

尚硅谷爬蟲note14

一、scrapy scrapy&#xff1a;為爬取網站數據是&#xff0c;提取結構性數據而編寫的應用框架 1. 安裝 pip install scrapy 或者&#xff0c;國內源安裝 pip install scrapy -i https&#xff1a;//pypi.douban.com/simple 2. 報錯 報錯1&#xff09;building ‘twisted.te…

merge函數

merge函數 今天在刷lc&#xff0c;從靈神題解中學到的 來源&#xff1a;560. 和為 K 的子數組 - 力扣&#xff08;LeetCode&#xff09; java8 merge()方法被引入到HashMap類中&#xff0c;用于簡化鍵值對操作&#xff0c;在處理鍵值對時&#xff0c;提供一個重新映射函數來決…

Notepad++ 8.6.7 安裝與配置全攻略(Windows平臺)

一、軟件定位與核心優勢 Notepad 是開源免費的代碼/文本編輯器&#xff0c;支持超過80種編程語言的高亮顯示&#xff0c;相比系統自帶記事本具有以下優勢&#xff1a; 輕量高效&#xff1a;啟動速度比同類軟件快30%插件擴展&#xff1a;支持NppExec、JSON Viewer等200插件跨文…

建筑兔零基礎自學python記錄39|實戰詞云可視化項目——章節分布10(上)

這次我們來制作《紅樓夢》各章節的分布情況&#xff1a; 源代碼&#xff1a; import pandas as pd import numpy as np import matplotlib.pyplot as pltdf_hlm pd.read_csv("hlm.txt", names["hlm_texts"]).dropna()df_hlm df_hlm[~df_hlm.hlm_texts.s…

C++:#ifndef 頭文件保護機制詳解

在C開發中&#xff0c;頭文件可能會被多個源文件包含&#xff0c;導致編譯錯誤。為了避免這種情況&#xff0c;我們使用了頭文件保護機制&#xff08;防止重復包含&#xff09;。 頭文件保護的原理 通過預處理指令#ifndef&#xff08;如果沒有定義&#xff09;和#define&…