当前位置:   article > 正文

QT—记事本项目_qt 实现记事本

qt 实现记事本

QT—记事本项目

功能介绍

  • 支持文本创建,打开,保存,关闭的功能
  • UI样式美化
  • 添加打开快捷键,添加保存快捷
  • 底部显示行列号及文本字符编码
  • Ctrl加鼠标滚轮支持字体放大缩小

1.初步实现文件,打开,关闭

文件打开

开发流程

  • 为QPushButton对应Open的控件设置槽函数
  • 槽函数代码开发

打开文件

读取文件

把文件数据显示在TextEdit控件

代码实现

void Widget::on_btnOpen_clicked()
{
    QString  fileName = QFileDialog::getOpenFileName(this,
        tr("Open File"), "F:/Qt/", tr("Text (*.txt)"));

    ui->textEdit->clear();//刷新文本控件

    file.setFileName(fileName);
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))
    {
        qDebug()<<"file open error";
    }

    QTextStream in(&file);
    in.setCodec("UTF-8");

    while (!in.atEnd()) {
            QString str = in.readLine();
            ui->textEdit->append(str); //追加到控件
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

文件保存

开发流程

  • 判断当下是否有已经打开的文件,如果有打开的文件

    读取TextEdit的内容

    写入新文件

代码实现

void Widget::on_btnSave_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
                               "F:/Qt/untitled.txt",
                               tr("Text (*.txt *.doc)"));
    file.setFileName(fileName);
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        qDebug()<<"file open error";
    }

    QTextStream  out(&file);
    out.setCodec("UTF-8");
    QString  context=ui->textEdit->toPlainText();
    out << context;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

文件关闭

开发流程

文件是否打开,打开就关闭;没打开就不用处理

代码实现

