实例介绍
【实例简介】实现多窗口文本编辑
【实例截图】
【核心代码】#include "subtext.h"
subText::subText(QWidget *parent) : QTextEdit(parent)
{
isEdited = false;
this->filename.clear();
myFile = new QFile(this);
}
void subText::NewFile()
{
static int index = 1;
QString title = QString("未命名文档[%1][*]").arg(index);
this->setWindowTitle(title);
index ;
//处于编辑后,启用*号
connect(this->document(),SIGNAL(contentsChanged()),
this, SLOT(doProcessContentsChanged()));
}
void subText::OpenFile()
{
//获取要打开的文件
QString ofilename = QFileDialog::getOpenFileName(this, "打开文本文件", ".", "TEXT(*.txt *.text *.cpp *.h);;ALL File(*.*)");
if(ofilename.isEmpty())
{
return;
}
//保存文件路径,将文件设置到窗体
this->filename = ofilename;
//从路径中获取文件名
QFileInfo info(filename);
QString title = QString("%1[*]").arg(info.fileName());
this->setWindowTitle(title);
//处于编辑后,启用*号
connect(this->document(),SIGNAL(contentsChanged()),
this, SLOT(doProcessContentsChanged()));
//文件的操作 用流的形式打开文件
myFile->setFileName(filename);
bool ret = myFile->open(QIODevice::ReadOnly|QIODevice::ReadOnly);
if(!ret){
QMessageBox::warning(this, "打开文件", "打开文件失败!");
return;
}
QTextStream stream(myFile);
//QString str = this->codeName;
//QTextCodec::codecForName(str.toLocal8Bit())
stream.setCodec(this->codeName.toLocal8Bit().data());
while(!stream.atEnd()){
QString str = stream.readLine();
this->append(str);
}
myFile->close();
}
void subText::setCodeName(const QString codename)
{
this->codeName = codename;
}
int subText::SaveFile()
{
int ret = -1;
if(!isEdited)
{
return -1;
}
if(this->filename.isEmpty()){
QString savefilename = QFileDialog::getSaveFileName(this,
"保存提示", ".", "Text(*.txt *.text *.cpp *.h)");
if(savefilename.isEmpty()){
return ret;
}
this->filename = savefilename;
}
//对文件进行操作
myFile->setFileName(this->filename);
bool result = myFile->open(QIODevice::WriteOnly|QIODevice::Text);
if(!result){
QMessageBox::warning(this, "失败", "打开文件失败!");
return ret;
}
QTextStream stream(myFile);
//QString str = this->codeName;
//QTextCodec::codecForName(str.toLocal8Bit())
stream.setCodec(this->codeName.toLocal8Bit().data());
stream<<this->toPlainText();
//根据存储的文件名更改窗口名称
QFileInfo info(filename);
QString title = QString("%1[*]").arg(info.fileName());
this->setWindowTitle(title);
//处于编辑后,启用*号
connect(this->document(),SIGNAL(contentsChanged()),
this, SLOT(doProcessContentsChanged()));
stream.flush();
myFile->close();
this->setWindowModified(false);
isEdited =false;
QMessageBox::information(this, "保存提示", "保存文件成功!");
ret = 0;
return ret;
}
void subText::SaveAsFile()
{
bool tepIsEdited = this->isEdited;
this->isEdited = true;
QString tepfilename = this->filename;
this->filename.clear();
int ret = SaveFile();
if(ret < 0){
this->isEdited = tepIsEdited;
this->filename = tepfilename;
}
}
//关闭事件重写
void subText::closeEvent(QCloseEvent *event)
{
if(!isEdited)
{
return;
}
QMessageBox::StandardButton ret;
ret = QMessageBox::information(this, "保存提示", "你确定是否需要保存?",
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,QMessageBox::Yes);
if(QMessageBox::Yes == ret){
SaveFile();
event->accept();
}
else if(QMessageBox::No == ret){
event->accept();
}
else {
event->ignore();
}
}
void subText::contextMenuEvent(QContextMenuEvent *e)
{
QMenu *myMenu = new QMenu(this);
QAction *undo = myMenu->addAction(QIcon(":/image/undo.png"),
"撤销", this, SLOT(undo()), QKeySequence::Undo);
undo->setEnabled(this->document()->isUndoAvailable());
QAction *redo = myMenu->addAction(QIcon(":/image/redo.png"),
"恢复", this, SLOT(redo()), QKeySequence::Redo);
redo->setEnabled(this->document()->isRedoAvailable());
QAction *copy = myMenu->addAction(QIcon(":/image/copy.png"),
"复制", this, SLOT(copy()), QKeySequence::Copy);
copy->setEnabled(this->textCursor().hasSelection());
QAction *cut = myMenu->addAction(QIcon(":/image/cut.png"),
"剪切", this, SLOT(cut()), QKeySequence::Cut);
cut->setEnabled(this->textCursor().hasSelection());
QAction *paste = myMenu->addAction(QIcon(":/image/paste.png"),
"粘贴", this, SLOT(paste()), QKeySequence::Paste);
paste->setEnabled(this->canPaste());
QAction *clear = myMenu->addAction(QIcon(""),
"清除", this, SLOT(clear()),QKeySequence(tr("Ctrl D")));
clear->setEnabled(!(this->document()->isEmpty()));
QAction *selectall = myMenu->addAction(QIcon(""),
"全选", this, SLOT(selectAll()), QKeySequence::SelectAll);
selectall->setEnabled(!(this->document()->isEmpty()));
myMenu->exec(e->globalPos());
//myMenu->show();
}
////////////slots function///////////
void subText::doProcessContentsChanged(){
isEdited = true;
this->setWindowModified(true);
}
////////////slots end///////////////
【实例截图】

