用Qt写的一个仿Windows记事本程序
程序员文章站
2022-06-15 22:42:58
...
自己喜欢Qt所以就写了这样一个仿windows记事本的程序,全部功能经测试可用.Qt版本5.5+win7x64
其中有部分逻辑比较乱,大家多多交流
备用链接:https://github.com/piaodonkey/notepad
.pro部分:
#-------------------------------------------------
#
# Project created by QtCreator 2015-09-12T21:33:50
#
#-------------------------------------------------
QT += core gui
QT +=printsupport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
RC_FILE = myico.rc
TARGET = untitled30
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
CONFIG+=c++11
RESOURCES += \
dell.qrc
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtWidgets>
#include <QMainWindow>
#include <QPrinter>
#include <QtPrintSupport>
//#include <QFileDialog>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
void setTex(const QString &temp);
MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
bool eventFilter(QObject *, QEvent *);
private:
QString tempText;
QAction *printpdfAction,*newAction,*openAction,*saveAction,*saveAsAction,*printAction,*exitAction,
*undoAction,*cutAction,*copyAction,*patseAction,*delAction,*findAction,*findNextAction,
*replaceAction,*selAllAction,*dateTAction,*autoLAction,*fontAction,*statusAction,*helpAction,*aboutAction,*jump2Action;
QFileDialog *fDialog;
QTextEdit *textEdit;
void initAction();
void initMenu();
void find();
QString findString;
QList<QAction*> fileL,editL,styleL,viewL,helpL,statusL;
QMenu *fileM,*editM,*styleM,*viewM,*helpM;
void init();
void conn();
QString curFile;
void setCunrrentFile(const QString &);
void closeEvent(QCloseEvent *e);
bool saveFile(const QString &);
void print();
private slots:
bool saveAs();
void openFile();
void newFile();
bool maybeSave();
void setSB();
bool save();
//void textModifyed();
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QString>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setTex(QString::fromLocal8Bit(argv[1]));
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include <QtPrintSupport>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//setWindowTitle("未命名[*]");
initMenu();
//statusAction->setCheckable(true);
textEdit=new QTextEdit(this);
setCentralWidget(textEdit);
statusBar()->showMessage("Ready");
fDialog=new QFileDialog(this);
resize(600,600);
setCunrrentFile("");
setUnifiedTitleAndToolBarOnMac(true);
conn();
textEdit->installEventFilter(this);
this->setAcceptDrops(false);
textEdit->setAcceptDrops(false);
this->setWindowIcon(QIcon(":/1.ico"));
}
void MainWindow::setTex(const QString &temp)
{
// QMessageBox::about(this,temp,temp);
tempText=temp;
if(!tempText.isEmpty())
openFile();
// tempText.clear();
}
bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
if(obj==textEdit)
{
if(textEdit->textCursor().hasSelection())
{
delAction->setEnabled(true);
//qDebug()<<"selected";
return true;
}
else
{
delAction->setDisabled(true);
return false;
}
}
else
return QMainWindow::eventFilter(obj,e);
}
void MainWindow::conn()
{
connect(printAction,&QAction::triggered,this,[=](){
QPrinter printer;
QPrintDialog *dialog = new QPrintDialog(&printer, this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
// dialog->setWindowTitle(tr("Print Document"));
if (textEdit->textCursor().hasSelection())
dialog->addEnabledOption(QAbstractPrintDialog::PrintSelection);
if (dialog->exec() == QDialog::Accepted)
textEdit->print(&printer);
});
connect(helpAction,&QAction::triggered,this,[=](){
QMessageBox::information(this,"帮助","如有疑问请联系QQ:2850125339");
});
connect(aboutAction,&QAction::triggered,this,[=](){
QMessageBox::about(this,"关于",static_cast<QString>(QSysInfo::windowsVersion()));
});
connect(statusAction,&QAction::toggled,this,&MainWindow::setSB);//设置状态栏
connect(autoLAction,&QAction::toggled,this,[=](){
textEdit->setWordWrapMode(static_cast<QTextOption::WrapMode>(autoLAction->isChecked()));
});
connect(exitAction,&QAction::triggered,this,&MainWindow::close);
connect(newAction,&QAction::triggered,this,&MainWindow::newFile);
connect(openAction,&QAction::triggered,this,&MainWindow::openFile);
connect(saveAsAction,&QAction::triggered,this,&MainWindow::saveAs);
connect(saveAction,&QAction::triggered,this,&MainWindow::save);
connect(textEdit,&QTextEdit::textChanged,this,[=](){setWindowModified(textEdit->document()->isModified());});
connect(printpdfAction,&QAction::triggered,this,&MainWindow::print);
connect(textEdit,SIGNAL(undoAvailable(bool)),undoAction,SLOT(setEnabled(bool)));
connect(undoAction,&QAction::triggered,textEdit,&QTextEdit::undo);
connect(textEdit,SIGNAL(copyAvailable(bool)),cutAction,SLOT(setEnabled(bool)));
connect(textEdit,SIGNAL(copyAvailable(bool)),copyAction,SLOT(setEnabled(bool)));
connect(cutAction,&QAction::triggered,textEdit,&QTextEdit::cut);
connect(copyAction,&QAction::triggered,textEdit,&QTextEdit::copy);
connect(patseAction,&QAction::triggered,textEdit,&QTextEdit::paste);
connect(delAction,&QAction::triggered,textEdit,[=](){textEdit->textCursor().removeSelectedText();});
connect(findAction,&QAction::triggered,this,&MainWindow::find);
connect(findNextAction,&QAction::triggered,this,[=](){
textEdit->find(findString);
});
connect(replaceAction,&QAction::triggered,textEdit,[=](){
QDialog *inputDia=new QDialog(this);
inputDia->setWindowModality(Qt::ApplicationModal);
inputDia->setAttribute(Qt::WA_DeleteOnClose);
inputDia->setWindowTitle(tr("替换对话框"));
QLabel *label=new QLabel(tr("查找内容:"),inputDia);
QLabel *label1=new QLabel(tr("替换内容:"),inputDia);
QLineEdit *line=new QLineEdit(inputDia);
QLineEdit *line1=new QLineEdit(inputDia);
QPushButton *ok=new QPushButton(tr("替换"),inputDia);
QPushButton *cancel=new QPushButton(tr("取消"),inputDia);
QHBoxLayout *layout=new QHBoxLayout;
QHBoxLayout *layout3=new QHBoxLayout;
layout->addWidget(label);
layout3->addWidget(label1);
layout->addWidget(line);
layout3->addWidget(line1);
QHBoxLayout *layout1=new QHBoxLayout;
// layout1->addLayout(layout);
layout1->addWidget(ok);
layout1->addWidget(cancel);
QVBoxLayout *layout2=new QVBoxLayout;
layout2->addLayout(layout);
layout2->addLayout(layout3);
layout2->addLayout(layout1);
inputDia->setLayout(layout2);
inputDia->show();
connect(ok,&QPushButton::clicked,textEdit,[=](){
if(textEdit->find(line->text()))
{
textEdit->insertPlainText(line1->text());
}
;});
connect(cancel,&QPushButton::clicked,inputDia,&QDialog::close);
});
connect(selAllAction,&QAction::triggered,textEdit,[=](){
textEdit->selectAll();
});
connect(dateTAction,&QAction::triggered,textEdit,[=](){
//textEdit->append(QTime::currentTime().toString());
textEdit->append(QDateTime::currentDateTime().toString());
});
connect(fontAction,&QAction::triggered,this,[=](){
bool ok;
QFont font = QFontDialog::getFont(&ok, this);
if (ok) {
// font is set to the font the user selected
textEdit->setFont(font);
}
});
}
void MainWindow::find()
{
//QString findString;
QDialog *inputDia=new QDialog(this);
inputDia->setWindowModality(Qt::ApplicationModal);
inputDia->setAttribute(Qt::WA_DeleteOnClose);
inputDia->setWindowTitle(tr("查找对话框"));
QLabel *label=new QLabel(tr("查询内容:"),inputDia);
QLineEdit *line=new QLineEdit(inputDia);
QPushButton *ok=new QPushButton(tr("查询下一个"),inputDia);
QPushButton *cancel=new QPushButton(tr("取消"),inputDia);
QHBoxLayout *layout=new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(line);
QHBoxLayout *layout1=new QHBoxLayout;
// layout1->addLayout(layout);
layout1->addWidget(ok);
layout1->addWidget(cancel);
QVBoxLayout *layout2=new QVBoxLayout;
layout2->addLayout(layout);
layout2->addLayout(layout1);
inputDia->setLayout(layout2);
inputDia->show();
connect(ok,&QPushButton::clicked,textEdit,[=](){
findString=line->text();
textEdit->find(line->text());});
connect(cancel,&QPushButton::clicked,inputDia,&QDialog::close);
}
void MainWindow::print()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("导出PDF文件"), QString(), "*.pdf");
if (!fileName.isEmpty()) {
// 如果文件后缀为空,则默认使用.pdf
if (QFileInfo(fileName).suffix().isEmpty())
fileName.append(".pdf");
QPrinter printer;
// 指定输出格式为pdf
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(fileName);
textEdit->print(&printer);
}
}
void MainWindow::setCunrrentFile(const QString &fileName)
{
curFile=fileName;
textEdit->document()->setModified(false);
this->setWindowModified(false);
QString showName=curFile;
if(curFile.isEmpty())
{
showName="未命名";
}
setWindowFilePath(showName);
}
bool MainWindow::saveFile(const QString &fileName)
{
QFile file(fileName);
if(!file.open(QIODevice::WriteOnly))
{
QMessageBox::critical(this,fileName,"写入错误",QMessageBox::Ok);
return false;
}
QTextStream out(&file);
//textEdit->clear();
#ifndef QT_NO_CURSOR
QApplication::setOverrideCursor(Qt::WaitCursor);
#endif
statusBar()->showMessage("保存文件...");
//while(!in.atEnd())
//{
//textEdit->append( in.readLine());
// if(fDialog->selectedNameFilter())
out<<textEdit->toPlainText();
// out<<textEdit->toHtml();
//}
statusBar()->showMessage("保存完毕",2000);
this->setWindowModified(false);
textEdit->document()->setModified(false);
#ifndef QT_NO_CURSOR
QApplication::restoreOverrideCursor();
#endif
return true;
}
bool MainWindow::save()
{
if(curFile.isEmpty())
{
return saveAs();
}
else
{
saveFile(curFile);
return true;
}
}
bool MainWindow::saveAs()
{
QFileDialog dialog(this);
dialog.setAcceptMode(QFileDialog::AcceptSave);
dialog.setNameFilter("文本文档(*.txt)");
QStringList files;
if(dialog.exec())
files=dialog.selectedFiles();
else
return false;
return saveFile(files.at(0));
}
void MainWindow::closeEvent(QCloseEvent *e)
{
if(maybeSave())
{
e->accept();
}
else
e->ignore();
}
void MainWindow::openFile()
{
if(maybeSave())
{
QString text;
if(tempText.isEmpty())
{
text=QFileDialog::getOpenFileName(this,"打开文件",QDir::currentPath(),tr("文本文件 (*.txt);;图像文件 (*.png *.jpg *.bmp *.gif *.jpeg);;所有文件 (*.*)"));
tempText=text;
}
setCunrrentFile(tempText);
//
if(!tempText.isEmpty())
{
QFile file(tempText);
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::critical(this,"错误",text.append("打开错误!"),QMessageBox::Ok);
return;
}
QTextStream in(&file);
textEdit->clear();
#ifndef QT_NO_CURSOR
QApplication::setOverrideCursor(Qt::WaitCursor);
#endif
statusBar()->showMessage("载入文件...");
while(!in.atEnd())
{
textEdit->append( in.readLine());
}
statusBar()->showMessage("载入完毕",2000);
this->setWindowModified(false);
textEdit->document()->setModified(false);
#ifndef QT_NO_CURSOR
QApplication::restoreOverrideCursor();
#endif
}
}
tempText.clear();
}
void MainWindow::newFile()
{
if(maybeSave())
{
textEdit->clear();
setWindowTitle("未命名[*]");
}
}
bool MainWindow::maybeSave()
{
if(textEdit->document()->isModified())
{
QMessageBox::StandardButton ret;
ret=QMessageBox::warning(this,this->windowTitle(),"已修改,是否保存",QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel);
if(ret==QMessageBox::Save)
{
return save();
}
else if(ret==QMessageBox::Cancel)
{
return false;
}
}
return true;
}
void MainWindow::setSB()
{
if(statusAction->isChecked())
{
statusBar();
//statusAction->setChecked(true);
//qDebug()<<statusAction->isCheckable()<<statusAction->isChecked();
}
else
{
setStatusBar(0);
//statusAction->setChecked(false);
}
}
void MainWindow::initMenu()
{
initAction();
fileM=menuBar()->addMenu(tr("文件(&F)"));
fileM->addActions(fileL);
editM=menuBar()->addMenu(tr("编辑(&E)"));
editM->addActions(editL);
styleM=menuBar()->addMenu(tr("格式(O)"));
styleM->addActions(styleL);
viewM=menuBar()->addMenu(tr("查看(&V)"));
viewM->addActions(viewL);
helpM=menuBar()->addMenu(tr("帮助(&H)"));
helpM->addActions(helpL);
}
void MainWindow::initAction()
{
newAction=new QAction(QIcon(":/Action/new"),tr("&新建"),this);
newAction->setStatusTip(tr("新建文件"));
newAction->setShortcuts(QKeySequence::New);
openAction=new QAction(QIcon(":/Action/open"),tr("&打开"),this);
openAction->setStatusTip(tr("打开文件"));
openAction->setShortcuts(QKeySequence::Open);
saveAction=new QAction(QIcon(":/Action/save"),tr("&保存"),this);
saveAction->setStatusTip(tr("保存文件"));
saveAction->setShortcuts(QKeySequence::Save);
saveAsAction=new QAction(QIcon(":/Action/saveAs"),tr("&另存为"),this);
saveAsAction->setStatusTip(tr("另存文件"));
saveAsAction->setShortcuts(QKeySequence::SaveAs);
printAction=new QAction(QIcon(":/Action/print"),tr("&打印"),this);
printAction->setStatusTip(tr("打印文件"));
printAction->setShortcuts(QKeySequence::Print);
printpdfAction=new QAction(QIcon(":/Action/printPdf"),tr("&打印PDF"),this);
printpdfAction->setStatusTip(tr("打印成PDF文件"));
exitAction=new QAction(QIcon(":/Action/exit"),tr("&退出"),this);
exitAction->setStatusTip(tr("退出..."));
exitAction->setShortcuts(QKeySequence::Quit);
undoAction=new QAction(QIcon(":/Action/undo"),tr("&撤销"),this);
undoAction->setStatusTip(tr("撤销"));
undoAction->setShortcuts(QKeySequence::Undo);
undoAction->setDisabled(true);
// undoAction->setSeparator(true);
cutAction=new QAction(QIcon(":/Action/cut"),tr("&剪切"),this);
cutAction->setStatusTip(tr("剪切"));
cutAction->setShortcuts(QKeySequence::Cut);
cutAction->setDisabled(true);
copyAction=new QAction(QIcon(":/Action/copy"),tr("&复制"),this);
copyAction->setStatusTip(tr("复制"));
copyAction->setShortcuts(QKeySequence::Copy);
copyAction->setDisabled(true);
patseAction=new QAction(QIcon(":/Action/patse"),tr("&粘贴"),this);
patseAction->setStatusTip(tr("粘贴"));
patseAction->setShortcuts(QKeySequence::Paste);
//patseAction->setDisabled(true);
if (const QMimeData *md = QApplication::clipboard()->mimeData())
patseAction->setEnabled(md->hasText());
delAction=new QAction(QIcon(":/Action/del"),tr("&删除"),this);
delAction->setStatusTip(tr("删除"));
delAction->setShortcuts(QKeySequence::Delete);
delAction->setDisabled(true);
findAction=new QAction(QIcon(":/Action/find"),tr("&查找"),this);
findAction->setStatusTip(tr("查找"));
findAction->setShortcuts(QKeySequence::Find);
findNextAction=new QAction(QIcon(":/Action/findNext"),tr("&查找下一个"),this);
findNextAction->setStatusTip(tr("查找下一个"));
findNextAction->setShortcuts(QKeySequence::FindNext);
replaceAction=new QAction(QIcon(":/Action/replace"),tr("&替换"),this);
replaceAction->setStatusTip(tr("替换"));
replaceAction->setShortcuts(QKeySequence::Replace);
jump2Action=new QAction(QIcon(":/Action/jump2"),tr("&转到"),this);
jump2Action->setStatusTip(tr("转到"));
jump2Action->setShortcut(QKeySequence("Ctrl+G"));
jump2Action->setDisabled(true);
selAllAction=new QAction(QIcon(":/Action/selAll"),tr("&全选"),this);
selAllAction->setStatusTip(tr("全选"));
selAllAction->setShortcuts(QKeySequence::SelectAll);
dateTAction=new QAction(QIcon(":/Action/dateT"),tr("&时间日期"),this);
dateTAction->setStatusTip(tr("时间/日期"));
dateTAction->setShortcut(QKeySequence("Ctrl+T"));
autoLAction=new QAction(tr("&自动换行"),this);
autoLAction->setStatusTip(tr("自动换行"));
autoLAction->setShortcut(QKeySequence("Ctrl+W"));
autoLAction->setCheckable(true);
autoLAction->setChecked(true);
fontAction=new QAction(QIcon(":/Action/font"),tr("&字体"),this);
fontAction->setStatusTip(tr("字体"));
fontAction->setShortcut(QKeySequence("Ctrl+F"));
//statusAction=new QAction(QIcon(":/Action/status"),tr("&状态栏"),this);
statusAction=new QAction(tr("&状态栏"),this);
statusAction->setStatusTip(tr("状态栏"));
statusAction->setShortcut(QKeySequence("S"));
statusAction->setCheckable(true);
statusAction->setChecked(true);
helpAction=new QAction(QIcon(":/Action/help"),tr("&帮助"),this);
helpAction->setStatusTip(tr("帮助"));
helpAction->setShortcuts(QKeySequence::HelpContents);
aboutAction=new QAction(QIcon(":/Action/about"),tr("&关于"),this);
aboutAction->setStatusTip(tr("关于"));
aboutAction->setShortcut(QKeySequence("Ctrl+A"));
//initShortCuts();
fileL<<newAction<<openAction<<saveAction<<saveAsAction<<menuBar()->addSeparator()<<printAction<<printpdfAction<<menuBar()->addSeparator()<<exitAction;
editL<<undoAction<<menuBar()->addSeparator()<<cutAction<<copyAction<<patseAction<<delAction<<menuBar()->addSeparator()<<findAction<<findNextAction<<replaceAction<<jump2Action<<menuBar()->addSeparator()<<selAllAction<<dateTAction;
styleL<<autoLAction<<fontAction;
viewL<<statusAction;
helpL<<helpAction<<aboutAction;
statusL<<statusAction;
}
MainWindow::~MainWindow()
{
}
资源文件
<RCC>
<qresource prefix="/">
<file>1.ico</file>
</qresource>
</RCC>
其中1.ico文件和完整的程序代码包在附件里
其中文档没有做,大部分都是调用的api 很容易理解
转载于:https://blog.51cto.com/amgodchan/1713964