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); //追加到控件
    }
}

文件保存

开发流程

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

    读取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;
}

文件关闭

开发流程

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

代码实现

void Widget::on_btnClose_clicked()
{
    
    if(file.isOpen())
    {
        file.close();
        ui->textEdit->clear();
    }
}

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. 在Widget的构造函数中关联信号与槽,检测用户选择条目的信号。
connect(ui-
>comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onCurrentIndexChanged(int)))
;
//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);
        }
    }
}

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

4.添加文件打开提示

文件打开提示

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

文件保存也同理

文件关闭

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

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); //追加到控件
    }
}

记事本支持字符编码

 connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(oncurrentIndexChanged(int))); //捕捉字符编码信号
//字符编码
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); //追加到控件
        }
    }
}

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

显示光标行列值

//光标行列值
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);
}

7.文件打开提示

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

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

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


}

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


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

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

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

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

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

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

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

事件过滤器实现字体大小

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键没被按下
    }
}

项目完整代码

代码一

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

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

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

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

代码二

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

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

项目展现

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

}


**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

项目展现

在这里插入图片描述

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
运用Qt开发工具来实现一个记事本,用户图形界面操作,通过Qt提供的图形库来设计记事本的管理、应用基本窗口,主要实现打开、新建、保存、另存为、查找、居中、字体、颜色等功能设计,同时在软件内部实现对于这些功能的支持和实现。还有对用户剪切、复制、粘贴、等功能的支持 核心代码讲解 1、打开文件功能 void MainWindow::on_action_2_triggered() { QString filename = QFileDialog::getOpenFileName(this); loadFile(filename); } 打开文件on_action_2_triggered()通过转到槽实现首先定义一个Qstring类型的filename让它获取你文件名,其次寻找它的本地连接。 3、保存文件功能 void MainWindow::on_action_3_triggered() { if(isSaved){ saveFile(curFile); } else{ do_file_SaveAS(); } } 保存文件功能on_action_3_triggered()通过转到槽实现,先判断bool型的isSaved是否是正确的,如果错则保存当前文件,否则执行另存为。 5、关闭功能 void MainWindow::on_action_5_triggered() { if(close){ QMessageBox::information(this,"提示","文件尚未保存,关闭"); }else{ ui->textEdit->close(); } } 关闭功能on_action_5_triggered()先对文本进行判断是否是关闭的,如果是错弹出对话框提示消息文件尚未保存,关闭,否则对文档进行关闭 11、查找功能 //查找 void MainWindow::close_findhangshu() { ui->gridLayoutWidget->close(); } close_findhangshu()对查找对话框进行关闭函数。 void MainWindow::on_action_11_triggered() { QDialog *closefind=new QDialog(this); QDialog *findDlg=new QDialog(this); find_textLineEdit=new QLineEdit(findDlg); QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg); QPushButton *close_find=new QPushButton(tr("关闭"),closefind); ui->gridLayout->addWidget(find_textLineEdit); ui->gridLayout->addWidget(find_Bth); ui->gridLayout->addWidget(close_find); connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText())); connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu())); } 查找功能on_action_11_triggered()函数通过转到槽实现下面部分:先定义两个QDialog类型 指针变量*closefind和*findDlg,对它们进行新创建空间, find_textLineEdit=new QLineEdit(findDlg);新建一个空间对QlineEdit它进行传参,将findDlg传入目的是查找在文档中对应的文字,QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg);QPushButton *close_find=new QPushButton(tr("关闭"),closefind);这两个代码作用相同定义两个Qpubutton当点击查找功能弹出对话框时在对话框中实现查找下一个和关闭connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu()));点击查找下一个按钮时对它进行连接,执行show_findText()函数中的查找操作,如果点击关闭执行上述所说的close_findhangshu()关闭对话框操作 void MainWindow:: show_findText() { QString findText=find_textLineEdit->text(); if(!ui->textEdit->find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText)); } } show_findText()此函数先定义QString类型 findText值,对文本进行扫描,如果文本不能找到找到则提示找不到。 本人也只是一个学生,记得点赞哦!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值