【核心代码】#include "subtext.h"
subText::subText(QWidget *parent) : QTextEdit(parent)
{
isEdited = false;
this->filename.clear();
myFile = new QFile(this);
}
void subText::NewFile()
{
static int index = 1;
QString title = QString("未命名文档[%1][*]").arg(index);
this->setWindowTitle(title);
index ;
//处于编辑后,启用*号
connect(this->document(),SIGNAL(contentsChanged()),
this, SLOT(doProcessContentsChanged()));
}
void subText::OpenFile()
{
//获取要打开的文件
QString ofilename = QFileDialog::getOpenFileName(this, "打开文本文件", ".", "TEXT(*.txt *.text *.cpp *.h);;ALL File(*.*)");
if(ofilename.isEmpty())
{
return;
}
//保存文件路径,将文件设置到窗体
this->filename = ofilename;
//从路径中获取文件名
QFileInfo info(filename);
QString title = QString("%1[*]").arg(info.fileName());
this->setWindowTitle(title);
//处于编辑后,启用*号
connect(this->document(),SIGNAL(contentsChanged()),
this, SLOT(doProcessContentsChanged()));
//文件的操作 用流的形式打开文件
myFile->setFileName(filename);
bool ret = myFile->open(QIODevice::ReadOnly|QIODevice::ReadOnly);
if(!ret){
QMessageBox::warning(this, "打开文件", "打开文件失败!");
return;
}
QTextStream stream(myFile);
//QString str = this->codeName;
//QTextCodec::codecForName(str.toLocal8Bit())
stream.setCodec(this->codeName.toLocal8Bit().data());
while(!stream.atEnd()){
QString str = stream.readLine();
this->append(str);
}
myFile->close();
}
void subText::setCodeName(const QString codename)
{
this->codeName = codename;
}
int subText::SaveFile()
{
int ret = -1;
if(!isEdited)
{
return -1;
}
if(this->filename.isEmpty()){
QString savefilename = QFileDialog::getSaveFileName(this,
"保存提示", ".", "Text(*.txt *.text *.cpp *.h)");
if(savefilename.isEmpty()){
return ret;
}
this->filename = savefilename;
}
//对文件进行操作
myFile->setFileName(this->filename);
bool result = myFile->open(QIODevice::WriteOnly|QIODevice::Text);
if(!result){
QMessageBox::warning(this, "失败", "打开文件失败!");
return ret;
}
QTextStream stream(myFile);
//QString str = this->codeName;
//QTextCodec::codecForName(str.toLocal8Bit())
stream.setCodec(this->codeName.toLocal8Bit().data());
stream<<this->toPlainText();
//根据存储的文件名更改窗口名称
QFileInfo info(filename);
QString title = QString("%1[*]").arg(info.fileName());
this->setWindowTitle(title);
//处于编辑后,启用*号
connect(this->document(),SIGNAL(contentsChanged()),
this, SLOT(doProcessContentsChanged()));
stream.flush();
myFile->close();
this->setWindowModified(false);
isEdited =false;
QMessageBox::information(this, "保存提示", "保存文件成功!");
ret = 0;
return ret;
}
void subText::SaveAsFile()
{
bool tepIsEdited = this->isEdited;
this->isEdited = true;
QString tepfilename = this->filename;
this->filename.clear();
int ret = SaveFile();
if(ret < 0){
this->isEdited = tepIsEdited;
this->filename = tepfilename;
}
}
//关闭事件重写
void subText::closeEvent(QCloseEvent *event)
{
if(!isEdited)
{
return;
}
QMessageBox::StandardButton ret;
ret = QMessageBox::information(this, "保存提示", "你确定是否需要保存?",
QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel,QMessageBox::Yes);
if(QMessageBox::Yes == ret){
SaveFile();
event->accept();
}
else if(QMessageBox::No == ret){
event->accept();
}
else {
event->ignore();
}
}
void subText::contextMenuEvent(QContextMenuEvent *e)
{
QMenu *myMenu = new QMenu(this);
QAction *undo = myMenu->addAction(QIcon(":/image/undo.png"),
"撤销", this, SLOT(undo()), QKeySequence::Undo);
undo->setEnabled(this->document()->isUndoAvailable());
QAction *redo = myMenu->addAction(QIcon(":/image/redo.png"),
"恢复", this, SLOT(redo()), QKeySequence::Redo);
redo->setEnabled(this->document()->isRedoAvailable());
QAction *copy = myMenu->addAction(QIcon(":/image/copy.png"),
"复制", this, SLOT(copy()), QKeySequence::Copy);
copy->setEnabled(this->textCursor().hasSelection());
QAction *cut = myMenu->addAction(QIcon(":/image/cut.png"),
"剪切", this, SLOT(cut()), QKeySequence::Cut);
cut->setEnabled(this->textCursor().hasSelection());
QAction *paste = myMenu->addAction(QIcon(":/image/paste.png"),
"粘贴", this, SLOT(paste()), QKeySequence::Paste);
paste->setEnabled(this->canPaste());
QAction *clear = myMenu->addAction(QIcon(""),
"清除", this, SLOT(clear()),QKeySequence(tr("Ctrl D")));
clear->setEnabled(!(this->document()->isEmpty()));
QAction *selectall = myMenu->addAction(QIcon(""),
"全选", this, SLOT(selectAll()), QKeySequence::SelectAll);
selectall->setEnabled(!(this->document()->isEmpty()));
myMenu->exec(e->globalPos());
//myMenu->show();
}
////////////slots function///////////
void subText::doProcessContentsChanged(){
isEdited = true;
this->setWindowModified(true);
}
////////////slots end///////////////
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论