之前大部分内容在写Qt一些小部件以及基础模块的用法,不成体系,大部分时候还是用什么找什么。随着对Qt的逐渐熟悉,应该做一些项目,这样可以在实际应用的过程中加深对程序的理解。本次要和大家分享的就是高亮语法Python编辑器。

使用Qt编写编辑器项目,可以有两种方式。一种是使用Qt自身的类如Widget、QPlainTextEdit、QSyntaxHighlighter等我们自己根据Qt提供的Api去实现编辑器;另一种可以是使用第三方库QScintilla(是Scintilla在Qt上的移植)去实现编辑器的各种功能。对于我们自己实现小型的编辑器来讲差别不大。我从另外的角度说下,自己实现了编辑器,可能还会需要添加虚拟键盘的功能。Qt可以通过插件的方式开发虚拟键盘功能,这时候使用QScintilla开发的编辑器在使用虚拟键盘上会受到一些限制。

在网上搜索资料,最后觉得Qt的两篇官方教程比较好,附上链接:

Code Editor Example:

https://doc.qt.io/qt-5/qtwidgets-widgets-codeeditor-example.html

Syntax Highlighter Example:

https://doc.qt.io/qt-5/qtwidgets-richtext-syntaxhighlighter-example.html

本篇文章参考网上资料以及Qt官方文档,又加入了对文件增删改查等功能,已经是一个较为完整的小项目了。先上一张效果图:

程序环境:ubuntu、Qt 5.5.1

LineNumberArea类,继承QWidget,实现行号区域的绘制。

CodeEditor类,继承QPlainTextEdit,更新行号,加载文本,文件操作等。

CodeHighLight类继承QSyntaxHighlighter,实现关键字、特殊语法等的高亮。

Widget类, UI层操作。

1. 继承 QPlainTextEdit 添加一些功能

行号区域是一个单独的小部件,我们再这个部件上“画”出行号,当文本行数变化时,行号区域的宽度也要发生变化,此时需要重新绘制行号区域。

void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent *event){QPainter painter(lineNumberArea);painter.fillRect(event->rect(), Qt::lightGray);QTextBlock block = firstVisibleBlock();int blockNumber = block.blockNumber();int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top();int bottom = top + (int) blockBoundingRect(block).height();while (block.isValid() && top <= event->rect().bottom()) {if (block.isVisible() && bottom >= event->rect().top()) {QString number = QString::number(blockNumber + 1);painter.setPen(Qt::black);painter.drawText(-2, top, lineNumberArea->width(), fontMetrics().height(),Qt::AlignRight, number);}block = block.next();top = bottom;bottom = top + (int) blockBoundingRect(block).height();++blockNumber;}}

高亮光标所在行:void CodeEditor::highlightCurrentLine(){QList<:extraselection> extraSelections;if (!isReadOnly()) {QTextEdit::ExtraSelection selection;QColor lineColor = QColor(Qt::yellow).lighter(160);selection.format.setBackground(lineColor);selection.format.setProperty(QTextFormat::FullWidthSelection, true);selection.cursor = textCursor();selection.cursor.clearSelection();extraSelections.append(selection);}setExtraSelections(extraSelections);}

2. 高亮关键字

继承QSyntaxHighlighter,突出一些关键字和语法显示。这里面主要是一些正则表达式的应用。我们可以定义多种QTextCharFormat类型的规则,设置他们的颜色,指定他们的格式,再将他们分配给HighlightingRule对象,并将该对象附加到我们的规则列表中。

singleLineCommentFormat.setForeground(Qt::red);rule.pattern = QRegExp("#[^\n]*");rule.format = singleLineCommentFormat;highlightingRules.append(rule);

3. 文件操作

读取文件

bool CodeEditor::openFile(QString &file){QFile f(file);QTextStream stream(&f);QApplication::setOverrideCursor(Qt::WaitCursor);this->setPlainText(stream.readAll());QApplication::restoreOverrideCursor();setCurrentFile(file);connect(this, SIGNAL(textChanged()), this, SLOT(setDocumentModified()));this->showMaximized();return true;}

保存文件

bool CodeEditor::saveFile(QString &name){QString filePath = m_filePath;QString fileName = QString("%1/%2.py").arg(filePath).arg(name);QFile file(fileName);QApplication::setOverrideCursor(Qt::WaitCursor);QTextStream stream(&file);stream << this->toPlainText();setCurrentFile(fileName);QApplication::restoreOverrideCursor();return true;}

为了可读性,删掉了一些代码。

4. 使用 MDI Area 添加文档窗体

