当前位置: 首页 > news >正文

P3 QT项目----记事本(3.8)

3.8 记事本项目总结

项目源码

1.main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

2.widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
#include <QList>
#include <QMessageBox>
#include <QShortcut>
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{ //建立快捷键  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); //字体缩小//Lambda表达式connect(shortcutOpen,&QShortcut::activated,[=](){ on_btnOpen_clicked(); }); connect(shortcutSave,&QShortcut::activated,[=](){on_btnSave_clicked();});connect(shortcutZoomIn,&QShortcut::activated,[=](){      ZoomIn();  });connect(shortcutZoomOut,&QShortcut::activated,[=](){ZoomOut();}); //进行widget与ui的窗口关联,里面布局不会随窗口变化而变化ui->setupUi(this); //下面这行代码进行显示说明,窗口变化时,布局及其子控件随之调整this->setLayout(ui->verticalLayout);ui->widgetButtom->setLayout(ui->horizontalLayout_3); //信号与槽:编码选择 QObject::connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(onCurrentIndexChanged(int)));   //信号与槽:光标位置QObject::connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onCursorPositionChanged()));
}
Widget::~Widget()
{delete ui;
}/* 快捷键字体变大 QApplication类*/
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);
}/* 打开按键 */
void Widget::on_btnOpen_clicked()
{//建立一个qfiledialog实例化QFileDialog qFileDialog;//设置对话框为打开文件模式qFileDialog.setFileMode(QFileDialog::ExistingFiles);//设置文件过滤器qFileDialog.selectNameFilter("Text files(*.txt*.doc) ");//打开文本框if(qFileDialog.exec()){//获取用户选择的文件列表QStringList fileName = qFileDialog.selectedFiles();//遍历列表并处理文件for(QString str : fileName){//输出文件名qDebug() << str;//清除文本编辑内容ui->textEdit->clear();//打开文件名file.setFileName(str);//判断是否成功打开文件if(!file.open(QIODevice::ReadWrite | QIODevice::Text)){qDebug() << "File Open Error!";}//标题文件名//this->setWindowTitle(fileName + "My NoyeBooks");//多态QTextStream in(&file);//读取方式//in.setCodec("UTF-8");//QString string = ui->comboBox->currentText();                     // 从下拉框获取当前选中的字符编码            // const char * c_str = string.toStdString().c_str();
//            in.setCodec(c_str);               //QString转为const char*型            in.setCodec(ui->comboBox->currentText().toStdString().c_str());     // 设置 QTextStream 的字符编码           //按行显示显示文件内容while (!file.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"),                                                        
"D:/Embedded_learning/03.QT_Codeinlesson/build-P3-1-notebook/untitled.txt",                                                        tr("Text files(*.txt*.doc)")); qDebug() << fileName; file.setFileName(fileName); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){ qDebug() << "File Save Error!";}//标题文件名this->setWindowTitle(fileName + "-My NoyeBooks");}//写入的内容QTextStream out(&file);//out.setCodec("UTF-8");out.setCodec(ui->comboBox->currentText().toStdString().c_str());    //QString转为const char*型QString context = ui->textEdit->toPlainText();//输入out << context;
}/* 关闭按键 */
void Widget::on_btnClose_clicked()
{ui->textEdit->clear();//未保存文件按下关闭按键时,会触发警告int ret = QMessageBox::warning(this, tr("My NoyeBooks"),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 clickedon_btnSave_clicked();qDebug() << "QMessageBox::Save:";break;case QMessageBox::Discard:   //丢弃// Don't Save was clickedui->textEdit->clear();if(file.isOpen()){file.close();this->setWindowTitle("My NoyeBooks");}qDebug() << "QMessageBox::Discard:";break;case QMessageBox::Cancel:qDebug() << "QMessageBox::Cancel:";// Cancel was clickedbreak;default:// should never be reachedbreak;}//检测设备是否打开,打开返回trueif(file.isOpen()){file.close();this->setWindowTitle("My NoyeBooks");}
}/* 解决乱码问题combobox */
void Widget::onCurrentIndexChanged(int index)
{//清除文本ui->textEdit->clear();//检测设备是否打开,打开返回trueif(file.isOpen()){// 创建 QTextStream 用于读取文件内容QTextStream in(&file);in.setCodec(ui->comboBox->currentText().toStdString().c_str());//光标回到初始位置file.seek(0);//继续显示文件内容while (!file.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 columNum = QString::number(cursor.columnNumber() + 1);const QString labelMes = "L:" + blockNum + ",C:" + columNum + "     ";ui->labelPosition->setText(labelMes);  //设置当前行高亮 QList<QTextEdit::ExtraSelection> extraSelection;    //定义qLish集合  QTextEdit::ExtraSelection ext;                      //qLish的一个对象   //1.知道当前行  ext.cursor = ui->textEdit->textCursor(); //2.颜色 QBrush qBrush(Qt::yellow); ext.format.setBackground(qBrush); ext.format.setProperty(QTextFormat::FullWidthSelection,true);   //配置段属性,需要整行设置,没有这行不行 //3.设置extraSelection.append(ext); //把ext加入到ext容器中ui->textEdit->setExtraSelections(extraSelection);
}

