pythonqt项目_Qt项目之高亮关键字Python编辑器实现
之前大部分内容在写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编辑器实现相关推荐
- python在线编辑器-在线python编辑器
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. windows下python的ide选择:http:blog.csdn. ...
- 在线python编辑器-在线python编辑器
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. windows下python的ide选择:http:blog.csdn. ...
- python 哪些项目_一份2018年Python开源项目Top100清单!
2018 年的最后一天,营长为大家新鲜出炉了一份 2018 年 Python 开源项目 Top100 清单!这些项目都是营长每月通过收集 Mybridge 的数据整理而来的,是不是很棒!(我要在留言区 ...
- 算法(Python版)|156Kstars|神级项目-(1)The Algorithms - Python简介
文章目录 算法(Python版) 项目地址 项目概况 说明 参与入门 社区频道 算法列表 Arithmetic Analysis 算术分析 Audio Filters 音频过滤器 Backtracki ...
- python运行一个项目_Django 项目创建到启动(最全最详细的第一个项目)
一.前言 (一).概述 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架 ...
- 项目介绍star原理_这个 Python 项目厉害了!多个实战案例教你分析时空数据处理...
大数据时代到来,随着数据的逐步开放,数据工作者们或多或少都要接触到时空数据.在处理时空数据的时候,你不仅要数据处理,还需要会GIS,最重要的它是一门艺术,要用你的审美,要出很好看的可视化图! 以前,我 ...
- Python网站导航项目-2.项目创建与环境配置
每每用到别人的导航网站会充斥的各种的广告,以及很多无用的内容,用起来真的很烦人.把内容网址收藏到浏览器中又很不方便,因此基于git的前端代码结合Django Web开发自制一套简易的导航网站项目. 项 ...
- Python个人主页项目-2.项目创建与环境配置
学习Python已经6年有余,从事的行业数据分析师,算法工程师.爬虫工程师.目前准备正式入行全栈,先做一个个人的博客系统,用来记录日常工作的每一天,也是为自己做一个展示自己的空间. 同时也为大家提供一 ...
- 项目场景: 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 ...
- Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)—从而实现Python编程图文教程之详细攻略
Python的IDE:基于Eclipse/MyEclipse软件的PyDev插件配置python的开发环境(不同python项目加载不同版本的python)-从而实现Python编程图文教程之详细攻略 ...
最新文章
- 3. std::string::size_type
- captcha.js一个生成验证码的插件,使用js和canvas生成
- Ubuntu的中文是哪种字体?python的词云分析和 三国演义人物出场统计
- c语言爱心代码空心,c语言心形图案代码,是什么?
- 详解微软 ALUM:当语言模型遇到对抗训练
- 如何使用Java代码将GBK编码格式的工程转换为UTF-8编码格式的工程
- 初中计算机教案ps,第三课 利用Adobe Photoshop工具处理图片
- Windows下运行linux桌面程序
- java list 某个重复列_Java 开发的编程噩梦,这些坑你没踩过算我输
- 自动控制原理 卢京潮第二版 课后答案 免费PDF
- AUTOCAD——形位公差如何标注、CAD打断于点的操作
- oeasy教您玩转vim - 005 - # 程序本质
- 神舟战神k550d i7d2笔记本u盘启动的方法
- wps怎么写分段函数_“在Excel中怎么设置分段函数?(有5个分段)“excel折线图颜色...
- 嗅探器c语言源码,C语言嗅探器带报告
- 软件自动化测试框架STAF概述
- iPhoneX APP界面设计尺寸图-庞姿姿
- SQL零基础入门学习(八)
- 更安全的ftp服务器Pure-FTP搭建(4)
- [DonkeyCar][树莓派]基础01 - 首次配置 - WIFI