qt 制作记事本_用Qt写的一个仿Windows记事本程序

这篇博客介绍了作者使用Qt 5.5在Win7 x64环境下制作的一个仿Windows记事本程序。文章包含源代码,程序具备全部功能,并详细展示了.pro文件、main.cpp和mainwindow.cpp的主要代码段,涉及到文件操作、菜单初始化、文本编辑器事件处理等。此外,还提到了如何处理文件打开、保存、打印、查找替换等操作。
摘要由CSDN通过智能技术生成

自己喜欢Qt所以就写了这样一个仿windows记事本的程序,全部功能经测试可用.Qt版本5.5+win7x64

其中有部分逻辑比较乱,大家多多交流.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.qrcmainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include 

#include 

#include 

#include 

//#include 

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 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 

#include 

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 

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()<

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(QSysInfo::windowsVersion()));

});

connect(statusAction,&QAction::toggled,this,&MainWindow::setSB);//设置状态栏

connect(autoLAction,&QAction::toggled,this,[=](){

textEdit->setWordWrapMode(static_cast<: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<toPlainText();

// out<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()<isCheckable()<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<addSeparator()<addSeparator()<

editL<addSeparator()<addSeparator()<addSeparator()<

styleL<

viewL<

helpL<

statusL<

}

MainWindow::~MainWindow()

{

}资源文件

1.ico

其中1.ico文件和完整的程序代码包在附件里

其中文档没有做,大部分都是调用的api 很容易理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值