QT項目之記事本

本文用QT實現記事本功能。

一、成品展示

1.界面

主要元素:

? ? ? ? 1.標題為MyNoteBook;

? ? ? ? 2.相應圖標為:打開文件,保存,退出;

? ? ? ? 3.右下角標注光標所在行列,默認編碼方式為UTF-8;

? ? ? ? 4.鼠標所在圖標位置時會有變暗,點擊也有顏色響應。

2.打開文本

打開文本:

? ? ? ? 1.打開文本后,標題會變為相關文件路徑;

? ? ? ? 2.顯示文件內容;

? ? ? ? 3.光標所在行列顏色變深;

? ? ? ? 4.利用鼠標滾輪實現字體放大縮小功能。

3.保存文件

保存文件

? ? ? ? 1.點擊保存,輸入文件名,保存。

4.關閉文件

關閉文件

? ? ? ? 1.點擊關閉,彈出如下,點擊相關按鍵可實現保存,不保存,退出功能。

二、代碼實現

1.字體放大縮小

void Widget::zoomIn()
{QFont font = ui->textEdit->font();int fontSize = font.pointSize();if(fontSize == -1) return; int newFontSize = fontSize + 1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}void Widget::zoomOut()
{QFont font = ui->textEdit->font();int fontSize = font.pointSize();if(fontSize == -1) return;int newFontSize = fontSize - 1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}
// 事件過濾器,用于處理滾輪事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QEvent::Wheel && QGuiApplication::keyboardModifiers() == Qt::ControlModifier){QWheelEvent *wheelEvent = dynamic_cast<QWheelEvent*>(event);if(wheelEvent->angleDelta().y() > 0){zoomIn(); }else if(wheelEvent->angleDelta().y() < 0){zoomOut(); }return true; }return false; }

2.打開文件

void Widget::on_btnFileOpen_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "D:/QT/", tr("Text (*.txt)"));ui->textEdit->clear();file.setFileName(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){QMessageBox::critical(this, tr("Error"), tr("Failed to open file: %1").arg(fileName));return;}this->setWindowTitle(fileName + "- MyNoteBook"); QTextStream in(&file);QString str = ui->comboBox->currentText();const char* c_str = str.toStdString().c_str();in.setCodec(c_str);while (!in.atEnd()){QString context = in.readLine();ui->textEdit->append(context);}file.close();
}

3.保存文件

void Widget::on_btnSave_clicked()
{if(!file.isOpen()){QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "D:/QT/untitled.txt", tr("Text (*.txt *.doc)"));file.setFileName(fileName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){qDebug() << "file open error";}this->setWindowTitle(fileName + "- MyNoteBook"); }else {file.resize(0); }QTextStream out(&file);QString str = ui->comboBox->currentText();const char* c_str = str.toStdString().c_str();out.setCodec(c_str);QString context = ui->textEdit->toPlainText();out << context;
}

4.關閉文件

void Widget::on_btnClose_clicked()
{int ret = QMessageBox::warning(this, tr("MyNoteBook Notice:"), tr("The document has been modified.\nDo you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);switch (ret) {case QMessageBox::Save: on_btnSave_clicked();qDebug() << "QMessageBox::Save:";break;case QMessageBox::Discard:ui->textEdit->clear();if(file.isOpen()) {file.close();this->setWindowTitle("MyNoteBook");}qDebug() << "QMessageBox::Discard:";break;case QMessageBox::Cancel: qDebug() << "QMessageBox::Cancel:";break;default: break;}
}

5.編碼

void Widget::onCurrentIndexChanged(int index)
{qDebug() << "currentIndexChanged";ui->textEdit->clear(); // 清空TextEditif(file.isOpen()) { // 如果文件已打開qDebug() << "file is Open";// 使用QTextStream重讀文件內容QTextStream in(&file);in.setCodec(ui->comboBox->currentText().toStdString().c_str());file.seek(0); while(!in.atEnd()) {QString context = in.readLine();ui->textEdit->append(context);}}
}

6.光標顯示

void Widget::onCursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();QString blockNum = QString::number(cursor.blockNumber() + 1);QString columnNum = QString::number(cursor.columnNumber() + 1);const QString labelMes = "L:" + blockNum + ",C:" + columnNum + "   ";ui->labelPosition->setText(labelMes); // 更新位置標簽QList<QTextEdit::ExtraSelection> extraSelections;QTextEdit::ExtraSelection ext;ext.cursor = cursor;QBrush qBrush(Qt::lightGray);ext.format.setBackground(qBrush);ext.format.setProperty(QTextFormat::FullWidthSelection, true);extraSelections.append(ext);ui->textEdit->setExtraSelections(extraSelections);
}

三、剩余代碼

構造析構函數:

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->textEdit->installEventFilter(this);QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")), this);QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Save")), this);QShortcut *shortcutZoomIn = new QShortcut(QKeySequence(tr("Ctrl+Shift+=", "File|Zoom In")), this); QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Zoom Out")), this); connect(shortcutOpen, &QShortcut::activated, [=](){on_btnFileOpen_clicked(); });connect(shortcutSave, &QShortcut::activated, [=](){on_btnSave_clicked(); });connect(shortcutZoomIn, &QShortcut::activated, [=](){zoomIn(); });connect(shortcutZoomOut, &QShortcut::activated, [=](){zoomOut(); });this->setLayout(ui->verticalLayout);connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int)));connect(ui->textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(onCursorPositionChanged()));
}Widget::~Widget()
{delete ui;
}

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

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