void Widget::on_btnClose_clicked()
{
    
    if(file.isOpen())
    {
        file.close();
        ui->textEdit->clear();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.记事本支持字符编码

获取用户在QComboBox上选择的字符编码,用特定编码打开文件,这里注意QComboBox返回QString类型,

setCodec参数要求const char*型

QString先转成C++的String,再转换成const char *

void Widget::on_btnFileOpen_clicked()
{
    // 使用文件对话框获取要打开的文件的路径
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                    "D:/QT/",
                                                    tr("Text (*.txt)"));
    // 清空文本编辑器的内容
    ui->textEdit->clear();
    // 设置 QFile 对象的文件名
    file.setFileName(fileName);
    // 尝试以只读和文本模式打开文件
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
        // 如果文件打开失败,输出错误信息
        qDebug() << "file open error";
    }
    // 创建 QTextStream 用于读取文件内容
    QTextStream in(&file);
    // 从下拉框获取当前选中的字符编码
    QString str = ui->comboBox->currentText();
    // 将 QString 转化为 char* 类型
    const char* c_str = str.toStdString().c_str();
    // 设置 QTextStream 的字符编码
    in.setCodec(c_str);
    // 循环读取文件直到结束
    while(!in.atEnd()){
        // 读取文件的一行
        QString context = in.readLine();
        // 将读取的内容追加到文本编辑器
        ui->textEdit->append(context);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

支持打开文件后进行字符编码的重新选择和显示加载

//1. 在Widget的构造函数中关联信号与槽,检测用户选择条目的信号。
connect(ui-
>comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onCurrentIndexChanged(int)))
;
  • 1
  • 2
  • 3
  • 4
//2. 添加槽函数,当用户选择信号后被调用,判断是否当前有打开的文件,如果有,则重新用新的编码读取文
件并重新显示。
    // onCurrentIndexChanged 方法:当 QComboBox 的选中项变化时执行
    void Widget::onCurrentIndexChanged(int index)
{
    // 输出调试信息,表示此槽函数被触发
    qDebug() << "currentIndexChanged Signal";
    // 清空文本编辑器的内容
    ui->textEdit->clear();
    // 检查文件是否已经打开
    if(file.isOpen()){
        // 输出调试信息,表示文件是打开状态
        qDebug() << "file is Open";
        // 创建 QTextStream 用于读取文件内容
        QTextStream in(&file);
        // 设置 QTextStream 的字符编码为 QComboBox 当前选中的编码
        in.setCodec(ui->comboBox->currentText().toStdString().c_str());
        // 将文件指针移动到文件开始位置
        file.seek(0);
        // 循环读取文件直到文件结束
        while(!in.atEnd()){
            // 读取文件的一行
            QString context = in.readLine();
            // 将读取的内容追加到文本编辑器
            ui->textEdit->append(context);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

3.添加行列显示

使用QTextEdit的cursorPositionChanged信号,当光标发生移动时候刷新显示

//1. 在构造函数中添加信号与槽
connect(ui-
        >textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));
//2. 槽函数获取textEdit的行列并显示到QLabel上
void Widget::onCursorPositionChanged()
{
    QTextCursor cursor = ui->textEdit->textCursor();
    //qDebug() << cursor.blockNumber()+1 <<","<< cursor.columnNumber() + 1;
    QString blockNum = QString::number(cursor.blockNumber()+1);
    QString columnNum = QString::number(cursor.columnNumber()+1);
    const QString labelMes = "L:"+blockNum+",C:"+columnNum+" ";
    //const QString labelMes = "行:"+blockNum+",列:"+columnNum+" ";
    ui->labelPosition->setText(labelMes);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

4.添加文件打开提示

文件打开提示

 this->setWindowTitle(fileName+"-MynoteBook"); //记事本打开提示
  • 1

文件保存也同理

文件关闭

this->setWindowTitle("MynoteBook"); //记事本关闭提示
  • 1

5.打开功能优化

QComboBox

QComboBox 是 Qt 框架中用于创建下拉列表的一个控件。

它允许用户从一组选项中选择一个选项,并可以配置为可编辑,使用户能够在其中输入文本。

QComboBox 提供了一系列方法来添加、删除和修改列表中的项,支持通过索引或文本检索项,并可以通过信号和槽机制来响应用户的选择变化。该控件广泛应用于需要从多个选项中进行选择的用户界面场景,例如表单和设置界面

打开功能

//记事本打开功能
void Widget::on_btnOpen_clicked()
{
    QString  fileName = QFileDialog::getOpenFileName(this,
                                                     tr("Open File"), "F:/Qt/", tr("Text (*.txt)"));

    ui->textEdit->clear();//刷新文本控件

    file.setFileName(fileName);
    if(!file.open(QIODevice::ReadWrite|QIODevice::Text))
    {
        qDebug()<<"file open error";
    }

    this->setWindowTitle(fileName+"-MynoteBook"); //记事本打开提示

    QTextStream in(&file);
    //    in.setCodec("UTF-8");

    QString str=ui->comboBox->currentText();//把Qstring转换为char*
    const char* c_str=str.toStdString().c_str();
    in.setCodec(c_str);

    while (!in.atEnd()) {
        QString str = in.readLine();
        ui->textEdit->append(str); //追加到控件
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

记事本支持字符编码

 connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(oncurrentIndexChanged(int))); //捕捉字符编码信号
  • 1
//字符编码
void Widget::oncurrentIndexChanged(int index)
{
    ui->textEdit->clear();
    if(file.isOpen())
    {
        QTextStream in(&file);
        in.setCodec(ui->comboBox->currentText().toStdString().c_str());
        file.seek(0);
        while (!in.atEnd()) {
            QString str = in.readLine();
            ui->textEdit->append(str); //追加到控件
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

6.添加行列显示

使用QTextEdit的cursorPositionChanged信号,当光标发生移动时候刷新显示

//1. 在构造函数中添加信号与槽
connect(ui-
        >textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));
//2. 槽函数获取textEdit的行列并显示到QLabel上
void Widget::onCursorPositionChanged()
{
    QTextCursor cursor = ui->textEdit->textCursor();
    //qDebug() << cursor.blockNumber()+1 <<","<< cursor.columnNumber() + 1;
    QString blockNum = QString::number(cursor.blockNumber()+1);
    QString columnNum = QString::number(cursor.columnNumber()+1);
    const QString labelMes = "L:"+blockNum+",C:"+columnNum+" ";
    //const QString labelMes = "行:"+blockNum+",列:"+columnNum+" ";
    ui->labelPosition->setText(labelMes);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

显示光标行列值

//光标行列值
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;
    QTextEdit::ExtraSelection ext;
    //1.知道当前行
    ext.cursor=cursor;

    QBrush qBrush(Qt::lightGray);
    //2.颜色
    ext.format.setBackground(qBrush);
    //配置段属性:整行显示,没有不行
    ext.format.setProperty(QTextFormat::FullWidthSelection,true);

    //3.设置
    //把ext加到ext的容器中
    extraSelection.append(ext);
    ui->textEdit->setExtraSelections(extraSelection);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

7.文件打开提示

this->setWindowTitle(fileName + "- MyNoteBook");
  • 1

8.文件保存功能优化

开发流程

  • 判断当下是否有已经打开的文件,如果有打开的文件
    读取TextEdit的内容
    写入新文件
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)){
                                                                         qDebug() << "file open error";
                                                                     }
                                                                     this->setWindowTitle(fileName + "- MyNoteBook");
                                                                     }
                                                                     //当保存被按下,不管是已有打开的文件还是上面if满足后用户选择新文件,都要读取TextEdit
                                                                     内容并写入文件中
                                                                     QTextStream out(&file);
                                                                     out.setCodec(ui->comboBox->currentText().toStdString().c_str());
                                                                     QString context = ui->textEdit->toPlainText();
                                                                     out << context;
                                                                     }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

9.关闭功能优化

//记事本关闭功能
void Widget::on_btnClose_clicked()
{
    QMessageBox msgBox; //弹窗组件
    int ret = QMessageBox::warning(this, tr("My NoteBook NOtice:"),
                                   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:
        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:
        qDebug()<<"should never be reached";
        break;
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

10.快捷键功能

 QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),this);
    QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Save")),this);
    QShortcut *shortzoomIn = new QShortcut(QKeySequence(tr("Ctrl+Shift+=", "File|Save")),this);
    QShortcut *shortzoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Save")),this);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
 //打开快捷键
    connect(shortcutOpen,&QShortcut::activated,[=](){
        on_btnOpen_clicked();
    });

    //保存快捷键
    connect(shortcutSave,&QShortcut::activated,[=](){
        on_btnSave_clicked();
    });

    connect(shortzoomIn,&QShortcut::activated,[=](){
               zoomIn();
    });

    connect(shortzoomOut,&QShortcut::activated,[=](){
               zoomOut();
    });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

//快捷键放大
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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
//快捷键缩小
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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

11.滚动实现字体大小

mytextedit.h

#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H

#include <qtextedit.h>



class MyTextEdit : public QTextEdit
{
public:
    MyTextEdit(QWidget *parent);
    void wheelEvent(QWheelEvent *e) override;
    void keyPressEvent(QKeyEvent *e) override;
    void keyReleaseEvent(QKeyEvent *e) override;
private:
    bool ctrlKetPressed=0;
};

#endif // MYTEXTEDIT_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

mytextedit.cpp

#include "mytextedit.h"

#include <QWheelEvent>
#include <QDebug>

MyTextEdit::MyTextEdit(QWidget *parent):QTextEdit(parent)
{

}

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

void MyTextEdit::keyPressEvent(QKeyEvent *e)
{
    if(e->key()==Qt::Key_Control)
    {
        qDebug()<<"ctrl pressed";
        ctrlKetPressed=1;
    }
    QTextEdit::keyPressEvent(e);
}

void MyTextEdit::keyReleaseEvent(QKeyEvent *e)
{
    if(e->key()==Qt::Key_Control)
    {
        qDebug()<<"ctrl released";
        ctrlKetPressed=0;
    }
    QTextEdit::keyReleaseEvent(e);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

事件过滤器实现字体大小

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    /*
    if(event->type()==QEvent::MouseButtonPress)
    {
        qDebug()<<"MouseButtonPress";
    }
    */
    /*
    QKeyEvent *keyevent=(QKeyEvent*)event;
    if(keyevent->key()==Qt::Key_Control)
    {

    }
    */
    if(event->type()==QEvent::Wheel)
    {
        if(QGuiApplication::keyboardModifiers()==Qt::ControlModifier)
        {
               qDebug()<<"ctrl+wheel";
               QWheelEvent *wheelevent=dynamic_cast<QWheelEvent*>(event);
               if(wheelevent->angleDelta().y()>0)
               {
                   zoomIn();
               }
               else if(wheelevent->angleDelta().y()<0)
               {
                   zoomOut();
               }
               return  true; //ctrl键被按下
        }

        return false;  //ctrl键没被按下
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

项目完整代码

代码一

mytextedit.h

#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H

#include <qtextedit.h>



class MyTextEdit : public QTextEdit
{
public:
    MyTextEdit(QWidget *parent);
    void wheelEvent(QWheelEvent *e) override;
    void keyPressEvent(QKeyEvent *e) override;
    void keyReleaseEvent(QKeyEvent *e) override;
private:
    bool ctrlKetPressed=0;
};

#endif // MYTEXTEDIT_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QFile>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    QFile  file;

    void zoomIn();
    void zoomOut();

    Widget(QWidget *parent = nullptr);
    ~Widget();

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

mytextedit.cpp

#include "mytextedit.h"

#include <QWheelEvent>
#include <QDebug>

MyTextEdit::MyTextEdit(QWidget *parent):QTextEdit(parent)
{

}

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

void MyTextEdit::keyPressEvent(QKeyEvent *e)
{
    if(e->key()==Qt::Key_Control)
    {
        qDebug()<<"ctrl pressed";
        ctrlKetPressed=1;
    }
    QTextEdit::keyPressEvent(e);
}

void MyTextEdit::keyReleaseEvent(QKeyEvent *e)
{
    if(e->key()==Qt::Key_Control)
    {
        qDebug()<<"ctrl released";
        ctrlKetPressed=0;
    }
    QTextEdit::keyReleaseEvent(e);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QFileDialog>
#include<QDebug>
#include <QMessageBox>
#include <QShortcut>

//快捷键放大
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);
}

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),this);
    QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Save")),this);
    QShortcut *shortzoomIn = new QShortcut(QKeySequence(tr("Ctrl+Shift+=", "File|Save")),this);
    QShortcut *shortzoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Save")),this);

    //打开快捷键
    connect(shortcutOpen,&QShortcut::activated,[=](){
        on_btnOpen_clicked();
    });

    //保存快捷键
    connect(shortcutSave,&QShortcut::activated,[=](){
        on_btnSave_clicked();
    });

    connect(shortzoomIn,&QShortcut::activated,[=](){
               zoomIn();
    });

    connect(shortzoomOut,&QShortcut::activated,[=](){
               zoomOut();
    });

    this->setLayout(ui->verticalLayout);
    ui->widgetBottom->setLayout(ui->horizontalLayout);
    connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(oncurrentIndexChanged(int))); //捕捉字符编码信号
    connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(oncursorPositionChanged()));  //捕捉光标行列值
}

