P3 QT项目----记事本(3.8)

news2025/6/12 11:15:20
3.8 记事本项目总结

项目源码

1.main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

2.widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QList>
#include <QMessageBox>
#include <QShortcut>
Widget::Widget(QWidget *parent) 
   : QWidget(parent)
    , ui(new Ui::Widget)
{ 
   //建立快捷键  
  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|Save")),this);  //字体放大
    QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Save")),this); //字体缩小

    //Lambda表达式
    connect(shortcutOpen,&QShortcut::activated,[=]()
    { 
       on_btnOpen_clicked(); 
   }); 
   connect(shortcutSave,&QShortcut::activated,[=]()
    {
        on_btnSave_clicked();
    });
    connect(shortcutZoomIn,&QShortcut::activated,[=]()
   {      
        ZoomIn();  
  });
    connect(shortcutZoomOut,&QShortcut::activated,[=]()
    {
       ZoomOut();
    }); 

   //进行widget与ui的窗口关联,里面布局不会随窗口变化而变化
    ui->setupUi(this); 
   //下面这行代码进行显示说明,窗口变化时,布局及其子控件随之调整
    this->setLayout(ui->verticalLayout);
    ui->widgetButtom->setLayout(ui->horizontalLayout_3); 

   //信号与槽:编码选择 
   QObject::connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onCurrentIndexChanged(int)));   
   //信号与槽:光标位置
    QObject::connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));
}
Widget::~Widget()
{
    delete ui;
}

/* 快捷键字体变大 QApplication类*/
void Widget::ZoomIn()
{
    //获得TextEdit的当前字体信息
    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()
{
    //获得TextEdit的当前字体信息
    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::on_btnOpen_clicked()
{
    //建立一个qfiledialog实例化
    QFileDialog qFileDialog;
    //设置对话框为打开文件模式
    qFileDialog.setFileMode(QFileDialog::ExistingFiles);
    //设置文件过滤器
    qFileDialog.selectNameFilter("Text files(*.txt*.doc) ");
    //打开文本框
    if(qFileDialog.exec())
    {
        //获取用户选择的文件列表
        QStringList fileName = qFileDialog.selectedFiles();
        //遍历列表并处理文件
        for(QString str : fileName)
        {
            //输出文件名
            qDebug() << str;
            //清除文本编辑内容
            ui->textEdit->clear();
            //打开文件名
            file.setFileName(str);
            //判断是否成功打开文件
            if(!file.open(QIODevice::ReadWrite | QIODevice::Text))
            {
                qDebug() << "File Open Error!";
            }

            //标题文件名
            //this->setWindowTitle(fileName + "My NoyeBooks");
            //多态
            QTextStream in(&file);
            //读取方式
            //in.setCodec("UTF-8");
            //QString string = ui->comboBox->currentText();                     
            // 从下拉框获取当前选中的字符编码            
            // const char * c_str = string.toStdString().c_str();
//            in.setCodec(c_str);               //QString转为const char*型            

             in.setCodec(ui->comboBox->currentText().toStdString().c_str());     // 设置 QTextStream 的字符编码           
         //按行显示显示文件内容
            while (!file.atEnd())
            {
                QString context = in.readLine();
                ui->textEdit->append(context);
            }
        }
    }
}

/* 保存按键 */
void Widget::on_btnSave_clicked()
{
    if(!file.isOpen())  //有打开的文件直接保存,不需要生成新文件
    {
        QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),                                                        
"D:/Embedded_learning/03.QT_Codeinlesson/build-P3-1-notebook/untitled.txt",                                                        tr("Text files(*.txt*.doc)")); 
       qDebug() << fileName; 

       file.setFileName(fileName); 
       if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
        { 
           qDebug() << "File Save Error!";
        }
        //标题文件名
        this->setWindowTitle(fileName + "-My NoyeBooks");
    }
    //写入的内容
    QTextStream out(&file);
    //out.setCodec("UTF-8");
    out.setCodec(ui->comboBox->currentText().toStdString().c_str());    //QString转为const char*型
    QString context = ui->textEdit->toPlainText();
    //输入
    out << context;
}

