【问题标题】:QPlainTextEdit widget in PyQt5 with clickable textPyQt5 中的 QPlainTextEdit 小部件,带有可点击的文本
【发布时间】:2017-02-10 13:13:08
【问题描述】:

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

我计划将代码编辑器基于QPlainTextEdit 小部件。对于语法高亮,我将使用QSyntaxHighlighter:
https://doc.qt.io/qt-5/qsyntaxhighlighter.html#details
我还没有弄清楚如何进行代码完成,但稍后会担心这个功能。现在最引人注目的是“可点击的函数和变量”。在成熟的代码编辑器中,可以单击函数调用并跳转到该函数的定义。变量也是如此。

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

我写了一个小的测试代码,所以你有一个 Qt 窗口,中间有一个 QPlainTextEdit 小部件可以玩:

代码如下:

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()

编辑
很长一段时间后,我才重新审视了这个问题。同时,我建立了一个关于 QScintilla 的网站:https://qscintilla.com
你可以在那里找到所有信息:-)

【问题讨论】:

  • 使用QScintilla:它内置了对您想要的大部分(如果不是全部)的支持。
  • 我试过 QScintilla。我以某种方式使语法突出显示工作。但是 QScintilla 的 Python 端口的文档几乎不存在,或者至少可以说很差。你知道一个好的教程@ekhumoro 吗?
  • 不,我只使用官方文档以及Scintilla 本身的文档。我敢肯定,稍微用谷歌搜索一下就能得到一些基本的例子,而且一定有一些关于 SO 的东西。
  • 非常感谢@ekhumoro。你如何在 QScintilla 中实现一个可点击的单词?我一直在谷歌上搜索,但找不到。

标签: python qt pyqt pyqt5


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2021-06-09
    • 2011-02-14
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多