Widget::~Widget()
{
    delete ui;
}



//记事本打开功能
void Widget::on_btnOpen_clicked()
{
    QString  fileName = QFileDialog::getOpenFileName(this,
                                                     tr("Open File"), "F:/Qt/", tr("Text (*.txt)"));

    ui->textEdit->clear();//刷新文本控件

    file.setFileName(fileName);
    if(!file.open(QIODevice::ReadWrite|QIODevice::Text))
    {
        qDebug()<<"file open error";
    }

    this->setWindowTitle(fileName+"-MynoteBook"); //记事本打开提示

    QTextStream in(&file);
    //    in.setCodec("UTF-8");

    QString str=ui->comboBox->currentText();//把Qstring转换为char*
    const char* c_str=str.toStdString().c_str();
    in.setCodec(c_str);

    while (!in.atEnd()) {
        QString str = in.readLine();
        ui->textEdit->append(str); //追加到控件
    }
}

//记事本保存功能
void Widget::on_btnSave_clicked()
{
    if(!file.isOpen())  //文件是否打开
    {
        QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
                                                        "F:/Qt/untitled.txt",
                                                        tr("Text (*.txt *.doc)"));
        file.setFileName(fileName);
        if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
        {
            qDebug()<<"file open error";
        }

        this->setWindowTitle(fileName+"-MynoteBook"); //记事本保存提示
    }
    QTextStream  out(&file);
    out.setCodec(ui->comboBox->currentText().toStdString().c_str());
    QString  context=ui->textEdit->toPlainText();
    out << context;
}

