qt5.5实现 记事本程序

时间:2023-03-08 19:22:34

最近由于要做Qt相关的毕业设计课题,以前对Qt完全不了解,对于客户端图形界面程序,也只对Windows下的MFC熟悉,

所以,由于Qt的跨平台特性和相对比较纯的C++的特点,就准备学习一下吧。这两天逛了一下Qt的开发者官方网站,和一些国内的论坛,

看了下基本的知识点,比如信号和槽的机制,界面的布局,就想写个东西,巩固一下。于是参考了官方的文档和代码,纯代码实现了一个简易的记事本程序。

希望大家参考学习,共同进步。不足之处,还请指出。

记事本简介:记事本采用代码实现GUI界面,支持,新建,保存,另存为,查找,替换,打印功能。

开发环境:win7旗舰版 32位 Qt Creator   Qt 5.5

参考资料:http://www.devbean.net/2012/08/qt-study-road-2-intro

http://doc.qt.io/qt-5/gettingstartedqt.html

界面外观:

qt5.5实现 记事本程序

qt5.5实现 记事本程序

查找功能:

qt5.5实现 记事本程序

替换功能:

qt5.5实现 记事本程序

打印功能:

qt5.5实现 记事本程序

保存等:

qt5.5实现 记事本程序

关于本屌狮

qt5.5实现 记事本程序

本程序涉及一个主对话框,一个查找对话框,一个替换对话框,一个打印对话框,一个关于信息对话框,一个打开对话框,一个保存对话框,其他信息提示对话框。

功能设计:主要涉及对话框的布局,主对话框与查找,替换对话框的交互。当然这是通过信号与槽的机制来实现的。下面看下具体的代码实现。

主对话框类

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include <QMenu>
#include <QMenuBar>
#include <QAction>
#include <QTextEdit>
#include <QIcon>
#include <QFile>
#include <QFileDialog>
#include <QTextStream>
#include <QMessageBox>
#include <QTextDocument>
#include <QTextCursor>
#include <QToolBar>
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QPrintDialog>
#include <QtPrintSupport/QPrintPreviewDialog>
#include <QtPrintSupport/QPageSetupDialog> #include <finddialog.h> #include <replacedialog.h> class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = );
~MainWindow();
protected:
private slots:
void createMenus();
void createActions();
void newAct();
void openAct();
void saveAct();
void printAct();
void exitAct();
void findAct(QString,bool,bool);
void aboutAct();
void anotherSaveAct();
void showFindDialog();
void showReplaceDialog();
void findReplace(QString,bool);
void replaceCur(QString,QString);
void replaceAll(QString,QString,bool); private:
//菜单
bool find;
QMenu *file_menu;
QMenu *edit_menu;
QMenu *about_menu;
//Action响应file_menu
QAction *new_act;
QAction *open_act;
QAction *save_act;
QAction *another_save_act;
QAction *print_act;
QAction *exit_act;
//Action响应edit_menu
QAction *find_act;
QAction *replace_act;
//Action响应help_menu
QAction *about_act;
//Edit
QTextEdit *mini_text; FindDialog *find_dialog;
ReplaceDialog *replace_dialog;
QString cur_file_name; }; #endif // MAINWINDOW_H
 #include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr("MiniText"));
