-
Notifications
You must be signed in to change notification settings - Fork 0
/
mdichild.cpp
163 lines (143 loc) · 5.17 KB
/
mdichild.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "mdichild.h"
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QFileInfo>
#include <QApplication>
#include <QFileDialog>
#include <QCloseEvent>
#include <QPushButton>
MdiChild::MdiChild(QWidget *parent) :
QTextEdit(parent)
{
setAttribute(Qt::WA_DeleteOnClose);//设置在子窗口关闭时销毁这个类的对象
isUntitled=true;//初始isUntitled为true
}
//新建文件操作
void MdiChild::newFile()
{
static int sequenceNumber=1;//设置窗口编号,因为编号一直被保存,所以需要使用静态变量
isUntitled=true;//新建文档没有被保存过
curFile=tr("未命名文档%1.txt").arg(sequenceNumber++);//将当前文件命名为未命名文档加编号,编号先使用再加一
setWindowTitle(curFile+"[*]"+"-多文档编辑器");//设置窗口标题,使用[*]可以在文档被更改后在文件名称后显示"*"号
//文档更改时发射contentsChanged()信号,执行documentWasModified()槽
connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));
}
//加载文件操作
bool MdiChild::loadFile(const QString &fileName)
{
QFile file(fileName);//新建QFile对象
if(!file.open(QFile::ReadOnly|QFile::Text))//只读方式打开文件,出错则提示,并返回false
{
QMessageBox::warning(this,tr("多文档编辑器"),tr("无法读取文件%1:\n%2.").arg(fileName).arg(file.errorString()));
return false;
}
QTextStream in(&file);//新建文本流对象
QApplication::setOverrideCursor(Qt::WaitCursor);//设置鼠标状态为等待状态
setPlainText(in.readAll());//读取文件的全部文本内容,并添加到编辑器中
QApplication::restoreOverrideCursor();//恢复鼠标状态
setCurrentFile(fileName);//设置当前文件
connect(document(),SIGNAL(contentsChanged()),this,SLOT(documentWasModified()));
return true;
}
//保存操作
bool MdiChild::save()
{
//如果文件未被保存过,则执行另存为操作,否则直接保存文件
if(isUntitled)
{
return saveAs();
}
else
{
return saveFile(curFile);
}
}
//另存为操作
bool MdiChild::saveAs()
{
QString fileName=QFileDialog::getSaveFileName(this,"另存为",curFile);
//获取文件路径,如果为空,则返回false,否则保存文件
if(fileName.isEmpty())
return false;
return saveFile(fileName);
}
//关闭操作
void MdiChild::closeEvent(QCloseEvent *event)
{
//如果maybeSave()函数返回true,则关闭窗口,否则忽略该事件
if(maybeSave())
{
event->accept();
}
else
{
event->ignore();
}
}
//documentWasModified()槽定义
void MdiChild::documentWasModified()
{
//根据文档的isModfiled()函数的返回值,判断编辑器内容是否被更改了
//如果被更改了,就要在设置了[*]号的地方显示"*"号,这里会在窗口标题中显示
setWindowModified(document()->isModified());
}
//setCurrentFile()的定义
void MdiChild::setCurrentFile(const QString &fileName)
{
//canonicalFilePath()可以除去路径中的符号链接,“.”和".."等符号
curFile=QFileInfo(fileName).canonicalFilePath();
isUntitled=false;//文件路径已被保存
document()->setModified(false);//文档没有被更改过
setWindowModified(false);//窗口不显示被更改标题
setWindowTitle(userFriendlyCurrentFile()+"[*]");//设置窗口标题,userFriendlyCurrentFile()返回文件名
}
//userFriendlyCurrentFile()
QString MdiChild::userFriendlyCurrentFile()
{
//从文件路径中提取文件名
return QFileInfo(curFile).fileName();
}
//saveFile()
bool MdiChild::saveFile(const QString &fileName)
{
QFile file(fileName);
if(!file.open(QFile::WriteOnly|QFile::Text))
{
QMessageBox::warning(this,"多文档编辑器",tr("无法写入文件%1:\n%2.").arg(fileName).arg(file.errorString()));
return false;
}
QTextStream out(&file);
QApplication::setOverrideCursor(Qt::WaitCursor);
out<<toPlainText();//以纯文本文件写入
QApplication::restoreOverrideCursor();
setCurrentFile(fileName);
return true;
}
//maybeSave()
bool MdiChild::maybeSave()
{
//如果文档被更改过
if(document()->isModified())
{
QMessageBox box;
box.setWindowTitle("多文档编辑器");
box.setText(tr("是否保存对%1的更改?").arg(userFriendlyCurrentFile()));
box.setIcon(QMessageBox::Warning);
//添加按钮,QMessgaeBox::YesRole可以表明这个按钮的行为
QPushButton *yesBtn=box.addButton("是(&Y)",QMessageBox::YesRole);
box.addButton("否(&N)",QMessageBox::NoRole);
QPushButton *cancelBtn=box.addButton("取消",QMessageBox::RejectRole);
box.exec();//弹出对话框,让用户选择是否保存修改,或者取消关闭操作
//如果用户选择是,则返回保存操作的结果;如果选择取消,则返回false
if(box.clickedButton()==yesBtn)
{
return save();
}
else if(box.clickedButton()==cancelBtn)
{
return false;
}
return true;//如果文档未被修改,则直接返回true
}
}