//记事本关闭功能
void Widget::on_btnClose_clicked()
{
    QMessageBox msgBox; //弹窗组件
    int ret = QMessageBox::warning(this, tr("My NoteBook NOtice:"),
                                   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:
        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:
        qDebug()<<"should never be reached";
        break;
    }


}

//字符编码
void Widget::oncurrentIndexChanged(int index)
{
    ui->textEdit->clear();
    if(file.isOpen())
    {
        QTextStream in(&file);
        in.setCodec(ui->comboBox->currentText().toStdString().c_str());
        file.seek(0);
        while (!in.atEnd()) {
            QString str = in.readLine();
            ui->textEdit->append(str); //追加到控件
        }
    }
}

//光标行列值
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;
    QTextEdit::ExtraSelection ext;
    //1.知道当前行
    ext.cursor=cursor;

    QBrush qBrush(Qt::lightGray);
    //2.颜色
    ext.format.setBackground(qBrush);
    //配置段属性:整行显示,没有不行
    ext.format.setProperty(QTextFormat::FullWidthSelection,true);

    //3.设置
    //把ext加到ext的容器中
    extraSelection.append(ext);
    ui->textEdit->setExtraSelections(extraSelection);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208

代码二

widget.h

#include "widget.h"
#include "ui_widget.h"