mini_text = new QTextEdit;
this->setCentralWidget(mini_text);
resize(,);
cur_file_name = tr(""); createActions();
createMenus();
} MainWindow::~MainWindow()
{
if(file_menu){
delete file_menu;
}
if(edit_menu){
delete edit_menu;
}
if(about_menu){
delete about_menu;
}
if(new_act){
delete new_act;
}
if(open_act){
delete open_act;
}
if(save_act){
delete save_act;
}
if(print_act){
delete print_act;
}
if(exit_act){
delete exit_act; }
if(find_act){
delete find_act; }
if(replace_act){
delete replace_act;
}
if(about_act){
delete about_act;
}
if(mini_text){
delete mini_text;
}
if(find_dialog){
delete find_dialog;
}
if(replace_dialog){
delete replace_dialog;
}
if(another_save_act){
delete another_save_act;
}
} void MainWindow::createMenus()
{ file_menu = menuBar()->addMenu(tr("&文件"));
file_menu->setStyleSheet("color:blue");
file_menu->addAction(new_act);
file_menu->addAction(open_act);
file_menu->addAction(save_act);
file_menu->addAction(another_save_act);
file_menu->addAction(print_act);
file_menu->addSeparator();
file_menu->addAction(exit_act);
edit_menu = menuBar()->addMenu(tr("&编辑"));
edit_menu->setStyleSheet("color:blue");
edit_menu->addAction(find_act);
edit_menu->addAction(replace_act);
about_menu = menuBar()->addMenu(tr("&关于"));
about_menu->setStyleSheet("color:blue");
about_menu->addAction(about_act);
QToolBar *tool_bar = addToolBar(tr("file"));
tool_bar->addAction(new_act);
tool_bar->addAction(open_act);
tool_bar->addAction(save_act);
tool_bar->addAction(another_save_act);
tool_bar->addAction(print_act);
tool_bar->addAction(find_act);
tool_bar->addAction(replace_act);
tool_bar->addAction(about_act);
tool_bar->addAction(exit_act); } void MainWindow::createActions()
{
find = false;
find_dialog = new FindDialog(this);
replace_dialog = new ReplaceDialog(this);
//Action响应file_menu
new_act = new QAction(QIcon(tr(":/images/new")),tr("&新建"),this);
new_act->setShortcut(QKeySequence::New); open_act = new QAction(QIcon(tr(":/images/open")),tr("&打开"),this);
open_act->setShortcut(QKeySequence::Open); save_act = new QAction(QIcon(tr(":/images/save")),tr("&保存"),this);
save_act->setShortcut(QKeySequence::Save); another_save_act = new QAction(QIcon(tr(":/images/another_save")),tr("另存为"),this); print_act = new QAction(QIcon(tr(":/images/print")),tr("&打印"),this);
print_act->setShortcut(QKeySequence::Print); exit_act = new QAction(QIcon(tr(":/images/exit")),tr("&退出"),this);
exit_act->setShortcut(QKeySequence::Quit); find_act = new QAction(QIcon(tr(":/images/find")),tr("&查找"),this);
find_act->setShortcut(QKeySequence::Find); replace_act = new QAction(QIcon(tr(":/images/replace")),tr("&替换"),this);
replace_act->setShortcut(QKeySequence::Replace); about_act = new QAction(QIcon(tr(":/images/about")),tr("关于"),this); connect(new_act,SIGNAL(triggered()),this,SLOT(newAct()));
connect(open_act,SIGNAL(triggered()),this,SLOT(openAct()));
connect(save_act,SIGNAL(triggered()),this,SLOT(saveAct()));
connect(print_act,SIGNAL(triggered()),this,SLOT(printAct()));
connect(another_save_act,SIGNAL(triggered()),this,SLOT(anotherSaveAct()));
connect(exit_act,SIGNAL(triggered()),this,SLOT(exitAct()));
connect(find_act,SIGNAL(triggered()),this,SLOT(showFindDialog()));
connect(replace_act,SIGNAL(triggered()),this,SLOT(showReplaceDialog()));
connect(about_act,SIGNAL(triggered()),this,SLOT(aboutAct())); connect(find_dialog,SIGNAL(findTextDataButtonClickedSignal(QString,bool,bool)),
this,SLOT(findAct(QString,bool,bool)));
connect(replace_dialog,SIGNAL(findReplaceStr(QString,bool)),
this,SLOT(findReplace(QString,bool)));
connect(replace_dialog,SIGNAL(replaceCurOneStr(QString,QString)),
this,SLOT(replaceCur(QString,QString)));
connect(replace_dialog,SIGNAL(replaceAllStr(QString,QString,bool)),
this,SLOT(replaceAll(QString,QString,bool)));
} void MainWindow::newAct()
{
if (mini_text->document()->isModified())
{
QMessageBox::StandardButton button = QMessageBox::information(this,
"尚未保存", "是否要保存?",QMessageBox::Save |
QMessageBox::Discard | QMessageBox::Cancel);
switch(button)
{
case QMessageBox::Save:{
saveAct();
if (mini_text->document()->isModified()){
return;
}
}
case QMessageBox::Cancel:{
return;
}
case QMessageBox::Discard:{
break;
}
}
}
mini_text->clear();
} //打开文件
void MainWindow::openAct()
{
QString file_name = QFileDialog::getOpenFileName(this,tr("打开文件"),QString(),
tr("文本文件(*.txt) ;; C++文件(*.h *.cpp *.hpp)"));
cur_file_name = file_name;
if(!file_name.isEmpty()){
QFile file(file_name);
if(!file.open(QIODevice::ReadOnly)){
QMessageBox::critical(this,tr("错误"),tr("不能打开文件"));
return;
}
QTextStream ins(&file);
mini_text->setText(ins.readAll());
file.close();
}
} //保存文件
void MainWindow::saveAct()
{
if(cur_file_name.isEmpty()){
QString file_name = QFileDialog::getSaveFileName(this,tr("保存文件"),QString(),
tr("文本文件(*.txt) ;; C++文件(*.h *.cpp *.hpp)"));
if(!file_name.isEmpty()){
QFile file(file_name);
if(!file.open(QIODevice::WriteOnly)){
QMessageBox::critical(this,tr("错误"),tr("不能打开文件"));
return;
}
QTextStream outs(&file);
outs<<mini_text->toPlainText();
outs.flush();
file.close();
}
}
else{
QFile file(cur_file_name);
if(!file.open(QIODevice::WriteOnly)){
QMessageBox::critical(this,tr("错误"),tr("不能打开文件"));
return;
}
QTextStream outs(&file);
outs<<mini_text->toPlainText();
outs.flush();
file.close();
}
} void MainWindow::anotherSaveAct()
{
QString file_name = QFileDialog::getSaveFileName(this,tr("保存文件"),QString(),
tr("文本文件(*.txt) ;; C++文件(*.h *.cpp *.hpp)"));
if(!file_name.isEmpty()){
QFile file(file_name);
if(!file.open(QIODevice::WriteOnly)){
QMessageBox::critical(this,tr("错误"),tr("不能打开文件"));
return;
}
QTextStream outs(&file);
outs<<mini_text->toPlainText();
outs.flush();
file.close();
} } void MainWindow::findReplace(QString find_str, bool flg)
{
bool find_flag;
if(flg){
find_flag = mini_text->find(find_str,QTextDocument::FindCaseSensitively);
}
else{
find_flag = mini_text->find(find_str);
}
if(!find_flag){
QMessageBox::information(this,tr("结果"),tr("没有找到查找内容"),QMessageBox::Yes);
}
else{
find = true;
} } void MainWindow::replaceCur(QString find_str, QString replace_str)
{
if(find){
QTextCursor text_cursor = mini_text->textCursor();
text_cursor.insertText(replace_str);
}
else{
QMessageBox::information(this,tr("结果"),tr("没有内容不能替换")+find_str,QMessageBox::Yes);
}
find = false;
} void MainWindow::replaceAll(QString find_str, QString replace_str,bool flg)
{
if(!flg){
bool haf = mini_text->find(find_str);
if(haf){
QTextCursor text_cursor = mini_text->textCursor();
text_cursor.insertText(replace_str);
while(mini_text->find(find_str)){
text_cursor = mini_text->textCursor();
text_cursor.insertText(replace_str);
}
while(mini_text->find(find_str,QTextDocument::FindBackward)){
text_cursor = mini_text->textCursor();
text_cursor.insertText(replace_str);
}
}
else{
QMessageBox::information(this,tr("结果"),tr("没有内容不能替换 ")+find_str,QMessageBox::Yes);
}
}
else{
bool haf = mini_text->find(find_str,QTextDocument::FindCaseSensitively);
if(haf){
QTextCursor text_cursor = mini_text->textCursor();
text_cursor.insertText(replace_str);
while(mini_text->find(find_str,QTextDocument::FindCaseSensitively)){
text_cursor = mini_text->textCursor();
text_cursor.insertText(replace_str);
}
while(mini_text->find(find_str,QTextDocument::FindCaseSensitively|QTextDocument::FindBackward)){
text_cursor = mini_text->textCursor();
text_cursor.insertText(replace_str);
}
}
else{
QMessageBox::information(this,tr("结果"),tr("没有内容不能替换")+find_str,QMessageBox::Yes);
}
} } void MainWindow::printAct()
{
QPrinter printer;
QString printer_name = printer.printerName();
if( printer_name.size() == ){
return;
}
QPrintDialog dlg(&printer, this);
if (mini_text->textCursor().hasSelection()){
dlg.addEnabledOption(QAbstractPrintDialog::PrintSelection);
}
if(dlg.exec() == QDialog::Accepted){
mini_text->print(&printer);
}
} void MainWindow::findAct(QString str,bool ignore,bool choose)
{
QString text = str;
bool find_flag;
if(!text.isEmpty()){
if(choose){
if(ignore){
find_flag = mini_text->find(text,QTextDocument::FindCaseSensitively);
}
else{
find_flag = mini_text->find(text); }
}
else{
if(ignore){
find_flag = mini_text->find(text,QTextDocument::FindBackward|QTextDocument::FindCaseSensitively);
}
else{
find_flag = mini_text->find(text,QTextDocument::FindBackward); }
}
if(!find_flag){
QMessageBox::information(this,tr("结果"),tr("没有找到查找内容"),QMessageBox::Yes);
}
} } void MainWindow::aboutAct()
{
QMessageBox message(QMessageBox::NoIcon,tr("关于"), tr("version: v1.0\n"
"author: karllen\n"
"qq: 1160113606\n"
"Begin Learning The Qt"));
message.setIconPixmap(QPixmap(tr(":/images/me")));
message.exec(); } void MainWindow::showFindDialog()
{
find_dialog->show();
} void MainWindow::showReplaceDialog()
{
replace_dialog->show();
} void MainWindow::exitAct()
{
this->close(); }