/* 关闭按键 */
void Widget::on_btnClose_clicked()
{
    ui->textEdit->clear();
    //未保存文件按下关闭按键时,会触发警告
    int ret = QMessageBox::warning(this, tr("My NoyeBooks"),
                                    tr("The document has been modified.\n"
                                       "Do you want to save your changes?"),
                                    QMessageBox::Save | QMessageBox::Discard
                                    | QMessageBox::Cancel,
                                    QMessageBox::Save);
    switch (ret)
    {
       case QMessageBox::Save:  //保存
           // Save was clicked
        on_btnSave_clicked();
        qDebug() << "QMessageBox::Save:";
           break;
       case QMessageBox::Discard:   //丢弃
           // Don't Save was clicked
        ui->textEdit->clear();
        if(file.isOpen())
        {
            file.close();
            this->setWindowTitle("My NoyeBooks");
        }
        qDebug() << "QMessageBox::Discard:";
           break;
       case QMessageBox::Cancel:
        qDebug() << "QMessageBox::Cancel:";
           // Cancel was clicked
           break;
       default:
           // should never be reached
           break;
     }
    //检测设备是否打开,打开返回true
    if(file.isOpen())
    {
        file.close();
        this->setWindowTitle("My NoyeBooks");
    }
}

/* 解决乱码问题combobox */
void Widget::onCurrentIndexChanged(int index)
{
    //清除文本
    ui->textEdit->clear();
    //检测设备是否打开,打开返回true
    if(file.isOpen())
    {
        // 创建 QTextStream 用于读取文件内容
        QTextStream in(&file);
        in.setCodec(ui->comboBox->currentText().toStdString().c_str());
        //光标回到初始位置
        file.seek(0);
        //继续显示文件内容
        while (!file.atEnd())   
     {  
          QString context = in.readLine();  
          ui->textEdit->append(context); 
       }
    }
}
/* 光标位置 */
void Widget::onCursorPositionChanged()
{
    QTextCursor cursor = ui->textEdit->textCursor();
    //qDebug() << cursor.blockNumber() + 1 << "," << cursor.columnNumber() + 1;
    //行
    QString blockNum = QString::number(cursor.blockNumber() + 1);
    //列
    QString columNum = QString::number(cursor.columnNumber() + 1);
    const QString labelMes = "L:" + blockNum + ",C:" + columNum + "     ";
    ui->labelPosition->setText(labelMes);  
 
 //设置当前行高亮 
   QList<QTextEdit::ExtraSelection> extraSelection;    //定义qLish集合  
  QTextEdit::ExtraSelection ext;                      //qLish的一个对象   

 //1.知道当前行  
  ext.cursor = ui->textEdit->textCursor(); 
   //2.颜色 
   QBrush qBrush(Qt::yellow); 
   ext.format.setBackground(qBrush); 
   ext.format.setProperty(QTextFormat::FullWidthSelection,true);   //配置段属性,需要整行设置,没有这行不行 
   //3.设置
    extraSelection.append(ext); //把ext加入到ext容器中
    ui->textEdit->setExtraSelections(extraSelection);
}

3.widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    QFile file;
    void ZoomIn();
    void ZoomOut();
private slots:
    void on_btnOpen_clicked();
    void on_btnSave_clicked();
    void on_btnClose_clicked();
    void onCurrentIndexChanged(int index);
    void onCursorPositionChanged();
private:
    Ui::Widget *ui;
};

#endif // WIDGET_H
4.testedit.cpp
#include "testedit.h"
/*
    将QTestEdit提升为testedit的ui界面,经事件处理,
    完成记事本可以通过鼠标滚轮和Ctrl键进行文本放大缩小
*/
#include <QWheelEvent>
#include <QDebug>

testedit::testedit(QWidget *parent) : QTextEdit(parent)
{
}

void testedit::wheelEvent(QWheelEvent *e)
{
    qDebug() << e->angleDelta().y();
    if(ctrlKeyPressed == 1)
    {
        if(e->angleDelta().y() > 0)
        {
            //放大
            zoomIn();
        }
        else if (e->angleDelta().y() < 0)
        {
            zoomOut();
        }
        e->accept();
    }
    else
    {
        QTextEdit::wheelEvent(e);
    }
}

void testedit::keyPressEvent(QKeyEvent *e)
{
    if(e->key() == Qt::Key_Control)
    {
        qDebug() << "Ctrl is Pressed";
        ctrlKeyPressed = 1;
    }
    QTextEdit::keyPressEvent(e);
}

void testedit::keyReleaseEvent(QKeyEvent *e)
{
    if(e->key() == Qt::Key_Control)
    {
        qDebug() << "Ctrl is Released";
        ctrlKeyPressed = 0;
    } 
   QTextEdit::keyReleaseEvent(e);
}

5.testedit.h

#ifndef TESTEDIT_H
#define TESTEDIT_H
#include <QTextEdit>
class testedit : public QTextEdit
{
public:
    testedit(QWidget *parent);
protected:
    void wheelEvent(QWheelEvent *e) override;
    void keyPressEvent(QKeyEvent *e) override;
    void keyReleaseEvent(QKeyEvent *e) override;
private:
    bool ctrlKeyPressed = 0;
};

#endif // TESTEDIT_H

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…