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