本文用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;
}