相關文章

【軟件測試】性能測試 —— 工具篇 JMeter 介紹與使用

&#x1f970;&#x1f970;&#x1f970;來都來了&#xff0c;不妨點個關注叭&#xff01; &#x1f449;博客主頁&#xff1a;歡迎各位大佬!&#x1f448; 文章目錄1. JMeter 的介紹2. JMeter 安裝、配置、搭建2.1 前置條件 —— Java環境搭建2.2 JMeter 下載2.3 JMeter 安裝…

二十二、Mybatis-快速入門程序

入門程序大概步驟敘述&#xff1a; 步驟一&#xff1a;創建springboot工程并且數據庫提前創建表步驟二&#xff1a;創建springboot工程對Mybatis相關依賴注意打勾步驟三&#xff1a;編寫查找方法步驟四&#xff1a;編寫測試方法項目目錄結構與數據庫以及代碼&#xff1a; 項目目…

Blender模擬結構光3D Scanner(一)外參數匹配

如何使用Blender模擬FPP(Fringe Projection Profilometry) 原理的結構光3D傳感器&#xff1f;主要包含的工作有&#xff1a;1&#xff09;相機、投影儀定位與內外參數匹配&#xff1b;2&#xff09;投影儀投射指定Pattern圖像&#xff1b;3&#xff09;被測物體材質屬性配置等&…

LangChain是如何實現RAG多輪問答的

目錄引言一、LangChain實現RAG多輪問答核心機制1. 對話歷史管理&#xff08;Memory&#xff09;2. 問題重寫&#xff08;Query Rewriting&#xff09;3. 檢索增強生成&#xff08;RAG Core&#xff09;4. 鏈式工作流&#xff08;Chain&#xff09;二、關鍵設計特點三、完整示例…

DAY 44 預訓練模型

知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 一、預訓練的概念 我們之前在訓練中發現&#xff0c;準確率最開始隨著epoch的增加而增加。隨著循環的更新&#xff0c;參數在不斷發生更新。 所…

Java Stream API 中常用方法復習及項目實戰示例

在最近的練手項目中&#xff0c;對于stream流的操作愈加頻繁&#xff0c;我也越來越感覺stream流在處理數據是的干凈利落&#xff0c;因此寫博客用來記錄最近常用的方法以便于未來的復習。map() 方法map()是一個中間操作&#xff08;intermediate operation&#xff09;&#x…

從零開始手搓一個GPT大語言模型:從理論到實踐的完整指南(一)

現在人工智能飛速發展時代&#xff0c;LLM絕對可以算是人工智能領域得一顆明珠&#xff0c;也是現在許多AI項目落地得必不可少得一個模塊&#xff0c;可以說&#xff0c;不管你之前得研究領域是AI得哪個方向&#xff0c;現在都需要會一些LLM基礎&#xff0c;在這個系列&#xf…

Redis ubuntu下載Redis的C++客戶端

1. 安裝 redis-plus-plus C 操作 Redis 的庫有很多&#xff0c;這里選擇使用 redis-plus-plus&#xff0c;這個庫的功能強大&#xff0c;使用簡單。 Github 地址&#xff1a;GitHub - sewenew/redis-plus-plus: Redis client written in C 訪問不了Github 地址的可以使用Ste…

nm命令和nm -D命令參數

出現這種差異的原因在于&#xff1a;動態庫中的符號分為兩種類型&#xff1a; 常規符號表&#xff08;regular symbol table&#xff09;&#xff1a;通常用于靜態鏈接和調試&#xff0c;默認不包含在動態庫中&#xff08;除非顯式保留&#xff09;。動態符號表&#xff08;dyn…

