しばらく前に、現在開いているドキュメント内のすべてのTODO、FIXMEなどのコメントのリストを表示する開発した
プラグインについて
書きました。 昨日、このプラグインの新しいバージョンをリリースしましたが、これは非常に多くの変更であることが判明しました。主なものは次のとおりです。 
      
        
        
        
      
    -  設定が登場しました 
 -  これで、検索キーワードを追加し、出力の色とアイコンを設定できます。 
 -  情報を表示する場所は、標準の[ビルドの問題]ウィンドウまたは別の[TODO出力]で選択できます。 
 -  選択できるのは、現在開いているファイルに関する情報のみを表示するか、現在のプロジェクト全体から情報を収集するかです。 
 -  英語以外の言語のコメントが正しく表示されるようになりました。 
 
      
        
        
        
      
     開発中に、私は他のプラグイン開発者に役立つかもしれないいくつかの興味深いことを掘り下げることができました。 
      
        
        
        
      
    
      
        
        
        
      
     設定 
      
        
        
        
      
    
      
        
        
        
      
    
      
        
        
        
      
     最初にやらなければならないことは、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; 
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
 
      
        
        
        
      
     デザイナーで作成したタブウィジェットは、標準のQlistWidget、いくつかのQRadioButton、およびボタンの束(画像を参照)で複雑なものではありません。 
      
        
        
        
      
     ここで重要なのは
apply()メソッドで、設定が保存されるのはその中にあります。 
      
        
        
        
      
    
      
        
        
        
      
     次のようになります。 
      
        
        
        
      
     void SettingsPage::apply() { if (settingsStatus) { QSettings *settings = Core::ICore::instance()->settings(); 
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      
        
        
        
      
     一般に、複雑なことは何もありません。独自のデータ型を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); 
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      
        
        
        
      
     あなたが求める魔法は何ですか? 関数ヘッダーとその呼び出しで、2つのパラメーターがヘッダーで宣言され、2番目のパラメーターのみが呼び出しで渡され、最初のパラメーターは省略されることに注意してください。 最初のパラメーターは、2番目の必須ヘッダー(qtconcurrent / runextensions.h)のコードに置き換えられます。 それがすべての魔法です。 
      
        
        
        
      
    
      
        
        
        
      
     おわりに 
      
        
        
        
      
     これですべてです。 
ここからプラグイン
をダウンロードできます。BSDライセンスの下で配布されています-健康の実験。 さらに、Windowsではテストされていなかったため、テストがないため、テストとバグレポートに感謝します。