私はほとんど忘れていました。 サイクルの最初と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の記事シリーズは終わりです。 記事が弱い場合は、事前に謝罪します。 それはただ私が欲しかったが、話す時間がないということです。
ご清聴ありがとうございました。