Windows下cuda的安裝和配置

今天開始做一個cuda教程。由于本人主要在windows下使用visual studio進行開發&#xff0c;因此這里講一下windows下的cuda開發環境。 下載cuda_toolkit 從網站https://developer.nvidia.com/cuda-toolkit中下載&#xff0c;先選擇Download Now,然后跳轉到如下頁面&#xff1a…

【代碼隨想錄day 19】 力扣 450.刪除二叉搜索樹中的節點

視頻講解&#xff1a;https://www.bilibili.com/video/BV1tP41177us/?share_sourcecopy_web&vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%A…

智慧養老丨實用科普+避坑指南:科技如何讓晚年生活更安全舒適?

隨著老齡化社會的到來&#xff0c;智慧養老產品逐漸成為改善老年人生活質量的重要工具。從智能手表到便攜洗浴機&#xff0c;科技正為老年人的健康、安全與生活便利提供創新解決方案。我們這次主要介紹四類典型智慧養老產品&#xff0c;結合真實體驗給出選購建議&#xff0c;并…

系統垃圾清理批處理腳本 (BAT)

系統垃圾清理批處理腳本 (BAT) 以下是一個Windows系統垃圾清理的批處理腳本&#xff0c;它可以清理常見的系統臨時文件、緩存和日志等&#xff1a; echo off title 系統垃圾清理工具 color 0a echo. echo 正在清理系統垃圾文件&#xff0c;請稍候... echo.:: 清理臨時文件 echo…

Terraform的零基礎學習教程

一、Terraform 是什么&#xff1f; Terraform 是由 HashiCorp 開發的開源工具&#xff0c;用于自動化管理云基礎設施&#xff08;如 AWS、Azure、GCP 等&#xff09;。 核心特點&#xff1a; 基礎設施即代碼&#xff08;IaC&#xff09;&#xff1a;用代碼定義和管理資源。跨…

429. N 叉樹的層序遍歷(中等)題解

題目描述給定一個 N 叉樹&#xff0c;返回其節點值的層序遍歷。&#xff08;即從左到右&#xff0c;逐層遍歷&#xff09;。樹的序列化輸入是用層序遍歷&#xff0c;每組子節點都由 null 值分隔&#xff08;參見示例&#xff09;。示例 1&#xff1a;輸入&#xff1a;root [1,…

Java 課程,每天解讀一個簡單Java之題目:輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。

package ytr250813;import java.io.IOException;public class CharacterCounter {public static void main(String[] args) throws IOException {// 初始化計數器變量int letterCount 0; // 英文字母計數器int spaceCount 0; // 空格計數器int digitCount 0; // 數字計數器i…

GitLab CI + Docker 自動構建前端項目并部署 — 完整流程文檔

一、環境準備1. 服務器準備一臺Linux服務器&#xff08;CentOS/Ubuntu皆可&#xff09;&#xff0c;推薦至少4核8GB內存已安裝 Docker&#xff08;及 Docker 服務已啟動&#xff09;已安裝 GitLab Runner2. 服務器上安裝 Docker &#xff08;如果沒裝&#xff09;# CentOS9以下…

LCP 17. 速算機器人

目錄 題目鏈接&#xff1a; 題目&#xff1a; 解題思路&#xff1a; 代碼&#xff1a; 總結&#xff1a; 題目鏈接&#xff1a; LCP 17. 速算機器人 - 力扣&#xff08;LeetCode&#xff09; 題目&#xff1a; # LCP 17. 速算機器人 小扣在秋日市集發現了一款速算機器人。…

Spring cloud集成ElastictJob分布式定時任務完整攻略(含snakeyaml報錯處理方法)

ElasticJob 是一款輕量級、可擴展的分布式定時任務解決方案&#xff0c;基于 Quartz 二次開發&#xff0c;支持任務分片、失效轉移、任務追蹤等功能&#xff0c;非常適合在 Spring Cloud 微服務場景中使用。我將帶你完成 Spring Cloud 集成 ElasticJob 的全過程&#xff0c;并分…

了解 Linux 中的 /usr 目錄以及 bin、sbin 和 lib 的演變

Linux 文件系統層次結構是一個復雜且引人入勝的體系&#xff0c;其根源深植于類 Unix 操作系統的歷史之中。在這一結構的核心&#xff0c;/usr 目錄是一個至關重要的組成部分&#xff0c;隨著時間的推移&#xff0c;它經歷了顯著的演變。與此同時&#xff0c;/bin、/sbin、/lib…