Qt项目,记事本
一、项目说明
项目功能:
(1)打开文件:点击打开文件按钮弹出对话框,选择文本文件后,在主窗口编辑界面显示内容。
(2)关闭文件:关闭打开的文件,并询问是否保存。
(3)保存文件:保存文件,新文件要指定路径,旧文件直接保存。
(4)编辑界面:显示文本内容,编辑文本。游标所在行高亮标记。
(5)快捷键:ctrl+O/S:打开关闭文件,ctrl加滚轮:放大缩小文本编辑框的内容显示
二、代码
mytextedit.h
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H#include <QTextEdit>class MyTextEdit : public QTextEdit
{
public:MyTextEdit(QWidget *parent);
protected:void keyPressEvent(QKeyEvent *event) override;void keyReleaseEvent(QKeyEvent *event) override;void wheelEvent(QWheelEvent *event) override;
private:bool control_key_pressed=false;
};#endif // MYTEXTEDIT_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QFile>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();QFile file;
public:void zoomInFont();void zoomOutFont();private slots:void on_btnOpen_clicked();void on_btnSave_clicked();void on_btnClose_clicked();void on_comboBox_activated(const QString &arg1);void on_cursorPositionChanged();
private:Ui::Widget *ui;};
#endif // WIDGET_H
main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
mytextedit.cpp
#include "mytextedit.h"
#include "widget.h"#include <QKeyEvent>
#include <QDebug>MyTextEdit::MyTextEdit(QWidget *parent) : QTextEdit(parent)
{}
void MyTextEdit::keyPressEvent(QKeyEvent *event)
{if(event->key()==Qt::Key_Control){control_key_pressed=true;}QTextEdit::keyPressEvent(event);
}void MyTextEdit::keyReleaseEvent(QKeyEvent *event)
{if(event->key()==Qt::Key_Control){control_key_pressed=false;}QTextEdit::keyReleaseEvent(event);}void MyTextEdit::wheelEvent(QWheelEvent *event)
{if(control_key_pressed==true){if(event->angleDelta().y()>0){zoomIn();}else if(event->angleDelta().y()<0){zoomOut();}event->accept();}else{QTextEdit::wheelEvent(event);}}
widget.cpp
#include "widget.h"
#include "ui_widget.h"#include <QFileDialog>
#include <QDebug>
#include <QTextEdit>
#include <QMessageBox>
#include <QShortcut>
#include <ui_widget.h>
#include <QKeyEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//使布局跟随窗口大小变化this->setLayout(ui->verticalLayout);//ui->underWidget->setLayout(ui->under_hl_Layout); //同样是使布局跟随窗口大小变化//快捷键QShortcut * shortcutOpen = new QShortcut(QKeySequence(tr("Ctrl+O", "File|Open")),this);QShortcut * shortcutSave = new QShortcut(QKeySequence(tr("Ctrl+S", "File|Save")),this);connect(shortcutOpen,&QShortcut::activated,[=](){on_btnOpen_clicked();});connect(shortcutSave,&QShortcut::activated,[=](){on_btnSave_clicked();});//关联信号与槽,光标行列connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(on_cursorPositionChanged()));
}Widget::~Widget()
{delete ui;
}//打开文件按钮
void Widget::on_btnOpen_clicked()
{//先关闭之前的文件if(file.isOpen())file.close();//调用QFileDialog的静态成员函数,获取文件名,QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"),"D:/QtProjects",tr("Text files (*.txt)"));//清屏,清除文本编辑框里的内容ui->textEdit->clear();//创建QFile对象file,参数为文件路径file.setFileName(fileName);//调用打开文件函数,参数为打开方式,若打开不成功则报错if(!file.open(QIODevice::ReadWrite | QIODevice::Text)){qDebug()<<"file open error!";}//设置记事本标题this->setWindowTitle(fileName+"-记事本");//创建QTextStream对象in,参数为&fileQTextStream in(&file);//设置编码格式QString qstr=ui->comboBox->currentText();const char* mycodectext=qstr.toStdString().c_str();in.setCodec(mycodectext);//循环读取对象in中的内容while(!in.atEnd()){//按行来读取,每行都读到context中QString context =in.readLine();//qDebug()<<context;//把context中的内容显示到ui的文本框中ui->textEdit->append(context);}}//保存按钮
void Widget::on_btnSave_clicked()
{//若文件已打开,则关闭再打开(若文件没关闭就只会在文件末尾继续写入)if(file.isOpen()){file.close();file.open(QIODevice::WriteOnly | QIODevice::Text);qDebug()<<file.fileName();}else{//文件未打开,获取文件名。//对话框获取文件名路径QString fileName = QFileDialog::getSaveFileName(this, tr("保存文件"),"D:/QtProjects",tr("Text files(*.txt)"));file.setFileName(fileName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug()<<"file open error";}this->setWindowTitle(fileName+"-记事本");}QTextStream out(&file);//设置编码格式QString qstr=ui->comboBox->currentText();const char* mycodectext=qstr.toStdString().c_str();out.setCodec(mycodectext);QString context=ui->textEdit->toPlainText();out<<context;
}//关闭文件按钮
void Widget::on_btnClose_clicked()
{QMessageBox msgBox;int ret = QMessageBox::warning(this, tr("记事本"),tr("文件即将关闭,是否保存文件?"),QMessageBox::Save | QMessageBox::Discard| QMessageBox::Cancel,QMessageBox::Save);switch (ret) {case QMessageBox::Save:qDebug()<< "Save was clicked";on_btnSave_clicked();ui->textEdit->clear();break;case QMessageBox::Discard:qDebug()<< "Don't Save was clicked";ui->textEdit->clear();if(file.isOpen()){file.close();this->setWindowTitle("记事本");}break;case QMessageBox::Cancel:qDebug()<< "Cancel was clicked";break;default:// should never be reachedbreak;}
}//修改编码格式
void Widget::on_comboBox_activated(const QString &arg1)
{//qDebug()<<ui->comboBox->currentText();ui->textEdit->clear();//创建QTextStream对象in,参数为&fileQTextStream in(&file);//设置编码格式QString qstr=ui->comboBox->currentText();const char* mycodectext=qstr.toStdString().c_str();in.setCodec(mycodectext);//把位置设置回0in.seek(0);//循环读取对象in中的内容while(!in.atEnd()){//按行来读取,每行都读到context中QString context =in.readLine();//qDebug()<<context;//把context中的内容显示到ui的文本框中ui->textEdit->append(context);}
}//游标位置改变后
void Widget::on_cursorPositionChanged()
{/*显示游标位置*/QTextCursor cursor=ui->textEdit->textCursor();//qDebug()<<cursor.blockNumber();//qDebug()<<cursor.columnNumber();QString blockNum=QString::number(cursor.blockNumber()+1);QString columNum=QString::number(cursor.columnNumber()+1);const QString labelMes="第"+blockNum+"行 "+"第"+columNum+"列 ";ui->label_cursor->setText(labelMes);/*设置当前行高亮*/QList<QTextEdit::ExtraSelection> extraSelections;QTextEdit::ExtraSelection ext;//设置行ext.cursor=cursor;//设置格式QBrush brush(Qt::yellow);ext.format.setBackground(brush);//关键属性:确保整行宽度高亮(不限于文本区域)ext.format.setProperty(QTextFormat::FullWidthSelection, true);//ext放入队列中extraSelections.push_back(ext);ui->textEdit->setExtraSelections(extraSelections);
}void Widget::zoomInFont()
{QFont font=ui->textEdit->font();int fontsize=font.pointSize();if(fontsize==-1)return;int newfontsize=fontsize+1;font.setPointSize(newfontsize);ui->textEdit->setFont(font);qDebug()<<"放大";
}void Widget::zoomOutFont()
{QFont font=ui->textEdit->font();int fontsize=font.pointSize();if(fontsize==-1)return;int newfontsize=fontsize-1;font.setPointSize(newfontsize);ui->textEdit->setFont(font);qDebug()<<"缩小";
}
widget.ui
不用自己写,设计ui界面时自动生成
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Widget</class><widget class="QWidget" name="Widget"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>记事本</string></property><property name="windowIcon"><iconset resource="res.qrc"><normaloff>:/note-icon/icon2.jpg</normaloff>:/note-icon/icon2.jpg</iconset></property><widget class="QWidget" name="layoutWidget"><property name="geometry"><rect><x>0</x><y>0</y><width>802</width><height>601</height></rect></property><layout class="QVBoxLayout" name="verticalLayout"><property name="spacing"><number>0</number></property><item><widget class="QWidget" name="widgetButton" native="true"><property name="minimumSize"><size><width>0</width><height>50</height></size></property><property name="styleSheet"><string notr="true">background-color: rgb(189, 189, 92);</string></property><widget class="QWidget" name="horizontalLayoutWidget"><property name="geometry"><rect><x>0</x><y>0</y><width>801</width><height>47</height></rect></property><layout class="QHBoxLayout" name="above_lh_Layout"><property name="spacing"><number>0</number></property><item><widget class="QPushButton" name="btnClose"><property name="minimumSize"><size><width>45</width><height>45</height></size></property><property name="styleSheet"><string notr="true">QPushButton { border-image: url(:/note-icon/icon3.jpg);}QPushButton:hover { border-image: url(:/note-icon/icon1.jpg)}
</string></property><property name="text"><string/></property></widget></item><item><widget class="QPushButton" name="btnOpen"><property name="minimumSize"><size><width>45</width><height>45</height></size></property><property name="styleSheet"><string notr="true">QPushButton {border-image: url(:/note-icon/icon5.jpg);}
</string></property><property name="text"><string/></property></widget></item><item><widget class="QPushButton" name="btnSave"><property name="minimumSize"><size><width>45</width><height>45</height></size></property><property name="styleSheet"><string notr="true">QPushButton {border-image: url(:/note-icon/icon4.jpg);}
</string></property><property name="text"><string/></property></widget></item><item><spacer name="horizontalSpacer"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeHint" stdset="0"><size><width>40</width><height>20</height></size></property></spacer></item></layout></widget></widget></item><item><widget class="MyTextEdit" name="textEdit"/></item><item><widget class="QWidget" name="underWidget" native="true"><property name="enabled"><bool>true</bool></property><property name="minimumSize"><size><width>0</width><height>30</height></size></property><property name="layoutDirection"><enum>Qt::LeftToRight</enum></property><property name="styleSheet"><string notr="true">background-color: rgb(189, 189, 92);</string></property><layout class="QHBoxLayout" name="horizontalLayout"><property name="spacing"><number>6</number></property><property name="leftMargin"><number>0</number></property><property name="topMargin"><number>6</number></property><property name="rightMargin"><number>0</number></property><property name="bottomMargin"><number>6</number></property><item><spacer name="horizontalSpacer_3"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeType"><enum>QSizePolicy::Expanding</enum></property><property name="sizeHint" stdset="0"><size><width>600</width><height>17</height></size></property></spacer></item><item><widget class="QLabel" name="label_cursor"><property name="sizePolicy"><sizepolicy hsizetype="Preferred" vsizetype="Preferred"><horstretch>0</horstretch><verstretch>0</verstretch></sizepolicy></property><property name="minimumSize"><size><width>140</width><height>0</height></size></property><property name="maximumSize"><size><width>16777215</width><height>16777215</height></size></property><property name="layoutDirection"><enum>Qt::LeftToRight</enum></property><property name="text"><string>第1行第1列</string></property><property name="alignment"><set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set></property></widget></item><item><widget class="QComboBox" name="comboBox"><property name="styleSheet"><string notr="true"/></property><item><property name="text"><string>UTF-8</string></property></item><item><property name="text"><string>ANSI</string></property></item><item><property name="text"><string>UTF-16 LE</string></property></item><item><property name="text"><string>UTF-16 BE</string></property></item><item><property name="text"><string>GB18030</string></property></item></widget></item><item><spacer name="horizontalSpacer_2"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="sizeType"><enum>QSizePolicy::Fixed</enum></property><property name="sizeHint" stdset="0"><size><width>20</width><height>17</height></size></property></spacer></item></layout></widget></item></layout></widget></widget><customwidgets><customwidget><class>MyTextEdit</class><extends>QTextEdit</extends><header>mytextedit.h</header></customwidget></customwidgets><resources><include location="res.qrc"/></resources><connections/>
</ui>
资源文件
图片是用来给按键界面主题设置图标的。