仿window记事本设计界面
主区域只添加一个控件 —— TextEdit
。仿照window的记事本工具设计菜单栏,菜单栏选项以及每个菜单项下的Action
可以直接使Qt Designer
界面进行添加修改名字。
双击在Action Editor
的每一项可以给选项添加图标
给工具栏添加图标直接将Action Editor
的每一项往工具栏上拖就可以给工具栏添加图标。点击工具栏图标和点击菜单栏的每个Action
的动作是一样的。
一般文本编辑工具都会提供copy
、paste
、cut
、undo
等操作,而这些功能Qt的TextEdit控件已经提供。TextEdit
也自带鼠标右键等快捷键。
一些常用的TextEdit
信号:
[slot] void QTextEdit::copy()
[slot] void QTextEdit::cut()
[slot] void QTextEdit::paste()
[slot] void QTextEdit::selectAll()
[slot] void QTextEdit::undo()
从TextEdit
的帮助文档中可以看到,还有很多槽,除了实现常见的文本编辑功能,还可以实现很多功能,如查找、放大、缩小、对齐等等。
文件菜单下的功能实现
1、新建文件
//新建文件
void MyNotepad::newFile(void)
{
if (ui->textEdit->document()->isModified()) //判断编辑区内容是否改变
{
qDebug() << "document is modified";
switch (requestIsSave()) //是否要保存
{
case QMessageBox::Yes : //保存
saveDocumentText();
if (!currentfileName.isEmpty())
{
currentfileName.clear();
}
setDocumentTitile("untitled -- notepad");
ui->textEdit->document()->clear();
break;
case QMessageBox::No :
setDocumentTitile("untitled -- notepad");
ui->textEdit->document()->clear();
break;
case QMessageBox::Cancel :
qDebug() << "取消";
break;
default:
break;
}
}
else
{
qDebug() << "document is not modified";
}
}
执行新建文件前首先要判断编辑区内容是否改变,如果改变了就先保存再新建。
2、打开文件
void MyNotepad::openFile(void)
{
if (ui->textEdit->document()->isModified()) //编辑区内容是否改变
{
saveDocumentText(); //保存文本
}
getDocumentText(); //获取文件内容
setDocumentTitile(currentfileName); //在菜单栏上方显示文本的标题
}
对于打开文件,同样判断编辑区内容是否改变,内容改变就先保存然后再获取打开的文本内容显示到编辑区中,根据文件名设置显示文本标题。
3、保存文件
void MyNotepad::saveFile(void)
{
if (ui->textEdit->document()->isModified() || !currentfileName.isEmpty())
{
QString tmpFileName = saveDocumentText();
setDocumentTitile(tmpFileName);
currentfileName = tmpFileName;
}
}
当文本编辑区内容改变或者已经有打开的文件,点击save file的Action
才会进行相应
4、文件另存为
void MyNotepad::saveAsFile()
{
if (ui->textEdit->document()->isModified())
{
QString tmpFileName = currentfileName;
currentfileName.clear();
saveDocumentText();
currentfileName = tmpFileName;
}
}
同样也要判断编辑区内容是否改变。saveDocumentText()
函数只针对新建文件还没保存和已经打开文件做了保存处理,而另存为要重新命名保存成另一个文件。
为避免写重复代码,这里将当前打开的文件名先保存、清空,saveDocumentText()
就会变成保存新建文件的功能就能给重新起名保存文件,接着再恢复当前打开的文件名。
5、退出notepad
void MyNotepad::exitNotepad()
{
if (ui->textEdit->document()->isModified())
{
switch (requestIsSave())
{
case QMessageBox::Yes :
saveDocumentText();
this->close();
break;
case QMessageBox::No :
this->close();
break;
case QMessageBox::Cancel :
qDebug() << "取消";
break;
default:
break;
}
}
}
要退出时判断编辑区内容是否改变,当内容有改变让用户选择保存还是不保存。
编辑菜单栏的功能实现
1、复制、粘贴、撤销 etc.
对于复制、粘贴、撤销等功能,QTextEdit
已经提供相应的槽,所以将相应的Action
的点击触发信号连接到相应的槽即可。
connect(ui->copyAction, &QAction::triggered, ui->textEdit, &QTextEdit::copy);
connect(ui->cutAction, &QAction::triggered, ui->textEdit, &QTextEdit::cut);
connect(ui->pasteAction, &QAction::triggered, ui->textEdit, &QTextEdit::paste);
connect(ui->undoAction, &QAction::triggered, ui->textEdit, &QTextEdit::undo);
connect(ui->selectAllAction, &QAction::triggered, ui->textEdit, &QTextEdit::selectAll);
2、添加当前日期
需要包含头文件
#include <QDateTime>
连接自定义槽
connect(ui->dateAction, &QAction::triggered, this, &MyNotepad::setDateTime);
void MyNotepad::setDateTime()
{
//QDateTime::currentDateTime().toString() 获取当前日期并转成字符串
ui->textEdit->append(QDateTime::currentDateTime().toString());
}
向文本编辑区添加日期。
格式菜单选项功能实现
格式菜单选项可以设置字体颜色。功能实现就是运用了字体和颜色标准对话框
选择字体:
void MyNotepad::selectFont()
{
bool ok;
QFont font = QFontDialog::getFont(&ok, this);
if (ok)
{
ui->textEdit->setFont(font);
}
}
选择颜色:
void MyNotepad::selectColor()
{
QColor color = QColorDialog::getColor(Qt::yellow, this, tr("选择颜色"));
ui->textEdit->setTextColor(color);
}
帮助菜单栏功能实现
帮助菜单栏有两个Action —— 查看帮助和关于
查看帮助就用QDesktopServices
简单打开了个网址
void MyNotepad::seeHelp(void)
{
QUrl url("https://me.csdn.net/qq_36413982?ref=miniprofile");
QDesktopServices::openUrl(url);
}
关于Action
void MyNotepad::doForAboutAction()
{
// QMessageBox::about(this, tr("关于"), tr("简单的记事本工具 - write by Ares"));
AboutDialog about;
about.exec();
}
创建一个对话框,显示了一行文字而已。
完整代码:
https://gitee.com/guangjieMVP/MyNotepad_Qt
对于初学不久自己一字一句写出个小东西还是挺开心。 尽管查看菜单选项没有实现以及很多不合理或者要改进的地方,比如没有添加查找功能。
对于查找功能相关类也有提供相应的方法,实现起来应该也不是很难吧。