《QT从基础到进阶·七十三》Qt+C++开发一个python编译器,能够编写,运行python程序

server/2024/10/18 7:48:38/

1、概述
源码放在文章末尾

该项目利用Qt+C++实现了一个简易的python编译器,类似pycharm或vsCode这样的编译器,该python编译器支持如下功能:
(1)支持编写python程序
(2)编写代码时有代码补全提示
(3)程序运行到每行时该行高亮显示
(4)可以加载python脚本执行
(5)可以在程序运行的过程中随时中断
(6)有输出窗口实时显示程序执行的状态或执行程序的打印显示等
(7)支持在界面上打断点调试,该条在开发中…

下图为Python编译器的demo演示图:
在这里插入图片描述

项目分析:
(1)支持编写python程序

class CodeEditor : public QPlainTextEdit
{Q_OBJECTpublic:CodeEditor(QWidget *parent = 0);~CodeEditor();//行号和断点绘制void lineNumberAreaPaintEvent(QPaintEvent *event);//获取行号区域宽度int lineNumberAreaWidth();//获取位置编号int getBlockNumberAtPosition(const QPoint& pos);//触发断点void toggleBreakpoint(int blockNumber);

这里通过继承QPlainTextEdit类的形式来实现在QPlainTextEdit界面上编写python脚本的功能。在界面执行run的功能时会通过信号槽的形式获取QPlainTextEdit界面上的内容并传入PyRun_SimpleString函数中执行。

(2)补全提示
在这里插入图片描述
补全提示的功能直接调用python的jedi库,所有通过pip安装的python库都能够通过jedi的库的补全功能提示出来,非常方便,如果要使用该功能需要在本地电脑安装:pip install jedi

(3)高亮显示
程序运行到每一行时都会高亮显示,或鼠标放在某一行也会高亮显示。

void ShowLine(int line)
{QMetaObject::invokeMethod(g_pSmartPython, [=]() {QTextCursor tc = g_pScriptPlainTextEdit->textCursor();int position = g_pScriptPlainTextEdit->document()->findBlockByNumber(line - 1).position();tc.setPosition(position, QTextCursor::MoveAnchor);g_pScriptPlainTextEdit->setTextCursor(tc);QList<QTextEdit::ExtraSelection> extraSelections;QTextEdit::ExtraSelection selection;QColor lineColor = QColor(220, 220, 220);selection.format.setBackground(lineColor);selection.format.setProperty(QTextFormat::FullWidthSelection, true);selection.cursor = g_pScriptPlainTextEdit->textCursor();selection.cursor.clearSelection();extraSelections.append(selection);g_pScriptPlainTextEdit->setExtraSelections(extraSelections);}, Qt::BlockingQueuedConnection);

执行每一行时都会触发ShowLine回调函数,内部获取行号并进行颜色标注该行实现高亮显示。

(4)加载python脚本
在这里插入图片描述
(5)随时中断运行的程序
在这里插入图片描述
(6)当程序运行过程中点击stop会触发

int MyTrace(PyObject* obj, PyFrameObject* frame, int what, PyObject* arg)
{if (g_isExection)return 0;if (g_isAbort){if (!m_isInterrupt){qDebug() << "User abort.";//PyErr_SetString(PyExc_KeyboardInterrupt, "User abort.");if (scriptThreadState){PyGILState_STATE gstate = PyGILState_Ensure();PyThreadState_SetAsyncExc((unsigned long)scriptThreadState->thread_id, PyExc_KeyboardInterrupt);PyGILState_Release(gstate);}m_isInterrupt = true;

在程序运行过程中会一直调用MyTrace函数追踪状态,当点击stop会执行PyThreadState_SetAsyncExc((unsigned long)scriptThreadState->thread_id, PyExc_KeyboardInterrupt);
该程序会强制中断python程序。

(7)断点调试程序
目前已经实现了在界面上打断点,效果如下:
在这里插入图片描述
断点单步调试功能还在开发中…

源码下载


http://www.ppmy.cn/server/103956.html

相关文章

鸿蒙Harmony开发实战—ArkTS语句

语句 If语句 if语句用于需要根据逻辑条件执行不同语句的场景。当逻辑条件为真时&#xff0c;执行对应的一组语句&#xff0c;否则执行另一组语句&#xff08;如果有的话&#xff09;。 else部分也可能包含if语句。 if语句如下所示&#xff1a; if (condition1) {// 语句1 }…

裸金属服务器和裸金属云服务器:区别、优势与选择

裸金属服务器和裸金属云服务器的区别、优势与选择的分析&#xff1a; 一、区别 1. 资源独占性 - 裸金属服务器&#xff1a;提供完全独立、专属的物理服务器资源&#xff0c;不存在任何资源共享&#xff0c;确保每个用户对硬件资源的绝对占有。 - 裸金属云服务器&#xff1a;尽…

如何选择需求跟踪管理软件?8款优质推荐

本文将介绍8款需求跟踪管理软件&#xff1a;PingCode、Worktile、得帆、协作云、火山引擎、Jira、VersionOne、YouTrack。 在面对众多需求跟踪管理软件时&#xff0c;每款软件都声称能提升效率、简化流程&#xff0c;但到底哪一款才真正适合你的团队&#xff1f;为了选择合适的…

Conditional Flow Matching: Simulation-Free Dynamic Optimal Transport论文阅读笔记

Conditional Flow Matching: Simulation-Free Dynamic Optimal Transport笔记 发现问题 连续正规化流&#xff08;CNF&#xff09;是一种有吸引力的生成式建模技术&#xff0c;但在基于模拟的最大似然训练中受到了限制。 解决问题 介绍一种新的条件流匹配&#xff08;CFM)&…

【网络】HTTPS——HTTP的安全版本

1.HTTP的问题 1、使用明文通信 HTTP协议不具备给通讯内容加密的功能&#xff0c;所有使用HTTP协议通信的请求和响应的内容无法进行加密,都是使用明文发送。由于HTTP属于TCP/IP协议族的协议&#xff0c;按照TCP/IP协议族的通讯机制&#xff0c;HTTP在整个通讯线路上都存在被窃听…

LabVIEW锅炉燃烧远程监控系统

随着信息技术的发展&#xff0c;远程监控技术已经广泛应用于各种工业过程。开发了一个基于LabVIEW和互联网技术的锅炉燃烧远程监控系统&#xff0c;该系统不仅提高了锅炉运行的安全性和效率&#xff0c;还具备了故障远程诊断的功能&#xff0c;为锅炉管理提供了一种全新的解决方…

【机器学习】小样本学习的实战技巧:如何在数据稀缺中取得突破

我的主页&#xff1a;2的n次方_ 在机器学习领域&#xff0c;充足的标注数据通常是构建高性能模型的基础。然而&#xff0c;在许多实际应用中&#xff0c;数据稀缺的问题普遍存在&#xff0c;如医疗影像分析、药物研发、少见语言处理等领域。小样本学习&#xff08;Few-Shot Le…

碰撞检测 | 基于ROS Rviz插件的多边形碰撞检测仿真平台

目录 0 专栏介绍1 基于多边形的碰撞检测2 碰撞检测仿真平台搭建2.1 多边形实例2.2 外部服务接口2.3 Rviz插件化 3 案例演示3.1 功能介绍3.2 绘制多边形 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战…