void Widget:: on_pbn_newFile_clicked(){ui->sw_loadFile->hide();ui->sw_editor->show();ui->mdiArea->show();m_pythonCodeEditor = createMdiChild();m_codeHighLight = new CodeHighLight(m_pythonCodeEditor->document());ui->mdiArea->addSubWindow(m_pythonCodeEditor);m_pythonCodeEditor->newFile();}

公众号:Pou光明

完整工程可在公众号后台留下邮箱等联系方式。

欢迎大家关注公众号。

pythonqt项目_Qt项目之高亮关键字Python编辑器实现相关推荐

  1. python在线编辑器-在线python编辑器

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. windows下python的ide选择:http:blog.csdn. ...

  2. 在线python编辑器-在线python编辑器

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. windows下python的ide选择:http:blog.csdn. ...

  3. python 哪些项目_一份2018年Python开源项目Top100清单!

    2018 年的最后一天,营长为大家新鲜出炉了一份 2018 年 Python 开源项目 Top100 清单!这些项目都是营长每月通过收集 Mybridge 的数据整理而来的,是不是很棒!(我要在留言区 ...

  4. 算法(Python版)|156Kstars|神级项目-(1)The Algorithms - Python简介

    文章目录 算法(Python版) 项目地址 项目概况 说明 参与入门 社区频道 算法列表 Arithmetic Analysis 算术分析 Audio Filters 音频过滤器 Backtracki ...

  5. python运行一个项目_Django 项目创建到启动(最全最详细的第一个项目)

    一.前言 (一).概述 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架 ...

  6. 项目介绍star原理_这个 Python 项目厉害了!多个实战案例教你分析时空数据处理...

    大数据时代到来,随着数据的逐步开放,数据工作者们或多或少都要接触到时空数据.在处理时空数据的时候,你不仅要数据处理,还需要会GIS,最重要的它是一门艺术,要用你的审美,要出很好看的可视化图! 以前,我 ...

  7. Python网站导航项目-2.项目创建与环境配置

    每每用到别人的导航网站会充斥的各种的广告,以及很多无用的内容,用起来真的很烦人.把内容网址收藏到浏览器中又很不方便,因此基于git的前端代码结合Django Web开发自制一套简易的导航网站项目. 项 ...

  8. Python个人主页项目-2.项目创建与环境配置

    学习Python已经6年有余,从事的行业数据分析师,算法工程师.爬虫工程师.目前准备正式入行全栈,先做一个个人的博客系统,用来记录日常工作的每一天,也是为自己做一个展示自己的空间. 同时也为大家提供一 ...

  9. 项目场景: gyp verb check python checking for Python executable python2 in the PATH

    项目场景: gyp verb check python checking for Python executable "python2" in the PATH 环境 ​ node ...

  10. Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)—从而实现Python编程图文教程之详细攻略

    Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)-从而实现Python编程图文教程之详细攻略 ...

最新文章

  1. 3. std::string::size_type
  2. captcha.js一个生成验证码的插件,使用js和canvas生成
  3. Ubuntu的中文是哪种字体?python的词云分析和 三国演义人物出场统计
  4. c语言爱心代码空心,c语言心形图案代码,是什么?
  5. 详解微软 ALUM:当语言模型遇到对抗训练
  6. 如何使用Java代码将GBK编码格式的工程转换为UTF-8编码格式的工程
  7. 初中计算机教案ps,第三课 利用Adobe Photoshop工具处理图片
  8. Windows下运行linux桌面程序
  9. java list 某个重复列_Java 开发的编程噩梦,这些坑你没踩过算我输
  10. 自动控制原理 卢京潮第二版 课后答案 免费PDF
  11. AUTOCAD——形位公差如何标注、CAD打断于点的操作
  12. oeasy教您玩转vim - 005 - # 程序本质
  13. 神舟战神k550d i7d2笔记本u盘启动的方法
  14. wps怎么写分段函数_“在Excel中怎么设置分段函数?(有5个分段)“excel折线图颜色...
  15. 嗅探器c语言源码,C语言嗅探器带报告
  16. 软件自动化测试框架STAF概述
  17. iPhoneX APP界面设计尺寸图-庞姿姿
  18. SQL零基础入门学习(八)
  19. 更安全的ftp服务器Pure-FTP搭建(4)
  20. [DonkeyCar][树莓派]基础01 - 首次配置 - WIFI

热门文章

  1. mysql 常用函数总计
  2. 自己动手一步步安装Linux系统
  3. oracle HWM
  4. ORACLE 随机数 dbms_random
  5. 深圳dotnet俱乐部2006年1月7日WebPart交流活动
  6. python基础--导入模块
  7. Swift 扩展 Storyboard 属性
  8. IE11 0x2ee4 bug 以及类似问题解决方法
  9. zookeeper安装和基本操作
  10. String.getBytes()方法中的中文编码问题(转)