QtCreator TODOプラグイン。 継続

Todoプラグイン

しばらく前に、現在開いているドキュメント内のすべてのTODO、FIXMEなどのコメントのリストを表示する開発したプラグインについて書きました。 昨日、このプラグインの新しいバージョンをリリースしましたが、これは非常に多くの変更であることが判明しました。主なものは次のとおりです。

開発中に、私は他のプラグイン開発者に役立つかもしれないいくつかの興味深いことを掘り下げることができました。

設定


設定

最初にやらなければならないことは、QtCreator設定で独自のタブを作成する方法を学習することでした。これは非常に簡単に思えたので、 Core :: IOptionsPageインターフェイスから継承する新しいクラスを追加するだけで、宣言は次のようになります:
class SettingsPage : public Core::IOptionsPage { Q_OBJECT public: SettingsPage(KeywordsList keywords = KeywordsList(), int projectOptions = 0, int paneOptions = 0, QObject *parent = 0); ~SettingsPage(); QString id() const; //    QString trName() const; //    (   ) QString category() const; //        QString trCategory() const; //    (   ) QString displayName() const; //    QIcon categoryIcon() const; //   QString displayCategory() const; //    QWidget *createPage(QWidget *parent); //      void apply(); //       "Apply"  "OK" void finish(); //        - "OK"  "Cancel" public slots: void settingsChanged(); private: SettingsDialog *dialog; //   bool settingsStatus; //  ? int projectOptions; //   int paneOptions; //   KeywordsList keywords; //    }; 

デザイナーで作成したタブウィジェットは、標準のQlistWidget、いくつかのQRadioButton、およびボタンの束(画像を参照)で複雑なものではありません。
ここで重要なのはapply()メソッドで、設定が保存されるのはその中にあります。

次のようになります。
 void SettingsPage::apply() { if (settingsStatus) { QSettings *settings = Core::ICore::instance()->settings(); //      settings->beginGroup("TODOPlugin"); //    projectOptions = dialog->currentFileRadioButtonEnabled() ? 0 : 1; //     paneOptions = dialog->todoOutputRadioButtonEnabled() ? 0 : 1; keywords = dialog->keywordsList(); settings->setValue("project_options", projectOptions); //   settings->setValue("pane_options", paneOptions); settings->setValue("keywords", qVariantFromValue(keywords)); settings->endGroup(); settings->sync(); //   (   ) QMessageBox::information(dialog, tr("Information"), tr("The TODO plugin settings change will take effect after a restart of Qt Creator.")); //           settingsStatus = false; } } 

一般に、複雑なことは何もありません。独自のデータ型をQVariantに転送するには、それらの演算子を定義する必要があることを思い出してください:<<および>>、およびそれらをMOCに登録します。

ビルドの問題ウィンドウ


タスクウィンドウ

厳密に言えば、これはTaskWindowと呼ばれ、あらゆるメッセージの標準出力として機能します。 先ほど書いたQt Developer Networkコミュニティの人々の強いアドバイスに基づいて、このウィンドウにメッセージを表示する機能を追加することにしました。 このウィンドウには次のようにアクセスできます。次のヘッダーをプロジェクトに接続する必要があります。
 #include <projectexplorer/taskwindow.h> 

そして、ウィンドウへのポインタを取得します。
 taskWindow = pluginManager->getObject<ProjectExplorer::TaskWindow>(); 

それだけです この方法は次のとおりです。
 void addCategory(const QString &categoryId, const QString &displayName); void addTask(const Task &task); void removeTask(const Task &task); void clearTasks(const QString &categoryId = QString()); 


投稿を正確に識別するにはカテゴリが必要です。
タスクの構造は単純で、次のようになります。
 struct PROJECTEXPLORER_EXPORT Task { enum TaskType { Unknown, Error, Warning }; Task() : type(Unknown), line(-1) { } Task(TaskType type_, const QString &description_, const QString &file_, int line_, const QString &category_) : type(type_), description(description_), file(file_), line(line_), category(category_) { } Task(const Task &source) : type(source.type), description(source.description), file(source.file), line(source.line), category(source.category), formats(source.formats) { } ~Task() { } TaskType type; QString description; QString file; int line; QString category; QList<QTextLayout::FormatRange> formats; }; 

重要:仕様では、ProjectExplorerへのプラグインの依存関係を示す必要があります

プログレスバー


プログレスバー プログレスバーを実装するには、少し手間がかかりました。 スキャンがプロジェクトの残りの読み込みを遅くしないように、別のストリームに配置しました。
  QFuture<void> result = QtConcurrent::run(&TodoPlugin::readCurrentProject, this); 

結局のところ、この最愛の灰緑色の進歩は、別のストリームで動作するように特別に調整されました。

これを使用するには、次のヘッダーを追加する必要があります。
 #include <coreplugin/progressmanager/progressmanager.h> #include <qtconcurrent/runextensions.h> 

新しいプログレスバーの追加は次のように行われます。
  Core::ICore::instance()->progressManager()->addTask(result, tr("Todoscan"), "Todo.Plugin.Scanning"); 

作業は既にスキャンストリームから行われています。このメソッドは次のとおりです。
 void TodoPlugin::readCurrentProject(QFutureInterface<void> &future, TodoPlugin *instance) { QStringList filesList = instance->currentProject->files(ProjectExplorer::Project::ExcludeGeneratedFiles); //    future.setProgressRange(0, filesList.count()-1); //    for (int i = 0; i < filesList.count(); ++i) { instance->readFile(filesList.at(i)); //    future.setProgressValue(i); //    } // SKIPPED } 

あなたが求める魔法は何ですか? 関数ヘッダーとその呼び出しで、2つのパラメーターがヘッダーで宣言され、2番目のパラメーターのみが呼び出しで渡され、最初のパラメーターは省略されることに注意してください。 最初のパラメーターは、2番目の必須ヘッダー(qtconcurrent / runextensions.h)のコードに置き換えられます。 それがすべての魔法です。

おわりに


これですべてです。 ここからプラグインダウンロードできます。BSDライセンスの下で配布されています-健康の実験。 さらに、Windowsではテストされていなかったため、テストがないため、テストとバグレポートに感謝します。

Source: https://habr.com/ru/post/J105085/


All Articles