#include <QFileDialog>
#include <QDebug>
#include <QMessageBox>
#include <QShortcut>
#include <QWheelEvent>


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|Save")),this);
    QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Save")),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();
    });

    //虽然上面一行代码进行widget和ui的窗口关联,但是如果发生窗口大小变化的时候,里面的布局不会随之变化
    //通过下面这行代码进行显示说明,让窗口变化时,布局及其子控件随之调整
    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;
}

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);
}

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    /*
    if(event->type()==QEvent::MouseButtonPress)
    {
        qDebug()<<"MouseButtonPress";
    }
    */
    /*
    QKeyEvent *keyevent=(QKeyEvent*)event;
    if(keyevent->key()==Qt::Key_Control)
    {

    }
    */
    if(event->type()==QEvent::Wheel)
    {
        if(QGuiApplication::keyboardModifiers()==Qt::ControlModifier)
        {
               qDebug()<<"ctrl+wheel";
               QWheelEvent *wheelevent=dynamic_cast<QWheelEvent*>(event);
               if(wheelevent->angleDelta().y()>0)
               {
                   zoomIn();
               }
               else if(wheelevent->angleDelta().y()<0)
               {
                   zoomOut();
               }
               return  true; //ctrl键被按下
        }

        return false;  //ctrl键没被按下
    }
}


void Widget::on_btnFileOpen_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
                                                    "F:/Qt/",
                                                    tr("Text (*.txt)"));

    ui->textEdit->clear();

    file.setFileName(fileName);
    if(!file.open(QIODevice::ReadWrite | QIODevice::Text)){
        qDebug() << "file open error";
    }
    this->setWindowTitle(fileName + "- MyNoteBook");
    QTextStream in(&file);
    // in.setCodec("UTF-8");
    // in.setCodec("ANSI");
    //in.setCodec(ui->comboBox->currentText().toStdString().c_str());
    QString str = ui->comboBox->currentText();//把QString转化成char *
    const char* c_str = str.toStdString().c_str();

    in.setCodec(c_str);
    while(!in.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"),
                                                        "F:/Qt/untitled.txt",
                                                        tr("Text (*.txt *.doc)"));

        file.setFileName(fileName);
        if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
            qDebug() << "file open error";
        }
        this->setWindowTitle(fileName + "- MyNoteBook");

    }
    QTextStream out(&file);
    out.setCodec(ui->comboBox->currentText().toStdString().c_str());
    QString context = ui->textEdit->toPlainText();
    out << context;
}

