Python PyQt5中带有可单击文本的QPlainTextEdit小部件

Python PyQt5中带有可单击文本的QPlainTextEdit小部件,python,qt,pyqt,pyqt5,Python,Qt,Pyqt,Pyqt5,我试图在PyQt5中构建一个简单的代码/文本编辑器。我想到了代码编辑器的三个重要功能: (1) 语法突出显示 (2) 代码完成 (3) 可点击的函数和变量 我计划将代码编辑器建立在QPlainTextEdit小部件上。对于语法突出显示,我将使用QSyntaxHighlighter: 我还没有弄明白如何完成代码,但稍后会担心这个特性。现在最重要的是“可点击的函数和变量”。在成熟的代码编辑器中,可以单击函数调用并跳转到该函数的定义。变量也是如此。 我知道,问“我如何实现这个特性?”太宽泛了。因

我试图在PyQt5中构建一个简单的代码/文本编辑器。我想到了代码编辑器的三个重要功能:
(1) 语法突出显示
(2) 代码完成
(3) 可点击的函数和变量

我计划将代码编辑器建立在
QPlainTextEdit
小部件上。对于语法突出显示,我将使用
QSyntaxHighlighter


我还没有弄明白如何完成代码,但稍后会担心这个特性。现在最重要的是“可点击的函数和变量”。在成熟的代码编辑器中,可以单击函数调用并跳转到该函数的定义。变量也是如此。

我知道,问“我如何实现这个特性?”太宽泛了。因此,让我们把范围缩小到以下问题:
如何使某个单词在
QPlainTextEdit
小部件中可单击?单击单词时,应调用任意Python函数。Python函数还应该知道单击哪个词来采取适当的操作。当鼠标悬停在单词上方时,使其亮起蓝色是一个不错的奖励。

我编写了一个小的测试代码,所以你有一个QT窗口,上面有一个“代码> QPrimeTeTdIs< /Cult>小部件,用来播放:

代码如下:

import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

##################################################
#   'testText' is a snippet of C-code that       #
#   will get displayed in the text editor.       #
##################################################
testText = '\
# include <stdio.h>\n\
# include <stdbool.h>\n\
# include <stdint.h>\n\
# include "../FreeRTOS/Kernel/kernel.h"\n\
\n\
int main(void)\n\
{\n\
    /* Reset all peripherals*/\n\
    HAL_Init();\n\
\n\
    /* Configure the system clock */\n\
    SystemClock_Config();\n\
\n\
    /* Initialize all configured peripherals */\n\
    MX_GPIO_Init();\n\
    MX_SPI1_Init();\n\
    MX_SPI2_Init();\n\
    MX_SPI3_Init();\n\
}\n\
'

##################################################
#   A simple text editor                         #
#                                                #
##################################################
class MyMainWindow(QMainWindow):
    def __init__(self):
        super(MyMainWindow, self).__init__()
        # Define the geometry of the main window
        self.setGeometry(200, 200, 800, 800)
        self.setWindowTitle("text editor test")

        # Create center frame
        self.centerFrm = QFrame(self)
        self.centerFrm.setStyleSheet("QWidget { background-color: #ddeeff; }")
        self.centerLyt = QVBoxLayout()
        self.centerFrm.setLayout(self.centerLyt)
        self.setCentralWidget(self.centerFrm)

        # Create QTextEdit
        self.myTextEdit = QPlainTextEdit()
        self.myTextEdit.setPlainText(testText)
        self.myTextEdit.setStyleSheet("QPlainTextEdit { background-color: #ffffff; }")
        self.myTextEdit.setMinimumHeight(500)
        self.myTextEdit.setMaximumHeight(500)
        self.myTextEdit.setMinimumWidth(700)
        self.myTextEdit.setMaximumWidth(700)

        self.centerLyt.addWidget(self.myTextEdit)
        self.show()


if __name__== '__main__':
    app = QApplication(sys.argv)
    QApplication.setStyle(QStyleFactory.create('Fusion'))
    myGUI = MyMainWindow()
    app.exec_()
    del app
    sys.exit()
导入系统 导入操作系统 从PyQt5.QtWidgets导入* 从PyQt5.QtGui导入* 从PyQt5.QtCore导入* ################################################## #“testText”是一段# #将显示在文本编辑器中# ################################################## testText=\ #包括\n\ #包括\n\ #包括\n\ #包括“./FreeRTOS/Kernel/Kernel.h”\n\ \n\ int main(无效)\n\ {\n\ /*重置所有外围设备*/\n\ HAL_Init();\n\ \n\ /*配置系统时钟*/\n\ SystemClock_Config();\n\ \n\ /*初始化所有配置的外围设备*/\n\ MX_GPIO_Init();\n\ MX_SPI1_Init();\n\ MX_SPI2_Init();\n\ MX_SPI3_Init();\n\ }\n\ ' ################################################## #一个简单的文本编辑器# # # ################################################## 类MyMainWindow(QMainWindow): 定义初始化(自): 超级(MyMainWindow,self)。\uu初始化 #定义主窗口的几何图形 self.setGeometry(200200800800) self.setWindowTitle(“文本编辑器测试”) #创建中心框架 self.centerFrm=QFrame(self) self.centerFrm.setStyleSheet(“QWidget{背景色:#ddeeff;}”) self.centerLyt=QVBoxLayout() self.centerFrm.setLayout(self.centerLyt) self.setCentralWidget(self.centerFrm) #创建QTextEdit self.myTextEdit=QPlainTextEdit() self.myTextEdit.setPlainText(testText) self.myTextEdit.setStyleSheet(“QPlainTextEdit{背景色:#ffffff;}”) self.myTextEdit.setMinimumHeight(500) self.myTextEdit.setMaximumHeight(500) self.myTextEdit.setMinimumWidth(700) self.myTextEdit.setMaximumWidth(700) self.centerLyt.addWidget(self.mytexEdit) self.show() 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) QApplication.setStyle(QStyleFactory.create('Fusion')) myGUI=MyMainWindow() app.exec() 戴尔应用程序 sys.exit()
编辑
过了很长时间,我才重新考虑这个问题。同时,我还建立了一个关于QSCINTILA的网站:

您可以在那里找到所有信息:-)

也许您可以利用。看起来它能满足你的需要。如果你不能使用它,那么也许你可以看看源代码,看看它们是如何实现不同的功能的,比如可点击文本。

使用:它内置了对大部分(如果不是全部的话)你想要的功能的支持。我试过QSCINTILA。我不知怎的让语法高亮显示工作起来了。但是QSCINTILA的Python端口的文档几乎不存在,或者说非常差。你知道一个很好的教程@ekhumoro吗?不,我只是用官方文件加上自己的文件。我相信谷歌搜索一下会给你提供一些基本的例子,肯定还有一些东西。非常感谢@ekhumoro。如何在QSCINTILA中实现可点击单词?我一直在谷歌上搜索,但找不到。