PyQt5で簡単なコード/テキストエディタを構築しようとしています。コード・エディタの三つの重要な機能の私の頭に浮かぶ:
(1)構文
(2)コード補完をハイライト表示(3)クリッカブル関数と変数
私がベースに計画コードエディタはQPlainTextEdit
ウィジェットにあります。構文の強調表示については、QSyntaxHighlighter
を使用します:
コード補完の方法はまだわかりませんが、後でその機能について心配しています。今すぐshowstopperは「クリック可能な関数と変数」です。成熟したコードエディタでは、関数呼び出しをクリックして、その関数の定義にジャンプすることができます。変数についても同様です。
「この機能を実装するにはどうすればよいですか?あまりにも広いです。それでは、次の問題に絞りましょう:
QPlainTextEdit
ウィジェットで特定の単語をクリックできるようにするにはどうすればよいですか?単語がクリックされると、任意のPython関数が呼び出されます。そのPython関数は、適切なアクションをとるためにどの単語がクリックされたかを知る必要があります。マウスの上にマウスを置くと、単語が明るくなり、素晴らしいボーナスになります。
あなたと遊ぶために途中でQPlainTextEdit
ウィジェットとQtのウィンドウを持っているので、私は、小さなテスト・コードを書かれている:ここで QPlainTextEditクリック可能なテキスト付きPyQt5のウィジェット
は、コードは次のとおりです。
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()
EDIT
私はこの質問を長年にわたって再訪しました。あなたはたぶん、あなたはqutepartを利用することができ
[QScintilla](http://pyqt.sourceforge.net/Docs/QScintilla2/)を使用してください。すべてではないにしても、ほとんどのものをサポートしています。 – ekhumoro
QScintillaを試しました。私は何とか構文の強調表示が働いています。しかし、QScintillaのPythonポートのドキュメンテーションは、ほとんど存在しないか、言い表すのが非常に貧弱です。あなたは良いチュートリアルをよく知っていますか? –
いいえ、私は公式ドキュメントと[Scintilla](http://www.scintilla.org/ScintillaDoc.html)自体のものを使用しています。私はちょっとグーグルがあなたにいくつかの基本的な例を得るだろうと確信しています、そしてSOにいくつかのことがあるでしょう。 – ekhumoro