void Widget::on_btnClose_clicked()
{

    QMessageBox msgBox;

    int ret = QMessageBox::warning(this, tr("MyNoteBook Notice:"),
                                   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("MyNoteBook");
        }
        qDebug() << "QMessageBox::Discard:";
        break;
    case QMessageBox::Cancel:
        // Cancel was clicked
        qDebug() << "QMessageBox::Cancel:";
        break;
    default:
        // should never be reached
        break;
    }
}

void Widget::onCurrentIndexChanged(int index)
{
    qDebug() << "currentItSignal";
    ui->textEdit->clear();
    if(file.isOpen()){
        qDebug() << "file is Open";
        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);
        }
    }
}

void Widget::onCursorPositionChanged()
{

    QTextCursor cursor =  ui->textEdit->textCursor();
    //qDebug() << cursor.blockNumber()+1  <<","<< cursor.columnNumber() + 1;

    QString blockNum = QString::number(cursor.blockNumber()+1);
    QString columnNum = QString::number(cursor.columnNumber()+1);

    const QString labelMes = "L:"+blockNum+",C:"+columnNum+"   ";
    //const QString labelMes = "行:"+blockNum+",列:"+columnNum+"   ";
    ui->labelPosition->setText(labelMes);


    //设置当前行高亮
    QList<QTextEdit::ExtraSelection> extraSelections;
    QTextEdit::ExtraSelection ext;

    //1. 知道当前行
    ext.cursor = cursor;

    QBrush qBrush(Qt::lightGray);
    //2. 颜色
    ext.format.setBackground(qBrush);
    //配置段属性:整行显示,没有这句话不行
    ext.format.setProperty(QTextFormat::FullWidthSelection, true);
    //ext.format.setFontUnderline(true);
    //3. 设置
    //把ext加到ext的容器中
    extraSelections.append(ext);
    ui->textEdit->setExtraSelections(extraSelections);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QFile>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    QFile file;
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void zoomIn();
    void zoomOut();
    bool eventFilter(QObject *watched, QEvent *event);


private slots:
    void on_btnFileOpen_clicked();

    void on_btnSave_clicked();

    void on_btnClose_clicked();

    void onCurrentIndexChanged(int index);

    void onCursorPositionChanged();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

项目展现

;
ui->labelPosition->setText(labelMes);

//设置当前行高亮
QList<QTextEdit::ExtraSelection> extraSelections;
QTextEdit::ExtraSelection ext;

//1. 知道当前行
ext.cursor = cursor;

QBrush qBrush(Qt::lightGray);
//2. 颜色
ext.format.setBackground(qBrush);
//配置段属性:整行显示,没有这句话不行
ext.format.setProperty(QTextFormat::FullWidthSelection, true);
//ext.format.setFontUnderline(true);
//3. 设置
//把ext加到ext的容器中
extraSelections.append(ext);
ui->textEdit->setExtraSelections(extraSelections);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

}


**widget.h**

```c++
#ifndef WIDGET_H
#define WIDGET_H

#include <QFile>
#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    QFile file;
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void zoomIn();
    void zoomOut();
    bool eventFilter(QObject *watched, QEvent *event);


private slots:
    void on_btnFileOpen_clicked();

    void on_btnSave_clicked();

    void on_btnClose_clicked();

    void onCurrentIndexChanged(int index);

    void onCursorPositionChanged();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

项目展现

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/615871
推荐阅读
相关标签
  

闽ICP备14008679号