本文用QT实现记事本功能。
一、成品展示
1.界面
主要元素:
1.标题为MyNoteBook;
2.相应图标为:打开文件,保存,退出;
3.右下角标注光标所在行列,默认编码方式为UTF-8;
4.鼠标所在图标位置时会有变暗,点击也有颜色响应。
2.打开文本
打开文本:
1.打开文本后,标题会变为相关文件路径;
2.显示文件内容;
3.光标所在行列颜色变深;
4.利用鼠标滚轮实现字体放大缩小功能。
3.保存文件
保存文件
1.点击保存,输入文件名,保存。
4.关闭文件
关闭文件
1.点击关闭,弹出如下,点击相关按键可实现保存,不保存,退出功能。
二、代码实现
1.字体放大缩小
void Widget::zoomIn()
{QFont font = ui->textEdit->font();int fontSize = font.pointSize();if(fontSize == -1) return; int newFontSize = fontSize + 1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}void Widget::zoomOut()
{QFont font = ui->textEdit->font();int fontSize = font.pointSize();if(fontSize == -1) return;int newFontSize = fontSize - 1;font.setPointSize(newFontSize);ui->textEdit->setFont(font);
}
// 事件过滤器,用于处理滚轮事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QEvent::Wheel && QGuiApplication::keyboardModifiers() == Qt::ControlModifier){QWheelEvent *wheelEvent = dynamic_cast<QWheelEvent*>(event);if(wheelEvent->angleDelta().y() > 0){zoomIn(); }else if(wheelEvent->angleDelta().y() < 0){zoomOut(); }return true; }return false; }
2.打开文件
void Widget::on_btnFileOpen_clicked()
{QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "D:/QT/", tr("Text (*.txt)"));ui->textEdit->clear();file.setFileName(fileName);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){QMessageBox::critical(this, tr("Error"), tr("Failed to open file: %1").arg(fileName));return;}this->setWindowTitle(fileName + "- MyNoteBook"); QTextStream in(&file);QString str = ui->comboBox->currentText();const char* c_str = str.toStdString().c_str();in.setCodec(c_str);while (!in.atEnd()){QString context = in.readLine();ui->textEdit->append(context);}file.close();
}
3.保存文件
void Widget::on_btnSave_clicked()
{if(!file.isOpen()){QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "D:/QT/untitled.txt", tr("Text (*.txt *.doc)"));file.setFileName(fileName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){qDebug() << "file open error";}this->setWindowTitle(fileName + "- MyNoteBook"); }else {file.resize(0); }QTextStream out(&file);QString str = ui->comboBox->currentText();const char* c_str = str.toStdString().c_str();out.setCodec(c_str);QString context = ui->textEdit->toPlainText();out << context;
}
4.关闭文件
void Widget::on_btnClose_clicked()
{int ret = QMessageBox::warning(this, tr("MyNoteBook Notice:"), tr("The document has been modified.\nDo you want to save your changes?"), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Save);switch (ret) {case QMessageBox::Save: on_btnSave_clicked();qDebug() << "QMessageBox::Save:";break;case QMessageBox::Discard:ui->textEdit->clear();if(file.isOpen()) {file.close();this->setWindowTitle("MyNoteBook");}qDebug() << "QMessageBox::Discard:";break;case QMessageBox::Cancel: qDebug() << "QMessageBox::Cancel:";break;default: break;}
}
5.编码
void Widget::onCurrentIndexChanged(int index)
{qDebug() << "currentIndexChanged";ui->textEdit->clear(); // 清空TextEditif(file.isOpen()) { // 如果文件已打开qDebug() << "file is Open";// 使用QTextStream重读文件内容QTextStream in(&file);in.setCodec(ui->comboBox->currentText().toStdString().c_str());file.seek(0); while(!in.atEnd()) {QString context = in.readLine();ui->textEdit->append(context);}}
}
6.光标显示
void Widget::onCursorPositionChanged()
{QTextCursor cursor = ui->textEdit->textCursor();QString blockNum = QString::number(cursor.blockNumber() + 1);QString columnNum = QString::number(cursor.columnNumber() + 1);const QString labelMes = "L:" + blockNum + ",C:" + columnNum + " ";ui->labelPosition->setText(labelMes); // 更新位置标签QList<QTextEdit::ExtraSelection> extraSelections;QTextEdit::ExtraSelection ext;ext.cursor = cursor;QBrush qBrush(Qt::lightGray);ext.format.setBackground(qBrush);ext.format.setProperty(QTextFormat::FullWidthSelection, true);extraSelections.append(ext);ui->textEdit->setExtraSelections(extraSelections);
}
三、剩余代码
构造析构函数:
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->textEdit->installEventFilter(this);QShortcut *shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")), this);QShortcut *shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Save")), this);QShortcut *shortcutZoomIn = new QShortcut(QKeySequence(tr("Ctrl+Shift+=", "File|Zoom In")), this); QShortcut *shortcutZoomOut = new QShortcut(QKeySequence(tr("Ctrl+Shift+-", "File|Zoom Out")), this); connect(shortcutOpen, &QShortcut::activated, [=](){on_btnFileOpen_clicked(); });connect(shortcutSave, &QShortcut::activated, [=](){on_btnSave_clicked(); });connect(shortcutZoomIn, &QShortcut::activated, [=](){zoomIn(); });connect(shortcutZoomOut, &QShortcut::activated, [=](){zoomOut(); });this->setLayout(ui->verticalLayout);connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onCurrentIndexChanged(int)));connect(ui->textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(onCursorPositionChanged()));
}Widget::~Widget()
{delete ui;
}