查找对话框类:

 #ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QDialog>
#include <QLineEdit>
#include <QLabel>
#include <QPushButton>
#include <QRadioButton>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QCheckBox> class FindDialog:public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget *parent = );
~FindDialog(); signals:
void findTextDataButtonClickedSignal(QString,bool,bool); private slots:
void findButtonState();
void findDataButtonClickedState(); private:
QLineEdit *find_edit;
QLabel *find_label,*ignore_label,*next_label,*back_label;
QPushButton *find_button;
QRadioButton *next_radio;
QRadioButton *back_radio;
QCheckBox *ignore_flag;
}; #endif // FINDDIALOG_H
 #include "finddialog.h"

 FindDialog::FindDialog(QWidget *parent)
:QDialog(parent)
{
setWindowTitle(tr("查找"));
find_label = new QLabel(tr("查找"));
ignore_label = new QLabel(tr("区分大小写"));
next_label = new QLabel(tr("向后"));
back_label = new QLabel(tr("向前"));
find_edit = new QLineEdit;
find_button = new QPushButton(tr("查找下一个"));
next_radio = new QRadioButton;
back_radio = new QRadioButton;
ignore_flag = new QCheckBox; find_edit->setText(tr("")); QGridLayout *grid_layout = new QGridLayout(this);
grid_layout->addWidget(find_label,,);
grid_layout->addWidget(find_edit,,);
grid_layout->addWidget(find_button,,); QHBoxLayout *ignore_layout = new QHBoxLayout;
ignore_layout->setSpacing();
ignore_layout->addWidget(ignore_label);
ignore_layout->addWidget(ignore_flag); QHBoxLayout *radio_layout = new QHBoxLayout;
radio_layout->addWidget(next_label);
radio_layout->addWidget(next_radio); radio_layout->addWidget(back_label);
radio_layout->addWidget(back_radio); QGroupBox *group_radio = new QGroupBox(tr("方向"),this);
group_radio->setLayout(radio_layout); QHBoxLayout *do_radio = new QHBoxLayout;
do_radio->addWidget(group_radio); grid_layout->addLayout(ignore_layout,,);
grid_layout->addLayout(do_radio,,); this->setMaximumSize(,);
next_radio->setChecked(true);
find_button->setEnabled(false);
connect(find_edit,SIGNAL(textChanged(QString)),this,SLOT(findButtonState()));
connect(find_button,SIGNAL(clicked(bool)),this,SLOT(findDataButtonClickedState()));
} FindDialog::~FindDialog()
{
if(find_edit){
delete find_edit;
}
if(find_label){
delete find_label;
}
if(ignore_label){
delete ignore_label;
}
if(next_label){
delete next_label;
}
if(back_label){
delete back_label;
}
if(find_button){
delete find_button;
}
if(next_radio){
delete next_radio;
}
if(back_radio){
delete back_radio;
}
if(ignore_flag){
delete ignore_flag;
}
} void FindDialog::findButtonState()
{
if(find_edit->text().isEmpty()){
find_button->setEnabled(false);
}
else{
find_button->setEnabled(true);
} } void FindDialog::findDataButtonClickedState()
{
if(find_edit->text().isEmpty()){
return;
}
QString str = find_edit->text();
if(next_radio->isChecked()){
if(ignore_flag->isChecked()){
emit findTextDataButtonClickedSignal(str,true,true);
}
else{
emit findTextDataButtonClickedSignal(str,false,true);
}
}
if(back_radio->isChecked()){
if(ignore_flag->isChecked()){
emit findTextDataButtonClickedSignal(str,true,false);
}
else{
emit findTextDataButtonClickedSignal(str,false,false);
}
}
}

