QScintilla:ますます深く

こんにちは



私はほとんど忘れていました。 サイクルの最初2番目の記事。



新しい記事で、これもまた私です。 今日は、qscintillaを最大限に活用する方法を説明します。 具体的には、QsciScintillaのコピーを使用するのではなく、クラスで継承して、エディター用のある種のオートコンプリートコードを作成する方法を説明するのに役立つ理由を示します。



この記事は小さいとすぐに言わなければなりませんが、まだ開発が不十分なWeb開発IDE Galacticaプロジェクトの例で、このすべてのゴミをどのように扱うかを示します。



2番目のものから始めましょう。 何をしたいですか? テキストをオートコンプリートするエディターを作成します。 そして、明らかに、これに最適なオプションはCtrl +スペースです。 しかし、ここではファイルが待っています-切望されたバインドの後、NULLシンボルがエディターに挿入されます。 私にとって明らかな解決策は、QsciScintillaを継承し、keyPressEvent()をオーバーライドすることです。



keyPressEvent()をリストします:

void MainEditor::keyPressEvent(QKeyEvent *e) { if((e->modifiers() == Qt::CTRL) && (e->key() == Qt::Key_Space)) { // Ctrl+<Space> autoCompleteFromAll(); return; //    NULL } //... QsciScintilla::keyPressEvent(e); }
      
      







素晴らしい。 Ctrl + Spaceを押すと、テキストをオートコンプリートと呼びます。これで終わりです。 次に、コンストラクターのリストをリストします。

 MainEditor::MainEditor(QWidget *parent) : QsciScintilla(parent), lexerHTML(new QsciLexerHTML) { //! To accept cyrillics setUtf8(true); setLexer(lexerHTML); //    HTML, PHP //... //! Autocompleting setAutoCompletionSource(QsciScintilla::AcsAll); //     setAutoCompletionCaseSensitivity(true); //     setAutoCompletionReplaceWord(true); //     ( ) setAutoCompletionUseSingle(AcusExplicit); //     ,    setAutoCompletionThreshold(1); //   1   //... }
      
      







これにより、HTMLおよびPHPのオートコンプリートが提供されます。 はい、はい? すべてが本当にシンプルです。 しかし、面白くない。 さて、レクサーのオートコンプリートをセットアップできれば...しかし、それは難しくありません:

 MyLexer::MyLexer(QObject *parent) : QsciLexerCustom(parent) { //... //   QsciAPIs *api = new QsciAPIs(this); //     foreach(const QString &word, listWithKeywords) { //     api->add(word); //    } api->prepare(); //  setAPIs(api); }
      
      







そして、ここで一時停止したいと思います。 ここでは、現在のAPIからAPIオブジェクトを作成し、リストの単語で補完します。 リストのコードはリストしません。 次に、新しいAPIをセットアップします。



実際には、たとえばコードを分析し、作成中に補足するために、これらすべてを非常に強力に補足する必要があります。 たとえば、新しい変数で補足します。 つまり AST(Abstract Syntax Tree)の変数を使用してUserListを追加します。 しかし、これは実際にのみです)。



IDEエディターは次のようになります。







ところで、ここに彼女のリポジトリがあります



これで、QScintillaの記事シリーズは終わりです。 記事が弱い場合は、事前に謝罪します。 それはただ私が欲しかったが、話す時間がないということです。



ご清聴ありがとうございました。



All Articles