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(); // 清空TextEdit

    if(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;
}
运用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、付费专栏及课程。

余额充值