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

news2024/11/28 6:54:43

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_OBJECT

public:
    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.coloradmin.cn/o/2060400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

写给大数据开发:如何优化临时数据查询流程

你是否曾因为频繁的临时数据查询请求而感到烦恼&#xff1f;这些看似简单的任务是否正在蚕食你的宝贵时间&#xff0c;影响你的主要工作&#xff1f;如果是&#xff0c;那么这篇文章正是为你而写。 目录 引言&#xff1a;数据开发者的困境问题剖析&#xff1a;临时数据查询的…

MKS电源GMW-25RF Plasma Generator手侧

MKS电源GMW-25RF Plasma Generator手侧

C语言基础(八)

1、标准库函数&#xff1a; 测试代码1&#xff1a; #include <stdio.h> // 标准库函数头文件导入 // 自定义函数 int add(int a, int b) { return a b; } // 声明回调函数类型 typedef void (*Callback)(int); // 调用回调函数的函数 void process(Callb…

网络编程第三天

服务器&#xff1a; #include<sys/types.h> // 支持套接字地址结构 #include <sys/socket.h> // 提供套接字API #include <netinet/in.h> // 定义IP地址结构体 #include <string.h> // 提供字符串操作函数 #include <stdio.h> // 提供标准I/O操…

宠物空气净化器哪款能吸毛?希喂、米家宠物空气净化器测评分享

养猫最令人困扰的&#xff0c;就是掉毛与难以彻底消除的异味&#xff0c;这两个问题就成了养猫生活中的一大挑战。每当换季或是猫咪自我梳理时&#xff0c;家中便被一层细腻的绒毛覆盖&#xff0c;从地板到沙发&#xff0c;从床单到衣物&#xff0c;甚至是空气中都漂浮着细小的…

Dockerfile中CMD和ENTRYPOINT区别以及结合使用

1. 简述 在Dockerfile中,CMD和ENTRYPOINT都是用于指定容器启动时要运行的命令,但它们在使用方式和目的上有所不同。 下面将分别解释这两个指令的含义,并通过示例说明它们之间的区别,以及常见的结合使用案例。 Dockerfile制作镜像流程图: 2. CMD CMD指令用于指定容器启…

RocketMQ环境搭建(宝塔)

文章目录 1.介绍2.RocketMQ介绍1.官网2.基础概念3.组件架构 3.安装1.安装宝塔面板1.更新系统2.安装宝塔面板3.开放33142端口 2.创建存放软件的文件夹3.将软件上传到soft目录下4.安装unzip5.进入目录解压软件6.进入bin目录7.修改两个sh文件配置内存小一点8.在/usr/local/soft/ro…

Maven-08.依赖管理-生命周期

一.生命周期 Maven中的生命周期就是描述一次maven项目构建要经历那些阶段。包含clean&#xff0c;default和site三个。这三个生命周期时相互独立的。所谓相互独立&#xff0c;就是每套生命周期中的阶段互不干扰。 阶段是生命周期中最细化的操作。我们重点关注5个阶段&#xf…

教你学习企业高性能web服务器-nginx

一、web服务介绍 1、Apache的三种模型 &#xff08;1&#xff09;Apache prefork 预派生模式&#xff0c;有一个主控制进程&#xff0c;然后生成多个子进程&#xff0c;使用select模型&#xff0c;最大并发1024每个子进程有一个独立的线程响应用户请求相对比较占用内存&…

笔记(day24)正则表达式

一、正则表达式 1.1 概述 正则表达式定义了字符串的匹配模式,可以用来进行搜索,编辑,或处理文本 并不仅限于某一种语言,但是在每种语言中有细微的差别 1 数据校验、格式校验 2 数据提取 1.2 语法 元字符描述\将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如&a…

专题---自底向上的计算机网络(数据链路层)

目录 计算机网络概述 物理层 数据链路层 网络层 传输层 应用层 网络安全

pinctl 和 gpio子系统驱动

一.设备树中添加pinctl节点模板 1.创建对应的节点 同一个外设的 PIN 都放到一个节点里面&#xff0c;打开 imx6ull-14x14-evk.dts&#xff0c;在 iomuxc 节点 中的“imx6ul-evk”子节点下添加 “pinctrl_test” 节点。添加完成以后如下所示&#xff1a; pinctrl_test:test_g…

8.21Qt作业

运用网络通信&#xff0c;实现简单聊天室 客户端主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui-&g…

Postman之Newman命令以及常用参数

Newman介绍 Postman是专为接口测试而生&#xff0c;而Newman是专为Postman而生。因为服务器一般都是Linux系统&#xff0c;而前文提到的操作都离不开Postman的客户端&#xff0c;为解决这个问题&#xff0c;谷歌公司引入了 Newman工具。Newman是Postman的命令行&#xff0c;是…

STM32——I2C通信外设

软件只需要CR控制寄存器&#xff0c;DR数据寄存器&#xff0c;为实时监控状态&#xff0c;软件需要读取SR状态寄存器&#xff0c;好比&#xff1a;开车时CR是控制汽车方向&#xff0c;踩油门等&#xff0c;SR是仪表盘。 由于I2C是半双工&#xff0c;因此发送和接收数据都是在移…

又一家光伏企业终止,行业产能过剩竞争激烈,毛利率极低

一道新能终止原因如下&#xff1a;首先&#xff0c;一道新能从事光伏单晶电池和单晶组件业务&#xff0c;该行业竞争激烈&#xff0c;目前已经出现了产能过剩&#xff0c;甚至负毛利率的情况&#xff1b;其次&#xff0c;报告期内&#xff0c;一道新能营收高达227亿&#xff0c…

DC-DC 转换器中的压电谐振器:当前状态和限制

在小体积和高频下提高功率密度并减小电感器和变压器的尺寸是DC-DC转换器设计中的一大挑战。为了克服这些困难&#xff0c;压电谐振器&#xff08;PR&#xff09;通过利用潜在的压电效应&#xff0c;以振动模式而不是电模式存储能量。 即使 PR 的使用在效率和功率密度方面改进了…

关于开源许可协议

开源许可协议 引用开源代码之后是否可以保留知识产权&#xff0c;针对不同的开源协议要进行开源扫描。基于BSD、MIT和Apache三种是可以闭源。但是基于GPL、LGPL和Mozilla的开源方案必须同步开源。

2024年接口测试高频面试题及答案

1. 什么是接口测试&#xff1f; •接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求 •测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系 2. 为什么要做接口…

【大模型从入门到精通32】开源库框架LangChain RAG 系统中的问答技术2

这里写目录标题 探索高级问答链类型MapReduce 和 Refine 技术 实用建议和最佳实践解决 RetrievalQA 限制结论进一步阅读和探索理论问题实践问题 探索高级问答链类型 MapReduce 和 Refine 技术 MapReduce 和 Refine 是设计用来规避由语言模型 (LM) 上下文窗口大小所导致的限制…