HTML排版,增加选中文本前后插入<td>、<tr>、<p>的工具

This commit is contained in:
sonichy 2019-06-08 11:46:43 +08:00
parent e4028f2c77
commit e28247489b
9 changed files with 205 additions and 95 deletions

BIN
HTYEdit

Binary file not shown.

View File

@ -2,7 +2,7 @@
Name=海天鹰编辑器
Comment=Media player
Exec=/media/sonichy/job/HY/Linux/Qt/HTYEdit/HTYEdit %u
Icon=/media/sonichy/job/HY/Linux/Qt/HTYEdit/icon.png
Icon=/media/sonichy/job/HY/Linux/Qt/HTYEdit/HTYEdit.png
Path=/media/sonichy/job/HY/Linux/Qt/HTYEdit
Terminal=false
Type=Application

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,12 +1,9 @@
# Qt 海天鹰编辑器
Linux 平台基于 Qt 的文字编辑程序。
基于 Qt 的文字编辑程序。
已编译好的 HTYEdit 程序适用 64 位 Linux 系统 Qt5 环境,双击运行,其他版本请自行编译。
![alt](preview.png)
### 1.3 新增行号
### 1.3 新增调试窗口
### 1.1 [新增语法高亮](http://www.cnblogs.com/lenxvp/p/5475931.html)
高亮类具体工作过程没看懂,因为很好用先用着。
### 已知问题
从打开方式打开文件,文件只读无法保存。
### 参考:
多文档编辑器http://www.qter.org/portal.php?mod=view&aid=10
编译、运行输出https://github.com/m-iDev-0792/HJ-Editor

View File

