今天用MainWindow类创建一个简单的文本,实现简单的新建、打开、另存为、保存,及字体大小颜色的改变。
一首先创建一个MainWindow类
这里不要用到Generate form.
现在我们要在上述MainWindow中添加文本编辑框、File菜单,里面包含新建、打开、另存为、保存,以及在工具栏里添加新建、打开、保存快捷图标。
首先先实现文本编辑框
为了方便我们把头文件的#include
在上述MainWindow类里声明
QPlainTextEdit textEdit;
在构造函数里写入
this->setCentralWidget(textEdit); //意思就是只用一个textEdit文本编辑框填充
接下来实现File菜单和添加工具栏
首先先填加图标
后面一直按下去。创建后填加
先把F:QT4.7.3examplesmainwindowsapplication中的images文件夹的图标复制到你的工程里,上面是我的路径。
先选择mainwindow.grc 的Add/prefix把prefix改成/,然后Add/Files ,选择刚才images里的所有图标
下面就是实现菜单file简单功能的图标显示 的代码
在mainwindow.h的MainWindow类里声明:
QAction *newAction;//新建
QAction*openAction;//打开
QAction*saveAction;//保存
QAction*saveAsAction;//另存为
QAction*closeAction;//关闭
QMenu*fileMenu; //fileMenu菜单
QToolBar*fileToolBar;//fileToolBar工具栏
在mainwindow.cpp的mainWindow的构造函数里写如下代码:
**************************************************
API里的函数原形 QAction ( const QIcon & icon,const QString & text, QObject * parent)
新建这个行为包含图标,名字是New ,&说明crtl+N是快捷键,下面出现的&都是同样的意思,父类是MainWindow.
newAction = newQAction(QIcon(":/images/new.png"),"&New",this);
openAction = newQAction(QIcon(":/images/open.png"),"&Open",this);
saveAction = newQAction(QIcon(":/images/save.png"),"&Save",this);
saveAsAction = new QAction("Save&As",this);
closeAction = newQAction("close",this);
************************************************
*********************************************
在菜单栏里添加File菜单
File菜单里添加打开、新建、保存、另存为、关闭等行为选项
fileMenu =this->menuBar()->addMenu("&File");
fileMenu->addAction(newAction);
fileMenu->addAction(openAction);
fileMenu->addAction(saveAction);
fileMenu->addAction(saveAsAction);
fileMenu->addAction(closeAction);
*************************************************
*********************************************
在工具栏里添加打开、新建、保存等图标 行为选项
fileToolBar =this->addToolBar("File");
fileToolBar->addAction(newAction);
fileToolBar->addAction(openAction);
fileToolBar->addAction(saveAction);
****************************************************
运行结果
上面只是显示图标、选项,还没有实际功能,接下来实现这些功能。
在mainwindow.h的MainWindow类里声明:
QStringcurrentName;//当前文本的文件名
bool maybeSave();//判断当前文本是否保存
void setCurrentFile(const QString&);//设置当前文本的文件名
bool saveFile(const QString &);//保存文本
void loadFile(constQString &);//打开文本
public slots:
void slotNew();//新建文本的槽
void slotOpen();//打开文本的槽
bool slotSave();//保存文本的槽
bool slotSaveAs();//另存为文本的槽
在mainwindow.cpp 的MainWindow的构造函数里添加如下代码:
*****************************************************************
在菜单File里或工具栏里单击新建、打开、保存、另存为、关闭等信号产生对应的槽的实现
QObject::connect(newAction,SIGNAL(triggered()),this,SLOT(slotNew())); QObject::connect(openAction,SIGNAL(triggered()),this,SLOT(slotOpen())); QObject::connect(saveAction,SIGNAL(triggered()),this,SLOT(slotSave())); QObject::connect(saveAsAction,SIGNAL(triggered()),this,SLOT(slotSaveAs())); QObject::connect(closeAction,SIGNAL(triggered()),qApp,SLOT(quit()));
*****************************************************************
在mainwindow,cpp里实现mainwindow.h方法、槽,代码如下
****************************************************************
函数作用:判断文件是否保存了
textEdit.document()->isModified()是判断文本编辑的内容是否被修改
如果被修改就跳出一个警告对话框,问是否保存、忽略、取消。
QMessageBox::warning()是警告对话框实现,里面参数依次是parent即MainWindow类,对话框标题,文本内容,三个按钮选择:save/discard/cancle
如果选择保存,执行保存方法;
如果选择取消,返回false;
如果没被修改,返回true
*****************************************************************
bool MainWindow::maybeSave()
{
if(textEdit.document()->isModified())
{
QMessageBox::StandardButton ret;
ret = QMessageBox::warning(this,
"warning",
"the document has been modified,Do you want to save yourchange", QMessageBox::Save|QMessageBox::Discard|QMessageBox::Cancel
);
if(ret == QMessageBox::Save)
return slotSave();
if(ret == QMessageBox::Cancel)
return false;
}
else
return true;
}
***********************************************************
函数作用:设置当前文本名
如果文本名是空,就设为Untitle.txt,
如果不为空,就把当前文本名设为fileName
textEdit.document()->setModified(false);
this->setWindowModified(false);
这两句是使文本编辑 和窗口处于没被修改的状态
*********************************************************
void MainWindow::setCurrentFile(const QString&fileName)
{
currentName= fileName;
textEdit.document()->setModified(false);
this->setWindowModified(false);
fileName.isEmpty() ?
this->setWindowFilePath("Untitle.txt"):
this->setWindowFilePath(fileName);
}
*********************************************************
函数作用:新建文件点击后实现的方法(槽)
当点击新建,如果当前以有打开的文本,先判断文本是否被修改,如果没被修改,直接把文本编辑的内容清掉,并把新建的文本名设为Untitle.txt。
有被修改,就执行maybeSave()里的 return slotSave();进行保存
************************************************************
void MainWindow::slotNew()
{
if(maybeSave())
{
textEdit.clear();
setCurrentFile("");
}
}
****************************************
函数作用:点击保存所实现的方法(槽)
如果当前文本名为空,就执行另存为方法
如果不为空,就执行保存文本的方法
*************************************
bool MainWindow::slotSave()
{
if(currentName.isEmpty())
return slotSaveAs();
else
return saveFile(currentName);
}
*******************************************
函数作用:把文本编辑的内容保存到文本里面
先新建文本,打开文本,如果打开失败会跳出一个错误对话框,显示不能写
如果打开成功,新建一个文本流out,把文本编辑的内容都输出到文本流,并设置当前的文本名为保存时写的文本名。
**********************************************
boolMainWindow::saveFile(const QString &fileName)
{
QFilefile(fileName);
if(!file.open(QFile::WriteOnly|QFile::Text))
{
QMessageBox::critical(this,
"critical",
"cannot write file"
);
return false;
}
else
{
QTextStream out(&file);
out<
return true;
}
}
***********************************
函数作用:点击另存为选项实现的方法
点击另存为跳出文件对话框,输入另存为名字并把改名字赋值给fileName
如果没输入另存为名字取消掉,返回false
如果输入,用这个名字保存文本
**************************************
bool MainWindow::slotSaveAs()
{
QStringfileName =QFileDialog::getSaveFileName(this);
if(fileName.isEmpty())
return false;
else
return saveFile(fileName);
}
***************************************
函数作用:点击打开选项实现的方法(槽)
点击打开文本,先判断当前已经打开的文本是否保存
如果保存了,就跳出文件对话框,输入要打开的文件名,并把该文件名赋值给fileName,fileName不为空,打开该文件
********************************************
voidMainWindow::slotOpen()
{
if(maybeSave())
{
QString fileName = QFileDialog::getOpenFileName(this);
if(!fileName.isEmpty())
loadFile(fileName);
}
}
**********************************************
函数作用:打开fileName这个文件
先打开fileName文本,如果打开失败,跳出一个错误对话框,并返回
如果打开成功,把该文本的内容都读到文本编辑上,并设置当前文本的文件名为fileName.
****************************************************************
void MainWindow::loadFile(constQString &fileName)
{
QFilefile(fileName);
if(!file.open(QFile::ReadOnly|QFile::Text))
{
QMessageBox::critical(this,
"critical",
"cannot read file"
);
return;
}
else
{
QTextStream in(&file);
textEdit.setPlainText(in.readAll());
setCurrentFile(fileName);
}
}