qt编程兑现的简易记事本(范例)
qt编程实现的简易记事本(范例)
main.h文件
mainwindow.cpp
其实还有一部分功能没实现,有兴趣的话可以关注我下一篇文章。
Qt是一种跨平台的原生开发框架,面向所有主要的操作系统,包括Linux、Windows、Mac、Symbian和Maemo。本文介绍的是在Windows下用qt编程实现的简易记事本,有兴趣学习qt编程的可以看看。本人也是刚接触qt编程,觉得qt相对其他语言来说学起来还是比较容易的。
这是我用Qt Creator实现的简易记事本:
上面界面是用Qt Designer实现的,不懂的朋友们看下面:
1.创建主界面Main Window
2.在toolbar创建菜单栏,如:"文件",在里在创建子菜单"新建"(如Windows下的记事本就是这样)
3.添加图片
在Qt Designer界面右边子菜单"新建"下windowIcon栏里点击"…":
4.点击上面图标:选择要添加图片的路径(当前路径下)
子菜单"新建"选择匹配的图片,点击ok就出现:
是不是在actionNew(新建)前面有出现小图标,在往工具栏里移动,就出现上述效果了。
这只是实现了一部分功能,大家可以看一下
mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFileDialog>
#include <QTextStream>
#include <QMessageBox>
#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
void changeTitle(const QString &filename);
void openfile(const QString &filename);
void savefile(const QString &filename);
private:
Ui::MainWindow *ui;
QString curFile;
QLineEdit *find_textLineEdit;
private slots:
void show_findText();
void on_action_2_triggered();//查找
void on_plan_textEdit_copyAvailable(bool b);
void on_plan_textEdit_textChanged();
void on_action_U_triggered();//撤销
void on_action_P_triggered();//粘贴
void on_action_C_triggered();//复制
void on_action_T_triggered();//剪切
void on_actionExit_triggered();//退出
bool on_actionSave_triggered();//保存
bool on_actionSave_As_triggered();//另存为
void on_actionOpen_triggered();//打开
void on_actionNew_triggered();//新建
};
#endif // MAINWINDOW_H
main.h文件
#include <QtGui/QApplication>
#include <QTextCodec>
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->changeTitle("");
this->setCentralWidget(ui->plan_textEdit);
//设置action的属性
ui->action_T->setEnabled(false);
ui->action_C->setEnabled(false);
//设置界面图标
this->setWindowIcon(QIcon(":/images/editor.png"));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::savefile(const QString &filename)
{
QFile file(filename);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
QMessageBox::warning(this, "Save",
tr("Save , error ?")
.arg(filename)
.arg(file.errorString()));
return ;
}
QTextStream out(&file);
out << ui->plan_textEdit->toPlainText();
file.close();
}
void MainWindow::openfile(const QString &filename)
{
QFile file(filename);
if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
QMessageBox::warning(this, "Open",
tr("Save , error ?")
.arg(filename)
.arg(file.errorString()));
return ;
}
QTextStream in(&file);
QString s=in.readAll();
ui->plan_textEdit->setPlainText(s);
}
void MainWindow::changeTitle(const QString &filename)
{
qDebug()<<"***"<<filename;
if(filename.isEmpty()){
this->curFile = "";
this->setWindowTitle(tr("无标题.txt[*]--记事本"));
}
else{
this->curFile = filename;
QFileInfo fi(filename);
QString name=fi.fileName();
this->setWindowTitle(tr("%1[*]--记事本").arg(name));
qDebug()<<"===="<<name;
}
this->setWindowModified(false);
ui->plan_textEdit->document()->setModified(false);
}
void MainWindow::on_actionNew_triggered()//新建
{
QTextDocument *document=ui->plan_textEdit->document();
if(!document->isModified()){
ui->plan_textEdit->setPlainText("");
this->changeTitle("");
return ;
}
int ret=QMessageBox::question(this, "Save?",
"disSave, Save",
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
switch(ret)
{
case QMessageBox::Cancel:
break;
case QMessageBox::Discard:
ui->plan_textEdit->setPlainText("");
this->changeTitle("");
break;
case QMessageBox::Save:
if(!on_actionSave_triggered())
return ;
ui->plan_textEdit->setPlainText("");
this->changeTitle("");
break;
}
}
void MainWindow::on_actionOpen_triggered()//打开
{
QTextDocument *document=ui->plan_textEdit->document();
if(document->isModified()){
int ret=QMessageBox::question(this, "Save?",
"disSave, Save",
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
if(ret==QMessageBox::Cancel){
return ;
}
else if(ret==QMessageBox::Save){
}
}
//没修改 正常保存 放弃保存
QString filename=QFileDialog::getOpenFileName(this);
if(filename.isEmpty())
return ;
this->openfile(filename);
this->changeTitle(filename);
}
bool MainWindow::on_actionSave_As_triggered()//另存为
{
QString fileName=QFileDialog::getSaveFileName(this,tr("Save File"));
if(fileName.isEmpty())
return false;
this->savefile(fileName);
this->changeTitle(fileName);
return true;
}
bool MainWindow::on_actionSave_triggered()//保存
{
if(this->curFile.isEmpty())
// qDebug()<<"+++";
return on_actionSave_As_triggered();
else
{
savefile(this->curFile);
this->setWindowModified(false);
}
return true;
}
void MainWindow::on_actionExit_triggered()//退出
{
this->close();
}
void MainWindow::on_action_T_triggered()//剪切
{
this->ui->plan_textEdit->cut();
}
void MainWindow::on_action_C_triggered()//复制
{
this->ui->plan_textEdit->copy();
}
void MainWindow::on_action_P_triggered()//粘贴
{
this->ui->plan_textEdit->paste();
}
void MainWindow::on_action_U_triggered()//撤销
{
this->ui->plan_textEdit->undo();
}
void MainWindow::on_plan_textEdit_textChanged()
{
//qDebug()<<"niaho";
this->setWindowModified(true);
}
void MainWindow::on_plan_textEdit_copyAvailable(bool b)
{
ui->action_T->setEnabled(b);
ui->action_C->setEnabled(b);
}
//这部分是编码实现的,可以看看与界面设计实现的有什么不一样
void MainWindow::on_action_2_triggered()//查找
{
QDialog *findDlg=new QDialog(this);
findDlg->setWindowTitle(tr("Find!"));
find_textLineEdit=new QLineEdit(findDlg);
QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg);
QHBoxLayout *layout=new QHBoxLayout(findDlg);
layout->addWidget(find_textLineEdit);
layout->addWidget(find_Bth);
findDlg->show();
connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));
}
void MainWindow::show_findText()
{
QString findText=find_textLineEdit->text();
if(!ui->plan_textEdit->find(findText,QTextDocument::FindBackward))
{
QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText));
}
}
其实还有一部分功能没实现,有兴趣的话可以关注我下一篇文章。