替换对话框类:

 #ifndef REPLACEDIALOG_H
#define REPLACEDIALOG_H #include <QDialog>
#include <QPushButton>
#include <QLabel>
#include <QCheckBox>
#include <QLineEdit>
#include <QGridLayout>
#include <QVBoxLayout> class ReplaceDialog:public QDialog
{
Q_OBJECT
public:
ReplaceDialog(QWidget *parent = );
~ReplaceDialog();
signals:
void replaceAllStr(QString , QString,bool);
void replaceCurOneStr(QString,QString);
void findReplaceStr(QString,bool);
private slots:
void chooseStrSlot();
void findButtonStateSlot();
void replaceOneButtonStateSlot();
void replaceAllButtonStateSlot();
private:
QLineEdit *find_str;
QLineEdit *replace_str;
QPushButton *find_next_button;
QPushButton *replaced_one_button;
QPushButton *replaced_all_button;
QPushButton *cancle_button;
QCheckBox *ignore_flag;
QLabel *find_label;
QLabel *replace_label;
}; #endif // REPLACEDIALOG_H
 #include "replacedialog.h"

 ReplaceDialog::ReplaceDialog(QWidget *parent)
:QDialog(parent)
{
find_label = new QLabel(tr("查找内容"));
replace_label = new QLabel(tr("替换为"));
find_str = new QLineEdit();
replace_str = new QLineEdit();
find_next_button = new QPushButton(tr("查找下一个"));
replaced_one_button = new QPushButton(tr("替换"));
replaced_all_button = new QPushButton(tr("全部替换"));
cancle_button = new QPushButton(tr("取消"));
ignore_flag = new QCheckBox(tr("区分大小写")); QGridLayout *grdly = new QGridLayout(this);
QVBoxLayout *vboxly = new QVBoxLayout(this); vboxly->addWidget(replaced_all_button);
vboxly->addWidget(cancle_button);
grdly->addWidget(find_label,,);
grdly->addWidget(find_str,,);
grdly->addWidget(find_next_button,,);
grdly->addWidget(replace_label,,);
grdly->addWidget(replace_str,,);
grdly->addWidget(replaced_one_button,,);
grdly->addWidget(ignore_flag,,);
grdly->addLayout(vboxly,,); find_str->setText(tr(""));
replace_str->setText(tr(""));
find_next_button->setEnabled(false);
replaced_one_button->setEnabled(false);
replaced_all_button->setEnabled(false); this->setMaximumSize(,); connect(find_str,SIGNAL(textChanged(QString)),this,SLOT(chooseStrSlot()));
connect(cancle_button,SIGNAL(clicked()),this,SLOT(close()));
connect(find_next_button,SIGNAL(clicked()),this,SLOT(findButtonStateSlot()));
connect(replaced_one_button,SIGNAL(clicked()),this,SLOT(replaceOneButtonStateSlot()));
connect(replaced_all_button,SIGNAL(clicked()),this,SLOT(replaceAllButtonStateSlot()));
} ReplaceDialog::~ReplaceDialog()
{
if(find_str){
delete find_str;
}
if(replace_str){
delete replace_str;
}
if(find_next_button){
delete find_next_button;
}
if(replaced_one_button){
delete replaced_one_button;
}
if(replaced_all_button){
delete replaced_all_button;
}
if(cancle_button){
delete cancle_button;
}
if(ignore_flag){
delete ignore_flag;
}
if(find_label){
delete find_label;
}
if(replace_label){
delete replace_label;
}
} void ReplaceDialog::chooseStrSlot()
{
if(!find_str->text().isEmpty()){
find_next_button->setEnabled(true);
replaced_one_button->setEnabled(true);
replaced_all_button->setEnabled(true);
}
else{
find_next_button->setEnabled(false);
replaced_one_button->setEnabled(false);
replaced_all_button->setEnabled(false);
}
} void ReplaceDialog::findButtonStateSlot()
{
if(ignore_flag->isChecked()){
emit findReplaceStr(find_str->text(),true);
}
else{
emit findReplaceStr(find_str->text(),false);
}
} void ReplaceDialog::replaceOneButtonStateSlot()
{
emit replaceCurOneStr(find_str->text(),replace_str->text()); } void ReplaceDialog::replaceAllButtonStateSlot()
{
if(ignore_flag->isChecked()){
emit replaceAllStr(find_str->text() , replace_str->text(),true);
}
else{
emit replaceAllStr(find_str->text() , replace_str->text(),false);
} }

main函数:

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

注:代码下载地址 http://download.****.net/detail/u010085340/9289609