3.widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();QFile file;void ZoomIn();void ZoomOut();
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
4.testedit.cpp
#include "testedit.h"
/*将QTestEdit提升为testedit的ui界面,经事件处理,完成记事本可以通过鼠标滚轮和Ctrl键进行文本放大缩小
*/
#include <QWheelEvent>
#include <QDebug>testedit::testedit(QWidget *parent) : QTextEdit(parent)
{
}void testedit::wheelEvent(QWheelEvent *e)
{qDebug() << e->angleDelta().y();if(ctrlKeyPressed == 1){if(e->angleDelta().y() > 0){//放大zoomIn();}else if (e->angleDelta().y() < 0){zoomOut();}e->accept();}else{QTextEdit::wheelEvent(e);}
}void testedit::keyPressEvent(QKeyEvent *e)
{if(e->key() == Qt::Key_Control){qDebug() << "Ctrl is Pressed";ctrlKeyPressed = 1;}QTextEdit::keyPressEvent(e);
}void testedit::keyReleaseEvent(QKeyEvent *e)
{if(e->key() == Qt::Key_Control){qDebug() << "Ctrl is Released";ctrlKeyPressed = 0;} QTextEdit::keyReleaseEvent(e);
}

5.testedit.h

#ifndef TESTEDIT_H
#define TESTEDIT_H
#include <QTextEdit>
class testedit : public QTextEdit
{
public:testedit(QWidget *parent);
protected:void wheelEvent(QWheelEvent *e) override;void keyPressEvent(QKeyEvent *e) override;void keyReleaseEvent(QKeyEvent *e) override;
private:bool ctrlKeyPressed = 0;
};#endif // TESTEDIT_H

相关文章:

  • 【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练
  • PostgreSQL 对 IPv6 的支持情况
  • FastAPI核心解密:深入“路径操作”与HTTP方法,构建API的坚实骨架
  • 前端antd,后端fastapi,实现运行系统指令,并打印运行日志
  • Mac如何配置ZSH并使用Oh-my-zsh?让你的终端更加实用、美观
  • 初学 pytest 记录
  • 解决Excel词典(xllex.dll)文件丢失或损坏问题的终极指南:从基础到高级修复技巧
  • 在 JavaScript中编写 Appium 测试(入门)
  • Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
  • Spring Boot 与 Kafka 的深度集成实践(一)
  • PHP:Web 开发的经典利器
  • 「混合开发」H5与原生App交互流程方案全面解析
  • Tomcat Jetty 和 UnderTow 的粗略对比
  • 动手学深度学习13.3. 目标检测和边界框-笔记练习(PyTorch)
  • nodejs安装
  • (Note)基于Pytorch手搓RNN参考
  • 轻量级关键点 blaze pose 2025
  • 旋量理论:刚体运动的几何描述与机器人应用
  • 统计学(第8版)——假设检验学习笔记(考试用)
  • 树突状细胞与肿瘤
  • 公司简介网站怎么做/站长工具的使用seo综合查询排名
  • 秦皇岛市 网站建设/淘宝seo是指什么
  • 南京做网站团队/石家庄热搜
  • 广告项目网站开发/win7优化工具哪个好用
  • 重庆奉节网站建设/腾讯企点官网
  • 株洲专业网站建设品牌/账号权重查询入口