@ -105,7 +105,7 @@ void MainWindow::on_action_aboutQt_triggered()
void MainWindow::on_action_about_triggered()
{
QMessageBox aboutMB(QMessageBox::NoIcon, "关于", "海天鹰编辑器 1.9\n\n一款基于 Qt 的文本编辑程序。\n作者:黄颖\nE-mail: sonichy@163.com\n主页https://github.com/sonichy\n参考文献:\n多文档编辑器http://www.qter.org/?page_id=161\nQMdiArea基本用法http://www.mamicode.com/info-detail-1607476.html\n保存文本http://blog.csdn.net/neicole/article/details/7330234\n语法高亮http://www.cnblogs.com/lenxvp/p/5475931.html\n拖放打开文件http://blog.csdn.net/rl529014/article/details/53057577\n行号http://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html");
QMessageBox aboutMB(QMessageBox::NoIcon, "关于", "海天鹰编辑器 1.10\n\n一款基于 Qt 的文本编辑程序。\n作者:黄颖\nE-mail: sonichy@163.com\n主页https://github.com/sonichy\n参考文献:\n多文档编辑器http://www.qter.org/?page_id=161\nQMdiArea基本用法http://www.mamicode.com/info-detail-1607476.html\n保存文本http://blog.csdn.net/neicole/article/details/7330234\n语法高亮http://www.cnblogs.com/lenxvp/p/5475931.html\n拖放打开文件http://blog.csdn.net/rl529014/article/details/53057577\n行号http://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html");
aboutMB.setIconPixmap(QPixmap(":/icon.png"));
aboutMB.setWindowIcon(QIcon(":/icon.png"));
aboutMB.exec();
@ -113,7 +113,7 @@ void MainWindow::on_action_about_triggered()
void MainWindow::on_action_changelog_triggered()
{
QString s = "1.9\n2019-04\n便签右键菜单增加打开文件路径。\n换行自动缩进。\n快捷键 Ctrl+/ 注释、取消注释选中行。\n保存窗口大小,保存字体设置,设置是否显示输出窗口。\n\n1.8\n2018-11\n使用系统主题图标代替Qt内置图标。\n\n1.7\n2018-10\n支持拖放打开多个文件。\n增加打开文件log。\n打开方式文件路径兼容深度文管和其他文管。\n\n1.6\n2018-09\n标签右键增加只读菜单。\n优化括号补全。\n\n1.5\n2018-08\n增加行号\n增加java文件编译命令\n\n1.4\n2018-07\n设置QTextEdit的Tab跳过的空格数为4个空格\n\n1.3\n2018-06\n增加调试窗口。\n\n1.2\n2018-05\n增加c、cpp的OpenGL编译命令。\n2018-05\n解决右键打开方式无法打开文件问题。\n增加运行python。\n2018-04\n增加打印功能。\n\n1.1\n2017-10\n增加获取文本编码(使用 file --mime-encoding 命令返回),但是没有解决乱码问题。\n排版实验。\n用文本框代替消息框显示更新日志。\n2017-07\n增加拖放打开文件。\n2017-06\n增加语法高亮。\n提取打开文件的相对路径使Markdown预览能够载入相对路径图片。\n\n1.0\n2017-03\n支持命令行打开文件和打开方式打开文件。\n查找窗口填入选中文本。\n2017-02\n根据文件扩展名选择语法高亮方案。\nJS语法高亮实验成功\nHTML语法高亮实验成功\n增加设置字体。\n设置状态栏左右边距。\n2017-01\n实现全部替换。\n设置循环查找。\n增加查找替换窗体和功能。\n根据文件扩展名决定是否使用默认程序打开如htm。\n优化保存、另存为和文本修动标题标记逻辑。\n增加撤销,重做,子窗标题文本改动标识。\n增加子窗体类实现Ctrl+滚轮缩放和保存打开文件的路径。\n增加使用默认程序预览文件。\n把上一个打开或保存的路径设置为打开或保存对话框的默认路径和文件名。\n增加放大、缩小。\n增加文本光标变化信号,光标所在行列显示在状态栏第二栏。\n状态栏分为2栏\n修复没有子窗口时预览引起的崩溃。\n增加预览功能。\n保存成功。\n修改字体颜色,背景色成功。\n新建文件成功,打开文件载入成功。\n选用QMdiArea作为主控件增加窗口标签、平铺、层叠菜单。 \n制作主要菜单。";
QString s = "1.10\n2019-06\nHTML排版增加选中文本前后插入<td>、<tr>、<p>的工具。\n\n1.9\n2019-04\n便签右键菜单增加打开文件路径。\n换行自动缩进。\n快捷键 Ctrl+/ 注释、取消注释选中行。\n保存窗口大小,保存字体设置,设置是否显示输出窗口。\n\n1.8\n2018-11\n使用系统主题图标代替Qt内置图标。\n\n1.7\n2018-10\n支持拖放打开多个文件。\n增加打开文件log。\n打开方式文件路径兼容深度文管和其他文管。\n\n1.6\n2018-09\n标签右键增加只读菜单。\n优化括号补全。\n\n1.5\n2018-08\n增加行号\n增加java文件编译命令\n\n1.4\n2018-07\n设置QTextEdit的Tab跳过的空格数为4个空格\n\n1.3\n2018-06\n增加调试窗口。\n\n1.2\n2018-05\n增加c、cpp的OpenGL编译命令。\n2018-05\n解决右键打开方式无法打开文件问题。\n增加运行python。\n2018-04\n增加打印功能。\n\n1.1\n2017-10\n增加获取文本编码(使用 file --mime-encoding 命令返回),但是没有解决乱码问题。\n排版实验。\n用文本框代替消息框显示更新日志。\n2017-07\n增加拖放打开文件。\n2017-06\n增加语法高亮。\n提取打开文件的相对路径使Markdown预览能够载入相对路径图片。\n\n1.0\n2017-03\n支持命令行打开文件和打开方式打开文件。\n查找窗口填入选中文本。\n2017-02\n根据文件扩展名选择语法高亮方案。\nJS语法高亮实验成功\nHTML语法高亮实验成功\n增加设置字体。\n设置状态栏左右边距。\n2017-01\n实现全部替换。\n设置循环查找。\n增加查找替换窗体和功能。\n根据文件扩展名决定是否使用默认程序打开如htm。\n优化保存、另存为和文本修动标题标记逻辑。\n增加撤销,重做,子窗标题文本改动标识。\n增加子窗体类实现Ctrl+滚轮缩放和保存打开文件的路径。\n增加使用默认程序预览文件。\n把上一个打开或保存的路径设置为打开或保存对话框的默认路径和文件名。\n增加放大、缩小。\n增加文本光标变化信号,光标所在行列显示在状态栏第二栏。\n状态栏分为2栏\n修复没有子窗口时预览引起的崩溃。\n增加预览功能。\n保存成功。\n修改字体颜色,背景色成功。\n新建文件成功,打开文件载入成功。\n选用QMdiArea作为主控件增加窗口标签、平铺、层叠菜单。 \n制作主要菜单。";
QDialog *dialog = new QDialog;
dialog->setWindowTitle("更新历史");
dialog->setFixedSize(400, 300);
@ -161,8 +161,8 @@ void MainWindow::on_action_tile_triggered()
void MainWindow::on_action_new_triggered()
{
MdiChild *child = new MdiChild(this);
QMdiSubWindow *subWindow = ui->mdiArea->addSubWindow(child);
QMenu *menu = subWindow->systemMenu();
QMdiSubWindow *window = ui->mdiArea->addSubWindow(child);
QMenu *menu = window->systemMenu();
QAction *action_readonly = new QAction("只读",menu);
action_readonly->setCheckable(true);
menu->addAction(action_readonly);
@ -197,8 +197,8 @@ void MainWindow::open(QString fileName)
{
MdiChild *child = new MdiChild(this);
connect(child, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChange()));
QMdiSubWindow *subWindow = ui->mdiArea->addSubWindow(child);
QMenu *menu = subWindow->systemMenu();
QMdiSubWindow *window = ui->mdiArea->addSubWindow(child);
QMenu *menu = window->systemMenu();
QAction *action_readonly = new QAction("只读", menu);
action_readonly->setCheckable(true);
menu->addAction(action_readonly);
@ -225,12 +225,13 @@ void MainWindow::on_action_close_triggered()
void MainWindow::on_action_save_triggered()
{
if (ui->mdiArea->currentSubWindow() != 0) {
path = ((MdiChild*)(ui->mdiArea->currentSubWindow()->widget()))->path;
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if (window != 0) {
path = ((MdiChild*)(window->widget()))->path;
if (path == "") {
on_action_saveas_triggered();
} else {
MdiChild *child = (MdiChild*)(ui->mdiArea->currentSubWindow()->widget());
MdiChild *child = (MdiChild*)(window->widget());
if (child->save()) {
LS1->setText("保存 " + child->path);
}
@ -240,8 +241,9 @@ void MainWindow::on_action_save_triggered()
void MainWindow::on_action_saveas_triggered()
{
if (ui->mdiArea->currentSubWindow() != 0) {
MdiChild *child = (MdiChild*)(ui->mdiArea->currentSubWindow()->widget());
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if (window != 0) {
MdiChild *child = (MdiChild*)(window->widget());
path = child->path;
if (path == "") {
filename = QFileDialog::getSaveFileName(this, "保存文本", "./未命名");
@ -257,12 +259,13 @@ void MainWindow::on_action_saveas_triggered()
void MainWindow::on_action_run_triggered()
{
if (ui->mdiArea->currentSubWindow() != 0) {
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if (window != 0) {
QString filename1 = QFileInfo(path).fileName();
QString suffix = QFileInfo(path).suffix().toLower();
QString filepath = QFileInfo(path).absolutePath();
if (suffix == "md") {
QString s = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->toPlainText();
QString s = ((QTextEdit*)(window->widget()))->toPlainText();
s.replace("#","<h1>");
s.replace("\n","</h1>");
s.replace(" ","<br>");
@ -281,7 +284,7 @@ void MainWindow::on_action_run_triggered()
} else if (suffix == "htm" || suffix == "html") {
QDesktopServices::openUrl(QUrl::fromLocalFile(path));
} else if (suffix == "py" || suffix == "sh") {
if (((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->document()->isModified()) on_action_save_triggered();
if (((QTextEdit*)(window->widget()))->document()->isModified()) on_action_save_triggered();
QProcess *process = new QProcess;
process->setWorkingDirectory(filepath);
QString command = lineEdit_command->text().arg(filename1);
@ -292,7 +295,7 @@ void MainWindow::on_action_run_triggered()
connect(process, SIGNAL(readyReadStandardError()), this, SLOT(printError()));
process->start(command);
} else if (suffix == "c" || suffix == "cpp") {
if (((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->document()->isModified()) on_action_save_triggered();
if (((QTextEdit*)(window->widget()))->document()->isModified()) on_action_save_triggered();
QString command = lineEdit_command->text().arg(filename1).arg(QFileInfo(path).baseName());
LS1->setText(command);
ui->textBrowser->setHtml("");
@ -327,7 +330,7 @@ void MainWindow::on_action_run_triggered()
qDebug() << command;
process_compile->start(command);
} else if (suffix == "java") {
if (((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->document()->isModified()) on_action_save_triggered();
if (((QTextEdit*)(window->widget()))->document()->isModified()) on_action_save_triggered();
QString command = lineEdit_command->text().arg(filename1);
LS1->setText(command);
ui->textBrowser->setText("");
@ -356,8 +359,9 @@ void MainWindow::on_action_run_triggered()
void MainWindow::cursorPositionChange()
{
if(ui->mdiArea->currentSubWindow() != 0){
QTextCursor cursor = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
QTextCursor cursor = ((QTextEdit*)(window->widget()))->textCursor();
LS2->setText(QString("行,列: %1,%2").arg(cursor.blockNumber()+1).arg(cursor.columnNumber()));
}
}
@ -365,54 +369,60 @@ void MainWindow::cursorPositionChange()
//菜单
void MainWindow::on_action_zoomin_triggered()
{
if(ui->mdiArea->currentSubWindow() != 0){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->zoomIn();
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
((QTextEdit*)(window->widget()))->zoomIn();
}
}
void MainWindow::on_action_zoomout_triggered()
{
if(ui->mdiArea->currentSubWindow() != 0){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->zoomOut();
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
((QTextEdit*)(window->widget()))->zoomOut();
}
}
void MainWindow::on_action_undo_triggered()
{
if(ui->mdiArea->currentSubWindow() != 0){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->undo();
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
((QTextEdit*)(window->widget()))->undo();
}
}
void MainWindow::on_action_redo_triggered()
{
if(ui->mdiArea->currentSubWindow() != 0){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->redo();
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
((QTextEdit*)(window->widget()))->redo();
}
}
void MainWindow::on_action_find_triggered()
{
if(ui->mdiArea->currentSubWindow() != 0){
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
dialogFind->show();
dialogFind->ui->lineEdit_find->setFocus();
dialogFind->ui->lineEdit_find->setText(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor().selectedText());
dialogFind->ui->lineEdit_find->setText(((QTextEdit*)(window->widget()))->textCursor().selectedText());
}
}
void MainWindow::find()
{
if(ui->mdiArea->currentSubWindow() != 0){
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
QString sfind = dialogFind->ui->lineEdit_find->text();
if(!((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find(sfind)){
if(!((QTextEdit*)(window->widget()))->find(sfind)){
QMessageBox MB(QMessageBox::Question, "提示", QString("找不到\"%1\",是否从头查起。").arg(sfind));
MB.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
MB.setButtonText(QMessageBox::Yes,QString(""));
MB.setButtonText(QMessageBox::No,QString(""));
if(MB.exec() == QMessageBox::Yes){
QTextCursor cursor = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
QTextCursor cursor = ((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0, QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
find();
}
}
@ -432,13 +442,14 @@ void MainWindow::replace()
void MainWindow::replaceAll()
{
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
QString sfind = dialogFind->ui->lineEdit_find->text();
QString sreplace = dialogFind->ui->lineEdit_replace->text();
QTextCursor cursor = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
QTextCursor cursor = ((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0, QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find(sfind)){
cursor = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(window->widget()))->find(sfind)){
cursor = ((QTextEdit*)(window->widget()))->textCursor();
if(cursor.selectedText() == sfind){
cursor.insertText(sreplace);
}
@ -447,21 +458,32 @@ void MainWindow::replaceAll()
void MainWindow::on_action_indent_triggered()
{
QString suffix = QFileInfo(path).suffix().toLower();
QTextCursor cursor = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
QString s = cursor.selectedText().replace("{","{\n");
s = s.replace("}","}\n");
s = s.replace("[","[\n");
s = s.replace("]","]\n");
s = s.replace(",",",\n");
QString s = cursor.selectedText();
if (suffix == "htm" || suffix == "html") {
//s = s.trimmed();
//s = s.replace(QRegExp("[\\s]+"), ""); // \\s表示空格,回车,换行等空白符, +号表示匹配一个或多个
s = s.replace(QRegExp("[\\s]+(<td>)"), "\\1"); //删除<td>前面空白
s = s.replace(QRegExp("[\\s]+(</td>)"), "\\1"); //删除</td>前面空白
s = s.replace(QRegExp("(</tr>)[\\s]+"), "\\1\n"); //删除</tr>后面空白后换行
} else if (suffix == "c" || suffix == "cpp"){
s = s.replace("{", "{\n");
s = s.replace("}", "}\n");
s = s.replace("[", "[\n");
s = s.replace("]", "]\n");
s = s.replace(",", ",\n");
}
//qDebug() << s;
cursor.insertText(s);
}
void MainWindow::on_action_font_triggered()
{
//if(ui->mdiArea->currentSubWindow() != 0){
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
bool ok;
//qDebug() << ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->currentFont();
//qDebug() << ((QTextEdit*)(window->widget()))->currentFont();
QString sfont = settings.value("Font").toString();
QFont font;
if (sfont == "") {
@ -470,49 +492,49 @@ void MainWindow::on_action_font_triggered()
QStringList SLFont = sfont.split(",");
font = QFont(SLFont.at(0),SLFont.at(1).toInt(),SLFont.at(2).toInt(),SLFont.at(3).toInt());
}
//QFont font = QFontDialog::getFont(&ok, ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->currentFont(), this, "选择字体");
font = QFontDialog::getFont(&ok, font, this, "选择字体");
if(ok){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setCurrentFont(font);
((QTextEdit*)(window->widget()))->setCurrentFont(font);
QString sfont = font.family() + "," + QString::number(font.pointSize()) + "," + font.weight() + "," + font.italic();
settings.setValue("Font", sfont);
}
//}
}
}
//自己写的高亮效率低打开文件会卡死弃用引入QSyntaxHighlighter类
void MainWindow::SyntaxHighlight()
{
QTextCursor cursor = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
QString suffix = QFileInfo(((MdiChild*)(ui->mdiArea->currentSubWindow()->widget()))->path).suffix().toLower();
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
QTextCursor cursor = ((QTextEdit*)(window->widget()))->textCursor();
QString suffix = QFileInfo(((MdiChild*)(window->widget()))->path).suffix().toLower();
if (suffix == "htm" || suffix == "html") {
//HTML
QString str="!DOCTYPE,html,link,head,meta,body,title,style,script,p,br,pre,table,tr,td,input,div,img,a,h1,h2,h3,h4,h6,select,option,ul,ol,li,canvas,fieldset,legend,input,button";
QStringList list=str.split(",");
for(int i=0;i<list.size();i++){
//cursor=((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
//cursor=((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0,QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find("<" + list[i] + ">")){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextColor(QColor(255,0,0));
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(window->widget()))->find("<" + list[i] + ">")){
((QTextEdit*)(window->widget()))->setTextColor(QColor(255,0,0));
}
//cursor=((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
//cursor=((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0,QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find("<" + list[i])){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextColor(QColor(255,0,0));
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(window->widget()))->find("<" + list[i])){
((QTextEdit*)(window->widget()))->setTextColor(QColor(255,0,0));
}
//cursor=((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
//cursor=((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0,QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find("</" + list[i] + ">")){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextColor(QColor(255,0,0));
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(window->widget()))->find("</" + list[i] + ">")){
((QTextEdit*)(window->widget()))->setTextColor(QColor(255,0,0));
}
//cursor=((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
//cursor=((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0,QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find(">")){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextColor(QColor(255,0,0));
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(window->widget()))->find(">")){
((QTextEdit*)(window->widget()))->setTextColor(QColor(255,0,0));
}
}
@ -520,11 +542,11 @@ void MainWindow::SyntaxHighlight()
str = "id=,name=,http-equiv=,content=,width=,height=,align=,onchange=,value=,type=";
list = str.split(",");
for(int i=0; i<list.size(); i++){
//cursor=((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
//cursor=((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0,QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find(list[i])){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextColor(QColor(255,255,0));
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(window->widget()))->find(list[i])){
((QTextEdit*)(window->widget()))->setTextColor(QColor(255,255,0));
}
}
} else if (suffix=="js") {
@ -532,25 +554,25 @@ void MainWindow::SyntaxHighlight()
QString str = "window,event,var,new,Array(),Image(),push,document,getElementById,createElement,appendChild,console,.log,.style,backgroundColor,for,if,textContent,innerHTML,function,.src,.load,.complete,.onload,.width,.height,.value,beginPath(),lineTo,moveTo,stroke(),strokeStyle,getContext,eval,translate,textAlign,Math,.cos,.sin,.pow,.random,fillText,addEventListener,length,drawImage,.top,.bottom,.left,.right,onmousemove,onmouseup,offsetLeft,offsetRight,offsetTop,offsetBottom,offsetWidth,offsetHeight,this,options,selectedIndex,.text,setInterval,clearInterval";
QStringList list = str.split(",");
for(int i=0; i<list.size(); i++){
//cursor=((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->textCursor();
//cursor=((QTextEdit*)(window->widget()))->textCursor();
cursor.setPosition(0,QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->find(list[i],QTextDocument::FindCaseSensitively)){
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextColor(QColor(0,255,0));
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
while(((QTextEdit*)(window->widget()))->find(list[i],QTextDocument::FindCaseSensitively)){
((QTextEdit*)(window->widget()))->setTextColor(QColor(0,255,0));
}
}
}
cursor.setPosition(0,QTextCursor::MoveAnchor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setTextCursor(cursor);
((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->setWindowModified(false);
((QTextEdit*)(window->widget()))->setTextCursor(cursor);
((QTextEdit*)(window->widget()))->setWindowModified(false);
}
void MainWindow::dragEnterEvent(QDragEnterEvent *e)
{
qDebug() << e->mimeData()->formats().at(0);
//if(e->mimeData()->hasFormat("text/uri-list")) //只能打开文本文件
e->acceptProposedAction(); //可以在这个窗口部件上拖放对象
e->acceptProposedAction(); //可以在这个窗口部件上拖放对象
}
void MainWindow::dropEvent(QDropEvent *e) //释放对方时,执行的操作
@ -606,20 +628,22 @@ void MainWindow::on_action_printPreview_triggered()
void MainWindow::printDocument(QPrinter *printer)
{
if (ui->mdiArea->currentSubWindow() != 0) {
MdiChild *child = (MdiChild*)(ui->mdiArea->currentSubWindow()->widget());
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if (window != 0) {
MdiChild *child = (MdiChild*)(window->widget());
child->print(printer);
}
}
void MainWindow::updateCommand()
{
if (ui->mdiArea->currentSubWindow() != 0) {
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if (window != 0) {
bool isShowOutput = ui->action_window_output->isChecked();
if (isShowOutput) ui->textBrowser->show();
QString suffix = QFileInfo(((MdiChild*)(ui->mdiArea->currentSubWindow()->widget()))->path).suffix().toLower();
QString suffix = QFileInfo(((MdiChild*)(window->widget()))->path).suffix().toLower();
if (suffix == "c" || suffix == "cpp") {
QString s = ((QTextEdit*)(ui->mdiArea->currentSubWindow()->widget()))->toPlainText();
QString s = ((QTextEdit*)(window->widget()))->toPlainText();
QStringList SL = s.split("\n");
QStringList SLI = SL.filter(QRegExp("^#include"));;
QString command = "";
@ -697,4 +721,31 @@ void MainWindow::anchorClick(QUrl url)
textEdit->setTextCursor(cursor);
//textEdit->ensureCursorVisible();
}
}
void MainWindow::on_action_td_triggered()
{
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
MdiChild *child = (MdiChild*)(window->widget());
child->insertTD();
}
}
void MainWindow::on_action_tr_triggered()
{
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
MdiChild *child = (MdiChild*)(window->widget());
child->insertTR();
}
}
void MainWindow::on_action_p_triggered()
{
QMdiSubWindow *window = ui->mdiArea->currentSubWindow();
if(window != 0){
MdiChild *child = (MdiChild*)(window->widget());
child->insertP();
}
}

View File

@ -61,6 +61,9 @@ private slots:
void on_action_find_triggered();
void on_action_indent_triggered();
void on_action_font_triggered();
void on_action_td_triggered();
void on_action_tr_triggered();
void on_action_p_triggered();
void find();
void replace();
void replaceAll();

View File

@ -17,7 +17,7 @@
<string>海天鹰编辑器</string>
</property>
<property name="windowIcon">
<iconset resource="qtrf.qrc">
<iconset>
<normaloff>:/icon.png</normaloff>:/icon.png</iconset>
</property>
<widget class="QWidget" name="centralWidget">
@ -146,6 +146,9 @@
</attribute>
<addaction name="action_font"/>
<addaction name="action_run"/>
<addaction name="action_td"/>
<addaction name="action_tr"/>
<addaction name="action_p"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
<action name="action_new">
@ -445,10 +448,44 @@
<string>F12</string>
</property>
</action>
<action name="action_td">
<property name="text">
<string>&lt;td&gt;</string>
</property>
<property name="toolTip">
<string>Ctrl+Shift+D</string>
</property>
<property name="shortcut">
<string>Ctrl+Shift+D</string>
</property>
</action>
<action name="action_tr">
<property name="text">
<string>&lt;tr&gt;</string>
</property>
<property name="toolTip">
<string>Ctrl+Shift+R</string>
</property>
<property name="shortcut">
<string>Ctrl+Shift+R</string>
</property>
</action>
<action name="action_p">
<property name="text">
<string>&lt;p&gt;</string>
</property>
<property name="toolTip">
<string>Ctrl+Alt+P</string>
</property>
<property name="shortcut">
<string>Ctrl+Alt+P</string>
</property>
<property name="shortcutVisibleInContextMenu">
<bool>false</bool>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="qtrf.qrc"/>
</resources>
<resources/>
<connections/>
</ui>

View File

@ -36,8 +36,6 @@ MdiChild::MdiChild(QWidget *parent) :
connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int)));
connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int)));
}
bool MdiChild::loadFile(QString filename)
@ -106,7 +104,7 @@ void MdiChild::contentsChange()
void MdiChild::wheelEvent(QWheelEvent *e)
{
if(QApplication::keyboardModifiers() == Qt::ControlModifier){
QTextCursor cursor = this->textCursor();
QTextCursor cursor = textCursor();
selectAll();
font = ((QTextEdit*)(this))->currentFont();
qDebug() << ((QTextEdit*)(this))->fontPointSize();
@ -228,4 +226,25 @@ void MdiChild::updateLineNumberAreaWidth(int /* newBlockCount */)
void MdiChild::setReadOnlyA(bool b)
{
setReadOnly(b);
}
void MdiChild::insertTD()
{
QString s = textCursor().selectedText();
s = "<td>" + s + "</td>";
textCursor().insertText(s);
}
void MdiChild::insertTR()
{
QString s = textCursor().selectedText();
s = "<tr>" + s + "</tr>";
textCursor().insertText(s);
}
void MdiChild::insertP()
{
QString s = textCursor().selectedText();
s = "<p>" + s + "</p>";
textCursor().insertText(s);
}

View File

@ -16,6 +16,9 @@ public:
QString path, scodec;
void lineNumberAreaPaintEvent(QPaintEvent *event);
int lineNumberAreaWidth();
void insertTD();
void insertTR();
void insertP();
private:
QSettings settings;
@ -55,4 +58,4 @@ private:
MdiChild *mdiChild;
};
#endif // MDICHILD_H
#endif // MDICHILD_H